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

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

このQ&Aのポイント
  • エクセルVBAでarrayを使う方法について、具体的なコードを紹介します。arrayを用いることで、複数の値をまとめて扱うことができます。
  • 通常、各シートの最終行を調べる際には、変数を設定してシートごとに最終行を取得しますが、今回はループを用いて各シートの最終行を読み込む方法を紹介しています。
  • また、他のホームページでは、arrayの( )の中に複数の値を並べて操作する方法が紹介されていますが、検索結果をarrayに読み込む場合には、( )の中に0を入れることで実現できます。

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

  • ベストアンサー
  • 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
質問者

お礼

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

その他の回答 (3)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんばんは! 横からお邪魔します。 Sheet1~Sheet3のA列最終行データを格納する一例です。 Sub test() Dim i, m As Long Dim str As String Dim myArray As Variant For m = 1 To 3 i = Worksheets(m).Cells(Rows.Count, 1).End(xlUp).Row str = str & Worksheets(m).Cells(i, 1) & "," Next m myArray = Split(Left(str, Len(str) - 1), ",") End Sub これでmyArray に3つのデータが格納されているはずです。 ※ 格納データを確認したい場合は End Sub の前に For m = 0 To 2 MsgBox myArray(m) Next m の3行を追加してみてください。 余計なお世話だったらごめんなさいね。m(_ _)m

sukeroku111
質問者

お礼

おはようございます。 わかり易い解説ありがとうございました。データの格納はすごく参考になりました。 またこれからもよろしくお願いいたします。 本当にありがとうございました。

  • mar00
  • ベストアンサー率36% (158/430)
回答No.2

Sub kk() Dim lastrow As Variant (1) lastrow = Array(0, 0, 0, 0, 0) (2) For m = 1 To 3 n = 1 Do While Sheets(m).Cells(n, 1) <> "" n = n + 1 Loop MsgBox n - 1 lastrow(m) = n - 1 (3) Next End Sub (1)~(3)はちょっとわかりませんがなくても同じ動作はすると思います。。 n=1でnの初期値を設定 Do Whileでsheet(m)のA列のセルが空白でない間Loopまでの処理(n+1)を繰り返す。 mは1番目のシートから3番目のシートに変化(For m = 1 To 3) 最後の行が空白でない時もn+1されるのでnは1多くなるのでn-1してメッセージボックスに表示します。 ただ途中に空白セルがあったりすると正しく最終行は表示されません。 >最終行の取得方法は他にもある事は理解しています。 という事ですからわかっているとは思いますが、空白セルがある場合は Sub kk2() For m = 1 To 3 MsgBox Worksheets(m).Cells(Rows.Count, 1).End(xlUp).Row Next End Sub のようにすればいいと思います。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.1

>なぜ各シートをループし、その都度ちゃんと最終行を読込んでいるのか  ⇒シートオブジェクトは、Sheets("シート名")又は、Sheets(番号)で取得できます。   ご例示のコードでは、「For m =1 To 3」によるの変数mでシート1番目~3番目を   取得する事になります。 >arrayに読込む場合の( )の中は0を入れて置けばよいのでしょうか?  ⇒設定するだけなら「0」記入は特に必要ないが、累積するような場合は「0」クリア   が必要でしょう。   

関連するQ&A

専門家に質問してみよう