Excelシートを複数選択するvbaについて

このQ&Aのポイント
  • Excelシートを複数選択するvbaについての質問です。
  • タイトルのvbaを作成していますが、インデックスエラーが発生し、選択できません。
  • シート名と配列にしたリストの型がよくないと思い、文字列に直すなどを試したがうまくいかず、どのように直したらいいかわからない状況です。
回答を見る
  • ベストアンサー

Excelシートを複数選択するvbaについて

タイトルのvbaを作成していますが、インデックスエラーとなりうまく選択できません。 社員番号をシート名にしたシートが複数あります。 ここでは、2番目のシートから仮に060001~060100までとします。 (社員番号は6桁で整理しています。) 1番目のシートには、別途、条件に一致した社員番号リストを作成しています。 (シート名が6桁のため、セルの書式設定で"000000"をしています。) A1=060002 A2=060005 A3=060088 この社員番号リスト(A1、A2、A3)に一致するシートを別ブックにコピーするのが目的ですが、まずは、選択するところから始めたところ、インデックスエラーにより選択できません。 シート名と配列にしたリストの型がよくないと思い、文字列に直すなどを試してみましたがうまくいかず、結局どのように直していいのかわかりませんでした。 ご教示いただけないでしょうか? よろしくお願いいたします。 以下に、実行したプログラムを記載させていただきます。 Option Base 1 Sub Sample() Dim Sh As Worksheet Dim ArrShName() As String Dim i As Long ReDim ArrShName(1) For i = 1 To 3 ReDim Preserve ArrShName(i) ArrShName(i) = Cells(i, 1) Next i ' Worksheets(Array("060002", "060005", "060088")).Select Worksheets(ArrShName).Select End Sub

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.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

kayakayakaya1
質問者

お礼

お礼が遅くないすみません。 NO2に引き続き、シートの有無についてご教示していただきありがとうございました。 NO2、NO3合わせて試した結果うまくできました。 ありがとうございました。

kayakayakaya1
質問者

補足

ベストアンサー悩みました。 どちらの方も自分の思ったとおりのことができ、丁寧にご教示いただいたので、どちらかを選ぶのはつらいです。 リスト作成のミス防止ということを考え、今回は、シートの有無の確認で、シートが無かった場合に終了するkkkkkmさまを選ばせていただくことにしました。ありがとうございました。

その他の回答 (2)

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.2

Option Base 1なのでArrShNameは1から始まるので間違いないですね。 書式設定で変更した内容は.Textで取り出せますので ArrShName(i) = Cells(i, 1).Text としてください。

kayakayakaya1
質問者

お礼

お礼が遅くなりすみません。 textも試してみましたがうまくいかなかったのですが、今回再度、挑戦してみたらうまくいきました。 ありがとうございました。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.1

【上手くいかない原因その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

kayakayakaya1
質問者

お礼

お礼が遅くなり申し訳ありません。 回答ありがとうございます。 うまくいかない理由、それを改善する方法、さらにコードまで記述していただきありがとうございました。 ご教示いただいたコードで思った通りのことができました。 ありがとうございました。

