arrayの使い方についてご教授をお願いします。
以下の記述はワークシートが3枚あり、それぞれの最終行を調べ、arrayに読み込んでいます。いつもは変数を3つ設定しシート毎に各変数にセットしているのですが、以下の簡単な記述を知る機会があり勉強をしています。なぜ各シートをループし、その都度ちゃんと最終行を読込んでいるのか教えて頂きたいと思います。
また他のホームページで解説等を見ると、最初からarrayの( )の中に複数の文字等が並んでおり、それを取出す使い方が書いてありますが、このように検索結果をarrayに読込む場合の( )の中は0を入れて置けばよいのでしょうか?
初心者のため、わかりずらい文で申し訳ありません。エクセル2000を使用しています。
Sub kk()
Dim lastrow As Variant
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
MsgBox n - 1
lastrow(m) = n - 1
Next
End Sub
最終行の取得方法は他にもある事は理解しています。よろしくお願いします。
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に配列の値をまとめてセットしたりする時に使うと便利です。
おはようございます。
ご丁寧なご回答ありがとうございました。
おかげさまで非常によく理解する事ができました。
今後ともよろしくお願いいたします。
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
おはようございます。
わかり易い解説ありがとうございました。データの格納はすごく参考になりました。
またこれからもよろしくお願いいたします。
本当にありがとうございました。
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
のようにすればいいと思います。
No.1
- 回答日時:
>なぜ各シートをループし、その都度ちゃんと最終行を読込んでいるのか
⇒シートオブジェクトは、Sheets("シート名")又は、Sheets(番号)で取得できます。
ご例示のコードでは、「For m =1 To 3」によるの変数mでシート1番目~3番目を
取得する事になります。
>arrayに読込む場合の( )の中は0を入れて置けばよいのでしょうか?
⇒設定するだけなら「0」記入は特に必要ないが、累積するような場合は「0」クリア
が必要でしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/03/02 08:40
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/08 09:08
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/03/07 14:05
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/06/01 14:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
VB.NETの配列にExcelから読み込...
-
エクセルでXY座標に並べられた...
-
Redim とEraseの違いは?
-
配列の中の最大値とそのインデ...
-
テキストボックの文字を一行ず...
-
VB6のメモリ解放に関して
-
C#でbyte配列から画像を表示さ...
-
Excel2010のinputboxで複数デー...
-
構造体配列内の文字列検索のよ...
-
vba フィルター 複数条件 3つ以...
-
free()関数の多用 と Segment...
-
2次元配列のソート
-
VBAのワークシート関数で配列の...
-
Dir関数で読み取り順を操作でき...
-
ASPで配列を作る方法
-
excel vbaの配列なんですが・・・
-
配列の中から最大値だけ取り出...
-
大量の変数を定義するにはどう...
-
グラフの「項目軸ラベルに使用...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
Excel2010のinputboxで複数デー...
-
エクセルでXY座標に並べられた...
-
構造体配列の特定のメンバーをF...
-
定数配列の書き方
-
コンボボックスのインデックス...
-
OutOfMemoryExceptionの回避策...
-
Dir関数で読み取り順を操作でき...
-
CheckBoxの配列化
-
構造体配列内の文字列検索のよ...
-
COBOLの基本的な事なので...
-
Redim とEraseの違いは?
-
VBAで配列引数を値渡しできない...
-
2次元配列の初期値
-
配列の中の最大値とそのインデ...
-
大量の変数を定義するにはどう...
-
VB6からの移行したいけど、VB.N...
-
VB6のメモリ解放に関して
おすすめ情報