VBA初心者のための「DO LOOP」についての質問

このQ&Aのポイント
  • VBA初心者の方が「DO LOOP」について質問しています。具体的には、「入力画面」というシートに日付を入力してマクロ実行すると、その日付名の新しいシートが作成されるようにしたいとのことです。
  • また、新しいシートのB列に複数の名前を入力し、その名前をキーにして右隣のシートから一致する情報(N列とP列の値)を取得し、新しいシートのK列とM列に表示する作業を行いたいとのことです。
  • ただし、一致する情報がない場合はゼロを表示し、ループを終了したいとのことです。構文についての質問です。
回答を見る
  • ベストアンサー

「DO LOOP」についての質問です。VBA初心者です。

「DO LOOP」についての質問です。VBA初心者です。 昨日同じ質問をさせていただきましたが、私の質問がきちんと書かれていなかったせいで 皆様にご迷惑をおかけしてしまいましたm(_ _;)m きちんと伝わるように訂正して再度質問させていただいてます。 『入力画面』というシートに日付を入力してマクロ実行すると 『入力画面』の右隣りにその日付名のシートが新しく作られるように設定しています。 入力する日は不定期で連続した日付ではありません。 それでお聞きしたいのは、新しく作成するシートのB列に複数の名前を入力した後、 その名前をキーに右隣のシートから一つずつ検索していって、一致するものがあれば 同じ行のN列とP列の値を新しいシートのK列とM列に取得しループ終了。 もしくは全てのシートを検索しても一致するものがなければゼロ表示でループ終了。 という作業をしたいんですが、構文がどのように作ればいいのかがわかりません。 お手数ですが、どうかご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

No.1です。 添付の図の様なイメージだったんですけど何か勘違いしています? > あと、B列に空白行もある場合があるんですが、空白があるとループが終わってしまいますか? はい、サンプルはアクティブシートのB1から空白行までループを回します。 空白ありで最終行までループを回すのでしたらnNameのループの箇所を修正してください。 For nName = 1 To Range("B1").End(xlDown).Row ↓ For nName = 1 To Cells(Rows.Count, 2).End(xlUp).Row

simogumi
質問者

お礼

できました!!《*≧∀≦》 B1の箇所をB5に変えただけで出来ましたほんとーに有難うございましたm(_ _)m

その他の回答 (2)

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.2

No.1です。 > 早速試してみました。ですが、エラーメッセージ等は出ませんし > 実行も中断されている様子も無いのですが何の変動もありません。 ・サンプルマクロでは、右側にシートが無い場合は何も行いません。 ・B1から空白行のある所まで「名前」が入っているとしてみていますB1が空白では駄目です。 ・もしかして「名前」って値ではなく「名前定義」の事ですか? VBE画面でF8を押して一行づつステップ実行し、どこがおかしいのか確認してみてください。

simogumi
質問者

お礼

「名前」という値ではなく、「中村」や「田中」といった名前です。 大変失礼いたしました。 「名前」が無かったから変動が無かったかもしれませんね(ノω=;)。。。 あと、B列に空白行もある場合があるんですが、空白があるとループが終わってしまいますか? F8を押すと一行ずつ実行していくんですね。 初めて知りました。今後役立ちそうです。 有難うゴザイマス。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

こういう事でしょうか? Sub Sample()  Dim nCount, nActSheet, nName, nSheet  Dim sTargetName    nActSheet = ActiveSheet.Index  nCount = Worksheets.Count  If nCount <= nActSheet Then Exit Sub '右にシートが無ければ終了    'アクティブシートのB列の値を検査「名前」とする  For nName = 1 To Range("B1").End(xlDown).Row   sTargetName = Sheets(nActSheet).Range("B" & nName)      '右側のシートを1シートづつ検査対象シートとする   For nSheet = (nActSheet + 1) To nCount       '検査対象シートのB列に検査「名前」があるか確認     If Application.WorksheetFunction.CountIf(Worksheets(nSheet).Range("B:B"), sTargetName) > 0 Then      '「名前」があればN、P列の値をアクティブシートのK、M列に入れる      With Worksheets(nSheet)       nRow = Application.WorksheetFunction.Match(sTargetName, .Range("B:B"), 0)       Range("K" & nName) = .Range("N" & nRow)       Range("M" & nName) = .Range("P" & nRow)      End With      Exit For '1つ見つかったらその「名前」の検査は終了     End If   Next nSheet  Next nName End Sub

