• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセル VBA arrayについて)

エクセルVBAでarrayの使い方を学ぶ

end-uの回答

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.4

Sub kk()   Dim lastrow As Variant   Dim m As Long   Dim n As Long   lastrow = Array(0, 0, 0, 0, 0)   For m = 1 To 3     n = 1     Do While Sheets(m).Cells(n, 1) <> ""       n = n + 1     Loop     lastrow(m) = n - 1   Next Stop 'Stopステートメント End Sub 上記 Sub kk() を実行すると Stopステートメント で中断します。 VBE画面で[Alt][v][s]。 [ローカルウィンドウ]が表示されます。 [ローカルウィンドウ]は変数の中身を確認するのに便利なツールです。  + lastrow の表示の+をクリックすると内容を展開できます。 lastrow(0) 0 lastrow(1) ?? lastrow(2) ?? lastrow(3) ?? lastrow(4) 0 これで1次元の配列変数lastrowの1要素目に 0、2要素目に??、(略)5要素目に0、 が入っている事がわかります。 最初に Dim lastrow As Variant 変数lastrowをVariant型で宣言しています。 Variant型は何でもはいりますから lastrow = Array(0, 0, 0, 0, 0) この時に要素が5つの1次元配列を代入してます。 各シートの最終行を格納する配列変数を準備してるわけですね。 この処理は必要なのでしょうか。 以下試してみてください。 Sub ll()   Dim lastrow(1 To 3) As Long   Dim m As Long Stop '※1   For m = 1 To 3     lastrow(m) = Sheets(m).Cells(Rows.Count, 1).End(xlUp).Row   Next Stop End Sub 最初の※1で(0,0,0)の配列が準備できています。 Dim lastrow(1 To 3) As Long で 「Array関数による初期値0の配列の準備」と同じ事ができます。 また、 Sub mm()   Dim lastrow() As Long   Dim n As Long   Dim i As Long      n = Worksheets.Count   ReDim lastrow(1 To n) Stop   For i = 1 To n     lastrow(i) = Worksheets(i).Cells(Rows.Count, 1).End(xlUp).Row   Next Stop End Sub このようにWorksheets.Countに対応する要素数の配列を設定する事もできます。 なので、Array関数を使うより、最初に「ある要素数の配列を準備」すると 初期値に何もはいっていない配列(容れ物)として使う事ができます。 #Long型の配列は初期値は 0 で #Variant型の配列は初期値は Empty になります。 Array関数は、例えば Sub nn()   Range("A1").Resize(, 5).Value = Array(2, 4, 6, 8, 10) End Sub このようにセル範囲に配列の値をまとめて入力したり、 ListBoxやComboBoxに配列の値をまとめてセットしたりする時に使うと便利です。

sukeroku111
質問者

お礼

おはようございます。 ご丁寧なご回答ありがとうございました。 おかげさまで非常によく理解する事ができました。 今後ともよろしくお願いいたします。

