- ベストアンサー
VBA初心者のための「DO LOOP」についての質問
- VBA初心者の方が「DO LOOP」について質問しています。具体的には、「入力画面」というシートに日付を入力してマクロ実行すると、その日付名の新しいシートが作成されるようにしたいとのことです。
- また、新しいシートのB列に複数の名前を入力し、その名前をキーにして右隣のシートから一致する情報(N列とP列の値)を取得し、新しいシートのK列とM列に表示する作業を行いたいとのことです。
- ただし、一致する情報がない場合はゼロを表示し、ループを終了したいとのことです。構文についての質問です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (2)
- mt2008
- ベストアンサー率52% (885/1701)
No.1です。 > 早速試してみました。ですが、エラーメッセージ等は出ませんし > 実行も中断されている様子も無いのですが何の変動もありません。 ・サンプルマクロでは、右側にシートが無い場合は何も行いません。 ・B1から空白行のある所まで「名前」が入っているとしてみていますB1が空白では駄目です。 ・もしかして「名前」って値ではなく「名前定義」の事ですか? VBE画面でF8を押して一行づつステップ実行し、どこがおかしいのか確認してみてください。
お礼
「名前」という値ではなく、「中村」や「田中」といった名前です。 大変失礼いたしました。 「名前」が無かったから変動が無かったかもしれませんね(ノω=;)。。。 あと、B列に空白行もある場合があるんですが、空白があるとループが終わってしまいますか? F8を押すと一行ずつ実行していくんですね。 初めて知りました。今後役立ちそうです。 有難うゴザイマス。
- mt2008
- ベストアンサー率52% (885/1701)
こういう事でしょうか? 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
お礼
回答有難うございます。 早速試してみました。ですが、エラーメッセージ等は出ませんし 実行も中断されている様子も無いのですが何の変動もありません。 キーとなる名前はコピペしたので間違ってはいないです。 頂いた文を参考時に何か抜けている所がないか自分でも勉強してみます。
お礼
できました!!《*≧∀≦》 B1の箇所をB5に変えただけで出来ましたほんとーに有難うございましたm(_ _)m