simogumi
質問者

お礼

回答有難うございます。 早速試してみました。ですが、エラーメッセージ等は出ませんし 実行も中断されている様子も無いのですが何の変動もありません。 キーとなる名前はコピペしたので間違ってはいないです。 頂いた文を参考時に何か抜けている所がないか自分でも勉強してみます。

関連するQ&A

  • 「DO LOOP」についての質問です。VBA初心者です。

    「DO LOOP」についての質問です。VBA初心者です。 『入力画面』というシートに日付を入力してマクロ実行すると 『入力画面』の右隣りにその日付名のシートが新しく作られるように設定しています。 入力する日は不定期で連続した日付ではありません。 それでお聞きしたいのは、新しく作成するシートから右隣に一つずつ検索していって、 一致するものがあればデータ取得でループ終了。 もしくは全てのシートを検索しても一致するものがなければゼロ表示でループ終了。 という作業をしたいんですが、構文がどのように作ればいいのかがわかりません。 自分でやってみたいのですが、締め切りも近いのでどなたか教えてください。  

  • Do..Loopステートメントの使い方について

    現在、入門書を画面で確認しながら ExcelVBAの勉強をしています。 Do...Loopで躓いてしまいました。 Do...Loopステートメントの種類は 条件を満たすまでループするもの Do Until...Loop(ループの前で条件判断) Do...Loop Until(ループの後で条件判断) 条件を満たす間はループするもの Do While...Loop(ループの前で条件判断) Do...Loop While(ループの後で条件判断) とあって、 例えば、A1からA7まで文字が入力されていて 空白のセルになるまで太文字にするとしたら、 ループの前に条件判断していると A1が空白だと処理はされず ループの後で条件判断すると A1が空白でも処理はされる とありました。 とすると、 条件判断はループ後にした方が良いと言う事なのでしょうか。 (空白でも処理してくれるので) 自分が処理したいものが ループ「後」にするのか又は ループ「前」にするのか どのように判断すれば良いのかと言うことと、 また、 条件を満たすUntil(まで)とWhile(間) どちらを使用すれば良いのかの判断方法もわかりません。 超初心者の質問内容で申し訳ありません。 VBAって面白いなぁと思い始めたところで なんとか理解したいので 教えていただけると大変助かります。 よろしくお願いします。

  • :【Excel VBA】 Do Until ~ Loop 構文で途中の空白セルを飛ばしてデータのチェックをしたい

    こんにちは。 Do Until ~ Loop 構文で 空白セルまでループして重複する値をチェックしたいと考えています。 --------------------------------------------- Sub 重複チェック() Dim 検索語 As String Dim 該当数 As Long Dim 確認 As Integer Range("A4").Activate Do Until ActiveCell.Value = "" 検索語 = ActiveCell.Value 該当数 = WorksheetFunction.CountIf(Range("A:A"), 検索語) If 該当数 >= 2 Then ActiveCell.AutoFilter Field:=1, Criteria1:=検索語 確認 = MsgBox("次を検索しますか?", vbYesNo) If 確認 = vbNo Then Exit Sub End If ActiveCell.Offset(1, 0).Activate Loop Range("A4").AutoFilter MsgBox "名前の重複チェックが終了しました。" End Sub --------------------------------------------- ただセルA列には行の途中、空白も含まれているため、 途中で止まってしまいます。 今後A列にはデータが追加されていきます。 途中の空白セルを飛ばして、 データーの最後までチェックするにはどのようにすればよいでしょうか?

  • VLOOKUP関数と同じことをVBAでおこなうには

     初めまして、当方VBAの素人です。よろしくお願いします。  同じような質問で、このようなVBAを見つけました。 Sub Macro1() For n = 2 To 5 '処理するSheet2の行数範囲 a = Sheets("Sheet2").Cells(n, 1) 'aにA列の値を代入 For m = 2 To 5 '検索するSheet1の行数範囲 If Sheets("Sheet1").Cells(m, 1) = a Then 'Sheet2のA列の値とSheet1のA列が一致した場合 v = Sheets("Sheet1").Cells(m, 2) 'vにB列の値を代入 Sheets("Sheet2").Cells(n, 2).Value = v 'Sheet2のB列に値を入力 Exit For '値が見つかったのでForを終了 End If Next Next End Sub このVBAではSheet2での検索、入力が列になるのですが、列でなく、行でできないでしょうか。できればSheet1のB列の値をSheet2の1行で検索、Sheet2の2行に入力されるだけではなく、Sheet1のC列の値をSheet3の1行で検索、Sheet3の2行に入力されるようにしたいと思います。  解る方、よろしくお願いします。

  • エクセルのVBAについて質問です。

    エクセル2003のVBAについて質問です。 複数の検索したい文字列があり、複数の検索対象セルがあります。 セルの文字列が検索文字列のいずれかと一致したセルの背景の色を変えたいです。 よろしくおねがいします。 仕事でマクロを組まなけばならなくなってしまったのですが、 初心者のため検索してみたり調べてみたり、参考にして作ってみたのですがうまくいかないばかりかどんどん解らなくなってしまいました。 どうか助けてください。 sheet1のセルが検索対象 (全セル対象でも大丈夫ですが、検索したいセルはB2→J2、B11→J11、B20→J20の範囲です)、 sheet2のA列に検索したい文字列が入力されています。 この検索したい文字列は今後増えていく可能性があるので、増えた場合にも対応できるようにと考えています。 sheet1(検索対象) あ い う え あ お お sheet2(検索文字列) あ う お け き ↑の様に入力されており、sheet1の「あ」と「う」と「お」のセルの背景を変えたいです。 色を変えたいのはsheet1です。 findメソッドや繰り返し処理などを調べて実践してみたのですが、 いきなりマクロを組めといわれた超初心者には難しく質問しています。 自分でやってみたのですが、 sheet1の最初の「あ」のみが変換され、後に出てくる「あ」が変換されません… どうしたらいいのか…どうすることも出来ず困っております。 すみませんが、どなたか優しい方助けてください。 よろしくおねがいします><

  • 【VBA】DoUntil Loopを1度のみ実行

    いつもお世話になっております。 Excel2003を使用しております。 「この条件になるまで続行」というのは Do Until Loop だと思うのですが、 ループをしたくないけれど Do Until Loop を利用したい場合(条件になったら即終了したい) Do Until Flag=True 実行したいこと 実行したいこと2 実行したいこと3 Exit do Loop また、やりたいこととしては、 FlagがTrue になったら、プロシージャから抜けたいと思っています。 その場合は、 Do Until Flag=True  実行したいこと  実行したいこと2  実行したいこと3  Exit do Loop If Flag=True Then   Exit sub End if このように、別々?に書く以外に方法はないでしょうか? 出来れば、簡単なIF文で実行できないかと思ったのですが… 話がごちゃごちゃしていて分かりにくいので、質問事項のみまとめますと、 ● 条件になったら終了させる。 これは、Do~Loop 、For Next のみの動作でしょうか? ● ループから抜けると同時にSubを終了させるには、ループの外にIF文を書くしかない? 以上、よろしくお願い致します。

  • エクセルVBAの書き方で教えてください。

    エクセルで、 「A列にデータを入力した日付をB列に自動で入れる」 (A列のデータを消したときは、B列のデータも消える)ということをするのに、 他の質問を参考にして、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then   '対象の列が1列目(A列)なら If Target.Value <> "" Then   '入力された値がブランクでなければ Target.Offset(0, 1).Value = Date   '0行ずれた(同じ行)の1列右隣に日付を入れる Else       'そうでなければ(Deleteキーで消されたら) Target.Offset(0, 1).Value = ""   '同行右隣をブランクすなわち""として消す End If      '入力された値の処理終り End If      '1列目(A列)の処理終り、従ってB列以降はチェックしない End Sub と、入力して、うまく動きました。 ところが、「A列に入力」→「B列に自動で日付」だけでなく、 「D列に入力」→「E列に自動で日付」 「H列に入力」→「I列に自動で日付」と、1つのエクセルシートの中で いくつかの同じ条件のことを繰り返そうと思うとうまくいきません。 この場合、どのようにVBAを記入したら良いのか、教えてください。 よろしくお願いします。

  • vbs Do~loop内、抜き出し条件、出力について

    VBS、素人というか事務部門なので、なじみがなく、 現在、本を見ながら勉強しております。 下記の事務処理を行いたいのですが、どなたか 申し訳ございませんが、ご教授願えませんでしょうか。(VBAにしたいのですが、excel使ってない為、VBS) 入力データは、行単位読込み。 入力データがなくなるまでloopさせてます。 if instr(xxxx,"111") = など検索文字がhitしたら 各Box(配列?)に出力し、各列、111or000~444を 1レコードとして出力させたいのですが、Do~loop の中の、抜き出し条件をどの様にしてよいのか、 (現在、行読込みで、各出力レコードに出来る222を ブレークポイントとして、取り合えず作成中…) 知りたい事 □始まりの、000or111、条件処理  (出力2レコード目無い場合が有るので) □出力3レコード目、列(4)(5)333,444繰返し処理  (再度、333,444が出てきた場合) 入力データ+++++ 111  222 333 222 333 000 222 333 444 999 333 444 ~ 出力結果イメージ(こうしたい)+++++ 列(1),列(2),列(3),列(4),列(5) 111,222,333 ,222,333 000,222,333,444,333,444 ~ 追記++++++++++ 111or000は列(1)(nohitは空白) 222は列(2) 333は列(3) 再度、出てくる333は列(4) 再度、出てくる444は列(5)

  • 【Excel】日付を条件のひとつに指定してデータ集計

    Excel2003を使用しています。 Sheet1   A    B         C 1 4/1  (株)Excel    \100 2 4/1  ACCESS    \300 3 4/1  Excel(株)    \200 4 4/2  Word       \150 5 4/2  Excel       \100 6 4/3  ACCESS(有)  \200 7 4/3  Excel       \100 7 4/3  (有)ACCESS  \100 が入力されている表があります。 Sheet2に   A    B    C 1 4/2  合計値 個数 2 4/3  合計値 個数 Sheet2のA1セルに日付(仮に4/2とします)を入力したら、Sheet1にある条件に一致する日付を検索し、尚且つ、部分一致する文字列(仮にExcelとします)を検索し、両条件に一致したC列の合計を Sheet2のB1セルに表示させる様にしたいのですが、どのようにすればいいでしょうか? 又、上記同様で Sheet2のA1セルに日付(仮に4/3とします)を入力したら、Sheet1にある条件に一致する日付を検索し、尚且つ、部分一致する文字列(仮にACCESSとします)を検索し、両条件に一致した個数を Sheet2のC2セルに表示させる様にしたいのですが、どのようにすればいいでしょうか? 関数で試してみたのですが、うまくいかなかったので、質問させていただきました。 よろしくお願いします。

  • VBA初心者です。

    VBA初心者です。 日付順に並べたいのですが、どのようにしたらいいのでしょうか。 【エクセル】日付順に別シートに並べるやり方を教えてください。 エクセルsheet1に下記の情報があります。 B(名前) C(記号) E~H(日付) 5 ばなな a 4/2 5/3 6/6 6 みかん b 4/8 5/7 6/6 7 りんご c 5/1 6/8 7/9 ・ ・ ・ ・ 下にどんどん続きます。 sheet2 (c.5)くらいから日付、名前、記号 4/2 ばなな a 4/8 みかん b 5/1 りんご c 5/3 ばなな a 5/7 みかん b 6/6 ばなな a 6/6 みかん b 6/8 りんご c 7/9 りんご c ・ ・ ・ 下に続きます。 このようにsheet2に日付順に並べつつ、横の情報もそのまま並べたいです。 (同じ日付はあります) sheet1で日付がたて1列であればできるのですが、 横にもたくさんある中からの抽出はどうしてもできませんでした。 よろしくお願いいたします。

専門家に質問してみよう