関連するQ&A

  • EXCEL VBAで Arrayの使い方が判りません

    あらかじめ、セル上にシート名を入れておき、 Arrayでシートを指定したいのですが、 うまく行きません 内容 Sub Macro2()    'Cells(2, 2) に 「"Sheet1","Sheet3","Sheet6"」   と入力されています   Dim hani As String   Dim hani2 As Variant   hani = Cells(2, 2)    hani2 = Array(hani) '下記がエラーになります   Sheets(hani2).Select   Sheets(hani2).Copy '以下略 End Sub 1)セル上にあらかじめ、配列の中身を入力しておく 2)その値を取得後、arrayでシートを指定する この2件はどうしても避けられないのです

  • vba エクセル

    2行目から、最終行までEmptyにしたいのにならないです。 1行目はフィールド行なのに、そのままにしたいのですが 2行目から最終行は空白にしたいです。 なので Sub TEST() With Sheets("log") lastRow = .Cells(.Rows.Count, "b").End(xlUp).Row LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column .Range(.Cells(2, LastCol), .Cells(lastRow, LastCol)) = Empty End With End Sub としたのですが、何も起こりません。 lastRowは100、LastColは5なのですが、 このマクロを実行しても何も起こらないです。 なぜでしょうか?

  • エクセルのマクロ(Arrayの使い方)について困っています

    複数のシートを印刷する場合、現状は以下でおこなっているが  For S = 1 To Range("N5") SheetName$ = Range("N5").Offset(S, 0) Worksheets(SheetName$).PrintOut Next これを印刷コマンドを1回で複数枚のシートを指定して実行したい:その理由はプリンターの機能で1枚のシートに2枚分を縮小印刷するなど である。  Sheets(Array("Sheet1", "Sheet2", "")).Select SelectedSheets.PrintOut みたいにしたいが、シート名を変数として指定、枚数も変数扱いで実行させるための方法がわからない。 Arrayの()内を変数にして""(ダブルクォーテーションマーク)で括った文字列をカンマ区切りして1つの変数とするにはどのようにすればマクロが成立するのか誰か教えてください

  • VBA 最終行を選んだシートにコピーする。

    VBAど初心者です。どうしても最終行のデータを選んだシートにコピーできません。 LastRow.Selectのところで、止まってしまいます。どのように行を設定していいのかさっぱりわかりません。どなたか、ご指導のほどよろしくお願いします。 Sub copy_last_line() Dim LastRow As Long Sheets("Sheet1").Select LastRow = Cells(Rows.Count, 1).End(xlUp).Row LastRow.Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("A1").Select End Sub

  • VBAでのエラーです・・。

    最近VBAマクロを本を片手に勉強しています。シートを選択するVBAを作っていて次のような記述ができないのか考えています。 dim A as String A = "sheet2,sheet3" Sheets(Array(A)).select とやると、Arrayの行で「インデックスが・・・」というエラーで落ちます。Arrayを変数で指定することができないのですが・・。なにか記述に問題があるのでしょうか?(変数Aに"sheet2", "sheet3"と値が入るようにしても結果はNGでした・・。) 宜しくお願いします。

  • エクセルVBAでシートコピー

    Sheets("Sheet1")をCopyして、現在の最終のシートの後に持っていき、それを変数wsに設定しようとしています。 Sub TEST01() Sheets("Sheet1").Copy After:=Sheets(Sheets.Count) Set ws = Sheets(Sheets.Count) MsgBox ws.Name End Sub これで通常はうまくいきますが、最終シートが非表示になっているとwsはその非表示のシートが指定され、Sheets("Sheet1")をCopyしたものでなくなってしまいます。 Sheets("Sheet1")をCopyして、現在の最初のシートの前に持っていき、それを変数に設定しようとしています。 Sub TEST02() Sheets("Sheet1").Copy Before:=Sheets(1) Set ws = Sheets(1) MsgBox ws.Name End Sub これで通常はうまくいきますが、最初のシートが非表示になっているとwsはその非表示のシートが指定され、Sheets("Sheet1")をCopyしたものでなくなってしまいます。 Set ws = ActiveSheet で設定できましたが、それ以外の方法はないでしょうか?

  • ExcelのVBAにおけるLastRowという言葉

     ExcelのVBAにおいて、「最終行」即ち「(その列において)データが存在しているセルの中で最も下にあるセルの行番号」を取得する必要が生じる事が良くあります。  その様な場合には、Cells(Rows.Count,列番号).End(xlUp).Row か Range(列番号 & Rows.Count).End(xlUp).Row を用いて取得するのが主流ですが、多くの場合、最終行の行番号のデータが必要になるたびに取得しなおすのではなく、最初に取得した最終行の行番号を変数に格納しておき、最終行の行番号のデータが必要な場合はその変数を使って最終行の行番号を指定するのが普通です。  その様な最終行の値を格納する変数を使用する場合、私個人の場合は「何に使用するための変数であるのかという事を解りやすい変数名を用いる」という観点から、「LastRow」という変数名を好んで用いております。  この「LastRow」という変数名はあくまでそのVBAマクロ内だけで使用されるその場限りのものに過ぎない筈です。  しかし、このサイトのExcelのVBAに関する質問を眺めていると、例えば Range(”○○")からLastRowまで ○○セルからLastRowまで といった具合に、「LastRow」という言葉があたかも「『最終行の行番号』や『最終行のセル』を表す"一般名詞"」であるかの様に使用されている質問を時々見かける事があります。  これが「last row」であれば「最後の行」という意味の英語の言葉になりますから間違いとは言えません。  それに対し「LastRow」という単語は少なくとも英語には存在しません。  それにもかかわらず、「LastRow」という言葉が前述の様な一般名詞として使われているという事は、ExcelのVBAにおいて「LastRow」という言葉は、Excelのワークシートを使った処理における「作業列」などと同様のテクニカルタームになっているという事なのでしょうか?

  • エクセルVBAについて

    こんにちは。エクセルVBAを勉強して間もない初心者です。現在、作っているものがありますが、分からなくなってしまったのでご指導をお願いいたします。エクセル2000を使用しています。 《Sheets構成》 Sheets(1)とsheets(5)があります。※Sheets(2)~Sheets(4)はここでは省略します。 Sheets(1)には、Range(cells(19,2),cells(49,8))に、ランダムに商品CDが入力されています。 Sheets(5)には、Range(cells(7,2),cells(31,2))に商品CDが入力されています。 《やりたい事》 Sheets(1)に入力されている商品CDが、Sheets(5)にも入力されているかチェックし、もしSheets(5)に入力されていればSheets(1)の商品CDが入力されているセルに、"○"を表示させ、入力されていなければ、空白にしたいと考えています。 そのため、自分なりにマクロを作成してみましたが、どうしても空白にする事ができませんので、詳しい方のご指導を頂ければと思います。 《作成したマクロ・・・(変数の宣言はここでは省略させて頂きます)》 sub 商品CDチェック() For n = 2 To 8      'Sheets(1)B列~H列の変数 For m = 19 To 49  'Sheets(1)商品CDが入っている行  mm = 7        'Sheets(5)の商品CDが入っている行 Do         'Sheets(1)とsheets(5)の商品CDのチェック If Sheets(1).Cells(m, n).Value = Sheets(5).Cells(mm, 2).Value Then Sheets(1).Cells(m, n).Value = "○"     'Sheets(5)に商品CDが入力されていれば○ End If mm = mm + 1 Loop Until Sheets(5).Cells(mm, 2) = "" Next m Next n 《その他》 調べたところ、検索するにはFindメソッドを使用するような事が書いてあるものも見つけましたが、使い方がわかりません。もし、上記のマクロを作りたい時はFindを使ったほうが良い場合は、Findを使ったマクロも教えて頂けると、非常に参考になります。 よろしくお願いいたします。

  • エクセル VBA SHeetの隠し

    エクセルマクロでThisWorkbookの 記述に下記のようにしました! つまりSheet2を隠す為にしました! Sheet2はマスターなのでそこを使用者に 触らせないように!と思いしましたが・・・ いざ、ファイルを開くと{マクロを有効にする} をクリックしすと{編集の為にロックされています} と表示され読み取り専用になってしまいます! 記述が間違っているのでしょうか? しかもファイルを閉じるとエラー表示され エラーを報告を送信しますか?と必ず表示されます! 他のファイルは問題なく開いたり閉じたり出来ます。 やはり、記述の問題なのでしょうか? 教えて下さい! Private Sub Workbook_Activate() Dim Msg As String, Sn As Variant Sheets("入力").Visible = True Sheets("Sheet2").Visible = False Sheets("グラフ").Visible = True Sheets("入力").Activate UserForm1.Hide End Sub

  • Excel VBAの不可解(?)な動作について

    Excel 2000 VBAでの質問です。 Sheet1に以下のようなコードを書きました。 --------------------------------------------------------- Public Sub test() Application.DisplayAlerts = False Sheets("Sheet2").Copy After:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = "test" Sheets("test").Visible = xlVeryHidden Sheets("Sheet3").Visible = xlVeryHidden Sheets("test").Visible = True Sheets("test").Delete Sheets("Sheet2").Copy After:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = "test" '問題の行 Application.DisplayAlerts = True End Sub --------------------------------------------------------- このコードで期待している動作は、最終的にSheet3(xlVeryHiddenになっている)の後ろにSheet2をコピーし、その名前を「test」にするというものです。 しかし、実際にはSheet3の後ろにSheet2がコピーされるものの、名前はSheet2が「test」と変更されてしまいます。 Sheets.Countの値はSheet3をさしているはずなのですが・・・。 皆様に教えていただきたいのは、 ・この意図しない動作がなぜ起こるか ・どうすればこの問題を回避できるか です。よろしくお願いいたします。 もし初歩ミスでしたら、申し訳ありません・・・。ご指摘ください。