アプリ版:「スタンプのみでお礼する」機能のリリースについて

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


最終行の取得方法は他にもある事は理解しています。よろしくお願いします。

A 回答 (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に配列の値をまとめてセットしたりする時に使うと便利です。
    • good
    • 0
この回答へのお礼

おはようございます。

ご丁寧なご回答ありがとうございました。

おかげさまで非常によく理解する事ができました。

今後ともよろしくお願いいたします。

お礼日時:2012/04/03 09:24

こんばんは!


横からお邪魔します。

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
    • good
    • 0
この回答へのお礼

おはようございます。

わかり易い解説ありがとうございました。データの格納はすごく参考になりました。

またこれからもよろしくお願いいたします。

本当にありがとうございました。

お礼日時:2012/04/03 08:21

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
のようにすればいいと思います。
    • good
    • 0

>なぜ各シートをループし、その都度ちゃんと最終行を読込んでいるのか


 ⇒シートオブジェクトは、Sheets("シート名")又は、Sheets(番号)で取得できます。
  ご例示のコードでは、「For m =1 To 3」によるの変数mでシート1番目~3番目を
  取得する事になります。

>arrayに読込む場合の( )の中は0を入れて置けばよいのでしょうか?
 ⇒設定するだけなら「0」記入は特に必要ないが、累積するような場合は「0」クリア
  が必要でしょう。
  
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!