- ベストアンサー
シート名をループに
質問を簡単にする為に以下のマクロがあるとします。 シート名が1~31とあるのですが、これをfor loopで 使うにはinteger等の定義が違うのでしょうか。 Sub bbb() Dim ws As Worksheet Dim 曜日 As String Dim i As Integer For Each ws In Worksheets For i = 1 To 31 If ws.Name = i Then <----------ここでエラー (コマンド) End If Next i Next End Sub
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
「シート名は文字列」ですから、どうしても >Dim i As Integer >For i = 1 To 31 を使いたいのなら、 >If ws.Name = i Then を If ws.Name = CStr(i) Then MsgBox i & "がありました" End If
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
For Eachはすべてのシートを1つずつとらえます。現存するシートの数だけのシートを繰返します。 だから、多分、そのループの中でさらにFor i = 1 To 31の繰り返しは不要なのでは? だから If ws.Name ="営業管理" &i Then にして、i=i+1にするか(初期値は i=1、またシート数を超えないようチェックが要って不便) For Each をやめて For i=1 To SheetCountのようにしては。 ーー 質問者の例ではシート名は、営業1,営業2、・・なのだろうが、新規ブックでやる場合の例で 参考例 Sub test01() MsgBox Sheets.Count i = 2 For i = 1 To Sheets.Count If Sheets(i).Name = "Sheet" & i Then MsgBox "Sheet2です" '見つかったので終わる Exit For End If Next i End Sub i は数なのだが、&で結合すると文字として扱ってくれる。 ーー If ws.Name = i Then のws.Name は文字列で i は数字ですから、比較するのはおかしい 。 VBAはデータの性格(型)は変換してくれたりしてルーズなのですが、文字列と数値は注意。
- keithin
- ベストアンサー率66% (5278/7941)
エラーが起きて止まったら,デバッグボタンをクリックしてデバッグを開始します。 「ココでエラー」が起きている行が間違いなく黄色く変わっていることを再確認します。 ローカルウィンドウやイミディエイトウィンドウを使い,いま変数wsに取得しているシートが確かに意図したシートであるか,キチンとご自分の目で確認してください。 #想定 マクロをじつは違うブックに登録していて,間違ったブックのワークシートを巡回している,とか。 ブックに隠したシートが含まれていて,その名前が「Sheet1」などになっている,とか。 じつは「シート名が1~31とある」というご説明とそもそも現実は違う,とか。(シート名とオブジェクト名を間違って理解しているご相談なども以前見かけました) #マクロの考え方から直した方がベターかもしれません。 #あまり意味はありませんがご質問のマクロを少し改良すると。。 sub macro1() dim ws as worksheet dim i as integer for each ws in worksheets for i = 1 to 31 if ws.index = i then ws.select msgbox i &"番目のシートです" end if next next end sub
- hallo-2007
- ベストアンサー率41% (888/2115)
>If ws.Name = i Then ws.Name は文字 i は 数値ですので 型が一致しません とエラーメッセージが出ていると思います。 If ws.Name = i & "" Then として iの数値を文字にしてみてください。
お礼
ありがとうございます。 If ws.Name = CStr(i) Then MsgBox i & "がありました" End If に If ws.Name = CStr(i) Then ws.select MsgBox i & "がありました" End If で意図している事ができました。大変助かりました。ありがとうございました。