- ベストアンサー
VBA初心者のためのDO LOOPに関する質問
- VBA初心者ですが、「DO LOOP」に関する質問です。入力画面に日付を入力してマクロを実行すると、その日付名のシートが新しく作られます。新しいシートから一つずつ検索していって、一致するものがあればデータを取得してループを終了し、一致するものがなければゼロを表示してループを終了したいと思っています。構文がわからず困っています。質問の内容についてご教示いただければと思います。
- VBA初心者です。DO LOOPについて質問です。入力画面に日付を入力し、その日付名のシートを新しく作成するマクロを実行したいと考えています。その後、新しいシートから一つずつ検索していって、一致するものがあればデータを取得してループを終了し、一致するものがなければゼロを表示してループを終了したいです。どのような構文を使用すれば良いでしょうか?ご教示いただけますと幸いです。
- VBAの初心者です。DO LOOPに関して質問があります。入力画面に日付を入力し、その日付名のシートを新しく作成するマクロを作成したいです。さらに、新しいシートから一つずつ検索していって、一致するものがあればデータを取得してループを終了し、一致するものがなければゼロを表示してループを終了したいです。構文についてよくわからないので、教えていただけますか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
シート名は取得できてますか? http://www.asahi-net.or.jp/~zn3y-ngi/YNxv202.html#3 こちらにVBAが詳しく出てます。 For~Next でチェックをかけ、その中でフラグを立てます。 例: Dim flg flg = "見つからない" For i = 1 To シート数 If 日付 = シート名 Then flg = "見つかった!" Exit For End If Next If flg = "見つかった!" Then '見つかったときの処理 Else '見つからなかったときの処理 End If こんな感じになります。
その他の回答 (6)
- mar00
- ベストアンサー率36% (158/430)
たびたびすいません。#5です。 Sub Macro1() シートが新しく作られる処理 On Error GoTo Line シート名変更の処理 以下の処理 Exit Sub Line: MsgBox "同じ日付があります。" '以下は新しくできたシートを削除する処理です。 '新しく作られるシートが2番目にある場合です。 Application.DisplayAlerts = False Sheets(2).Delete Application.DisplayAlerts = False End Sub
お礼
誠に申し訳ありません。 私の質問の書き方が悪かったみたいでm(_ _;)m シート名の検索ではなく、新しく作られたシートのB列に名前を複数入力後 その名前をキーに以前のシートを新しい方の日付から順に検索していって 同行のN列とP列の値を取得したかったのです。 せっかく何度も回答していただいたのに本当に申し訳ないです。 でも、頂いた文をちゃんと勉強して、今後に役立てたいと思ってます。 有難うございました。
- mar00
- ベストアンサー率36% (158/430)
#5です。 シートが新しく作られる処理のところは シートの名前を変更する処理でした。
- mar00
- ベストアンサー率36% (158/430)
私も初心者に近い方ですが 同じ名前のシートは作れないはずなので、そもそもエラーになるのでは? エラー時の処理をしておけば済むと思います。 Sub Macro1() On Error GoTo Line シートが新しく作られる処理 以下の処理 Exit Sub Line: MsgBox "同じ日付があります。" End Sub で良いかと思います。 間違ってたらすいません。
- keithin
- ベストアンサー率66% (5278/7941)
sub macro1() dim s as worksheet for each s in worksheets if s.name = "目的の名前" then msgbox "あります" exit sub end if next msgbox "ありませんでした" end sub sub macro2() dim i as long for i = 1 to worksheets.count if worksheets(i).name = "目的の名前" then msgbox "ありました" exit sub end if next i msgbox "なかったです" end sub sub macro3() dim i as long i = 0 do i = i + 1 if worksheets(i).name = "目的の名前" then msgbox "見つかりました" exit sub end if loop until i = workshsets.count msgbox "無い" end sub
お礼
誠に申し訳ありません。 私の質問の書き方が悪かったみたいでm(_ _;)m シート名の検索ではなく、新しく作られたシートのB列に名前を複数入力後 その名前をキーに以前のシートを新しい方の日付から順に検索していって 同行のN列とP列の値を取得したかったのです。 せっかく回答していただいたのに本当に申し訳ないです。 でも、頂いた文をちゃんと勉強して、今後に役立てたいと思ってます。 有難うございました。
- ASIMOV
- ベストアンサー率41% (982/2351)
書き忘れました(^_^;) 3行目 fl = 0: sp = 3 の「sp = 3」は検索を始めるシート番号です 適当に「3」としてしまいましたが、調整してください
- ASIMOV
- ベストアンサー率41% (982/2351)
シート名の重複をチェックするという意味なら こんな感じでどうでしょう ------------------------------------- Sub Mc1() sc = Worksheets.Count fl = 0: sp = 3 stnm = "3月11日" '検索するシートの名前 Do If stnm <> Worksheets(sp).Name Then sp = sp + 1 Else fl = 1 Exit Do End If Loop Until sc < sp If fl = 0 Then MsgBox "一致するシートなし" Else MsgBox sp & " 番目のシートと一致" End If End Sub -------------------------
お礼
誠に申し訳ありません。 私の質問の書き方が悪かったみたいでm(_ _;)m シート名の検索ではなく、新しく作られたシートのB列に名前を複数入力後 その名前をキーに以前のシートを新しい方の日付から順に検索していって 同行のN列とP列の値を取得したかったのです。 せっかく回答していただいたのに本当に申し訳ないです。 でも、頂いた文をちゃんと勉強して、今後に役立てたいと思ってます。 有難うございました。
お礼
誠に申し訳ありません。 私の質問の書き方が悪かったみたいでm(_ _;)m シート名の検索ではなく、新しく作られたシートのB列に名前を複数入力後 その名前をキーに以前のシートを新しい方の日付から順に検索していって 同行のN列とP列の値を取得したかったのです。 せっかく回答していただいたのに本当に申し訳ないです。 でも、頂いた文をちゃんと勉強して、今後に役立てたいと思ってます。 有難うございました。