- ベストアンサー
Excelシートを複数選択するvbaについて
- Excelシートを複数選択するvbaについての質問です。
- タイトルのvbaを作成していますが、インデックスエラーが発生し、選択できません。
- シート名と配列にしたリストの型がよくないと思い、文字列に直すなどを試したがうまくいかず、どのように直したらいいかわからない状況です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No2です。 あと、シートの有無も確認してくださいね。たとえば ArrShName(i) = Cells(i, 1) の後ろに flag = False For Each ws In Worksheets If ws.Name = ArrShName(i) Then flag = True Next ws If flag = False Then MsgBox ArrShName(i) & "シートがありません", vbCritical Exit Sub End If
その他の回答 (2)
- kkkkkm
- ベストアンサー率66% (1719/2589)
Option Base 1なのでArrShNameは1から始まるので間違いないですね。 書式設定で変更した内容は.Textで取り出せますので ArrShName(i) = Cells(i, 1).Text としてください。
お礼
お礼が遅くなりすみません。 textも試してみましたがうまくいかなかったのですが、今回再度、挑戦してみたらうまくいきました。 ありがとうございました。
- kagakusuki
- ベストアンサー率51% (2610/5101)
【上手くいかない原因その1】 >シート名が6桁のため、セルの書式設定で"000000"をしています。 という事は、 A1=060002 A2=060005 A3=060088 となっているのはモニター上や印刷した紙で見た際の見かけだけの話であり、実際のデータは A1=60002 A2=60005 A3=60088 となっているという事なのですから、60002や60005、60088というシート名のシートが存在していない以上、存在していないシートを選択しようとしている事になるため、インデックスエラーになってしまいます。 ですから、Format関数などを使って6桁の数字からなる文字列データに変換する様にして下さい。 【上手くいかない原因その2】 ReDim ArrShName(1) の所で配列変数 ArrShName() には ArrShName(0)と ArrShName(1) の2個の変数が出来ているのに、 For i = 1 To 3 ReDim Preserve ArrShName(i) としているため、 ArrShName(0) = "" ArrShName(1) = "60002" ArrShName(2) = "60005" ArrShName(3) = "60088" という具合にArrShName(0) の値が "" のままとなっており、そのまま Worksheets(ArrShName).Select を実行したのでは Worksheets(Array( "","60002", "60005", "60088")).Select という処理をしようとしていることになり、シート名が "" のシートという存在していないシートを選択しようとしている事になるため、インデックスエラーになってしまいます。 ですから、ArrShName()の( )内の数値の最大値は3ではなく、「『A1~A3に入力されている値の中で"実際に存在するシート名"と同じ値を持つものの数』から1を差し引いた数」になる様にして下さい。 【その他の問題点】 もし、A1~ A3のセル範囲内に、空欄のセルや存在しないシート名が入力されいた場合には、このままではエラーとなってしまいます。 ですから、空欄のセルや存在しないシート名が入力されているセルの値が見つかった場合には、そのセルの値は配列変数ArrShName()の中には付け加えず、尚且つ配列変数ArrShName()の要素数も増やさない様にしておき、セルの値を配列変数ArrShName()の中に付け加える事や配列変数ArrShName()の要素数を増やすのは、セルに入力されている値が実在しているシート名の中の何れかと一致する場合に限る様にして下さい。 Sub Sample2() Dim Sh As Worksheet Dim ArrShName() As String Dim i As Long Dim j As Long Dim buf As Variant j = -1 For i = 0 To 2 buf = Cells(i + 1, 1).Value If buf <> "" Then buf = Format(buf, "000000") If Not IsError(Evaluate("ROW('" & buf & "'!A1)")) Then j = j + 1 ReDim Preserve ArrShName(j) ArrShName(j) = buf End If Next i If j > -1 Then Worksheets(ArrShName).Select End Sub
お礼
お礼が遅くなり申し訳ありません。 回答ありがとうございます。 うまくいかない理由、それを改善する方法、さらにコードまで記述していただきありがとうございました。 ご教示いただいたコードで思った通りのことができました。 ありがとうございました。
お礼
お礼が遅くないすみません。 NO2に引き続き、シートの有無についてご教示していただきありがとうございました。 NO2、NO3合わせて試した結果うまくできました。 ありがとうございました。
補足
ベストアンサー悩みました。 どちらの方も自分の思ったとおりのことができ、丁寧にご教示いただいたので、どちらかを選ぶのはつらいです。 リスト作成のミス防止ということを考え、今回は、シートの有無の確認で、シートが無かった場合に終了するkkkkkmさまを選ばせていただくことにしました。ありがとうございました。