関連するQ&A

  • VBA 複数シート選択について

    Sub test() Dim i As Integer i = ActiveWorkbook.Worksheets.Count Worksheets(Array(2, i)).Select End Sub シート2とシートi の選択ではなく、2~iまでの複数シート を選択するにはどのように書くのかご教示下さい。

  • EXCEL VBA 複数シート選択の方法

    エクセルVBAのシート選択方法について教えてください。 選択対象シート数は4つで、シート名は、「101」「102」「103追加工」「104」とします。 シート名「表紙」のセルは A1:101 A2:102 A3:103追加工 A4:104となっており、 使用者はB1~B4セルに「○」「×」を入力し、 「○」となっているシートのみ選択出来るようにしたい。 下記マクロの場合、シート名が全角文字だと使えるのですが、 シート名が「101」のように半角数字だけの場合コピーできません。 どこを修正すればよいのでしょうか? Sub TestSample2() Dim c As Range Dim flg As Boolean On Error Resume Next flg = True ThisWorkbook.Activate  With Worksheets("表紙")  For Each c In .Range("B1:B4")   If c.Value Like "○*" Then     Worksheets(c.Offset(, -1).Value).Select flg     flg = False   End If  Next c End With  With ActiveWindow.SelectedSheets  If .Count > 0 Then    .Copy  End If  End With  '元のシートに戻る場合  'Application.Goto ThisWorkbook.Worksheets("表紙").Range("A1") End Sub

  • エクセル VBA シート名を別シートにコピー

    早速の質問ですが エクセルVBAで シート名を別シートにコピーなのですが 10個のシートを順にシート名をコピー&ペーストしたいのです。 Dim aworkbook As Workbook Dim bworkbook As Workbook Set bworkbook = ActiveWorkbook Workbooks.Add Set aworkbook = ActiveWorkbook for i=1 to 10 bworkbook.Activate Worksheets(i).Select Application.CutCopyMode = False aworkbook.Activate Worksheets(i).Select ここに入る文章がわかりません Range("A1").Select next と以上な感じで作ってみたのですが どう貼り付けして良いかわからない状況です nextでまわす以上変数でなければだめなんでしょうけれども 構文が思いつきません。 皆様よろしくお願いいたします。

  • エクセル VBA シートの選択 

    windows XP でエクセル2000を使っています。 Sub aaa() Sheets("Sheet1").Select Dim a As String a = Cells(2, 4) Sheets(a).Select Range("A1").Select End Sub というマクロだと セルに入っている値のシート名を探してくれます。 ですが Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Intersect(Target, Range("B11:b683")) Is Nothing Then Exit Sub Worksheets("Sheet1").Range("C2").Value = Target.Value Dim b As String b = Range("C2).value (←ここをcellsにしてもダメ) Sheets(b).Select Range("A1").Select End Sub これだとsheets(b)を選びません。Sheets(b).Selectのところが黄色くなります。 何処が間違えているのでしょうか。 全くの素人ですが、仕事で必要に迫られています。 わかりやすく回答・解説くれると助かります。

  • エクセルのVBAでシート名が重なるときの処理 

    お世話になります。 エクセルのVBAにてリストボックスで選択した単語をシート名に 反映させるマクロを作成しました。 が、一度シート名を作ると2回目に同じ単語を選択すると、 デバック?画面になってしまいます。 『同じ名前のシート名は作れません・・・』 希望としては、同じ名前が出たら自動に連番が割り振られる ようなものを希望しています。 マクロの記録で確認しても、やはり同じデバック要画面がでます。 別シートにシート名を反映させて、同じ名前がヒットしたら 文字列を追加して、そのシートに反映し続ける・・・ ようなことは考えられますが、どうも不細工で気が向きません。 もっとスマートな考えがあれば教えていただきたく よろしくお願いします。 参考に作ったVBAを下記します。 これだと、途中でシートを削除してしまうと デバック画面が発生してしまいます。 (マクロの切り抜きなので、  リストで選択したものが反映されるマクロではありません) Dim シート名 As String Dim n As Integer Sheets("伝票マスター").Select Worksheets("伝票マスター").Copy before:=Worksheets("伝票マスター") n = Sheets.Count Sheets("伝票マスター (2)").Select ActiveSheet.Name = "伝票" & n - 1 Range("D2") = n - 1 Range("D1").Select 、

  • Excel 指定順にシートの並び替え VBA

    http://okwave.jp/qa/q8383406.html 以前も質問させて頂きました。 任意の順番にシートを並び替えるプログラムです。 Sub Sheet_sort_Select() Dim A As Variant, I As Integer A = Array("更新履歴", "統計", "全データ", "商品金額", "販売台数", "販売累計") For I = 0 To UBound(A) Worksheets(A(I)).Move after:=Worksheets(Worksheets.Count) Next I End Sub 上記方法で並び替えを行っています。 色んなシートから並び替えを実行するのですが、 最後に選択していたシートに戻るということは可能でしょうか? このsortをした後に、またselectなりすれば シート選択できますが、他に方法はあるのでしょうか? Excel2003を使用しています。

  • EXCEL マクロ リストボックスよりシート名を選択してシートを選択

    こんばんは. エクセルを使って備品の管理システムを構築したいと考えております. マクロを使います. VBAは初心者です. ・備品を20種類ほどに分類し,シートも同様に20作りました. ・ウィンドウを2つに分割し,上下に並べています. ・上ウィンドウの最初のシート(シート名:備品一覧)のB2セルにリストボックスを設け,そのリストで20種の備品の中から一つを選択できるようにしています. ・リストボックスの側にマクロ対応のボタンを設置しております やりたいこととしては・・・ 『上ウィンドウのリストボックスで備品を選択し,ボタンをクリックすることによって,下ウィンドウでその選択した備品名のシートに移動する』 です. 私が組んでみたマクロは下記です. ---------------- Sub 備品を選択     Dim sheetname As String 'リストボックスからシート名を取得する sheetname = Range("B2").Value '下ウィンドウをアクティブにしてシートを選択する Windows(2).Activate Worksheets("sheetname").Select End Sub ------------------ エラーは,『Worksheets("sheetname").Select』のところで 【実行値エラー'9' インデックスが有効範囲にありません.】 参考書やグーグルで調べてもわかりませんでした. ご教授いただければ幸いです. よろしくお願い致します.

  • エクセル2007 VBA シート内のデータを項目名で検索し、その列を新

    エクセル2007 VBA シート内のデータを項目名で検索し、その列を新規シートにコピーする方法についてです。 VBAについては初心者で、グーグルで調べながら作ったのですが、コピー後のペーストが上手く出来ません。どうすれば最後まで処理できるのかを教えて下さい。 それと、全体的に書き方がおかしいところがありましたら指摘・改善方法を教えて下さい。 よろしくお願いします。 Sub 配列並べ替え() Dim myArray As Variant '1項目名希望順配列格納 Dim strArray As Variant '2検索用1の配列格納 Dim LastCol1 As Long '3最終列数格納 Dim LastCol2 As Long '4新規シートの最終列数格納 Dim DefSheetname As Variant '5初期のシート名取得 Dim i As Long Dim j As Long '初期シート名を取得。 DefSheetname = ActiveSheet.Name '初期シートの最終列数取得。 LastCol1 = Worksheets(DefSheetname).Range("A1").End(xlToRight).Column 'シート名:レポートの新規シート追加。 Worksheets.Add.Name = "レポート" '初期シートを選択。 Worksheets(DefSheetname).Select '項目名希望順配列格納。 myArray = Array("得意先C", "取引先名1", "製番", "相手管理NO", "品目C", _ "製品名1", "受注数", "受注残数", "納期", "受注単価", _ "受注金額", "出荷数", "出荷金額", "出荷先名1", "郵便番号", "住所1", "TEL", "FAX") '配列要素数分繰り返し処理。 For i = LBound(myArray) To UBound(myArray) '検索用の配列(項目名)格納。 strArray = myArray(i) 'A1:LastCol1範囲で配列(項目名)検索し、番号で返す。 j = WorksheetFunction.Match(strArray, Worksheets(DefSheetname).Range(Cells(1, 1), Cells(1, LastCol1)), 0) 'シート名:レポートに変数jの列数目の値を入力。 Columns(j).Copy 'シート名:レポートの最終列数取得。 LastCol2 = Worksheets("レポート").Range("A1").End(xlToRight).Column 'シート名:レポートを選択。 Worksheets("レポート").Select Range(Cells(1, 1), Cells(1, "LastCol2")).Past Next i End Sub

  • Excel VBA 複数シートの一括印刷について

    標記の件、御指導願います。 シート1:印刷設定(チェックボックスが印刷したいシート分あります) シート2~34:チェックボックスがオンである表題のシートを選択し一括で印刷する。 を、VBAで作ってみましたが、エラー(インデックスが有効範囲にありません)が出てしまいます。 Sub CheckBoxPrint() Dim ArrySheet() As String Dim I As Long Dim k As Long k = 0 For I = 1 To 33 If ActiveSheet.OLEObjects("CheckBox" & I).Object.Value = True Then ReDim Preserve ArrySheet(k) ArrySheet(k) = ActiveSheet.DrawingObjects("CheckBox" & I).Object.Caption k = k + 1 End If Next I ThisWorkbook.Worksheets(ArrySheet).PrintOut ←エラー(インデックスが有効範囲にありません) Erase ArrySheet End Sub     このエラーを回避する方法を御指導してください。 よろしくお願い致します。

  • vba シートの選択後列の選択

    VBA初心者中の初心者です。 vbaでシート全体を選択後、全シート共通でI列全体を選択したいのですが、 Worksheets.Select Columns("i:i").Select と書くと、なぜかB列からI列全体が選択されてしまいます。 I列だけ(全シート共通)を選択したいのですが、どのようにすればよいのでしょうか? よろしくお願いいたします。

専門家に質問してみよう