プロが教える店舗&オフィスのセキュリティ対策術

エクセルです。

・最終行は毎回違ってくるので
Cells(Rows.Count, "A").End(xlUp).Row
で取得したいです。
・今は最終行が51行という前提で作業をしています。
・1行目にはタイトルが入っています。
・2行目以降には文字が入っています。
 今回はテストのため数字を入れました。

最終行が51の場合は

************************************************
Sub test1()
Dim i As Long
Dim cnt As Long

For i = 1 To 10
Call test2
Next

End Sub
--------------------
Sub test2()
Dim str As String

If cnt = 0 Or cnt = 42 Then
cnt = 2
ElseIf cnt = 2 Then
cnt = cnt + 10
ElseIf cnt = 12 Then
cnt = cnt + 10
ElseIf cnt = 22 Then
cnt = cnt + 10
ElseIf cnt = 32 Then
cnt = cnt + 10
End If

With Sheets("Sheet1")
For myRow = cnt To cnt + 9
str = str & "," & .Cells(myRow, 1)
Next myRow
End With

Debug.Print str

End Sub
************************************************

このような方法で、str に10個ずつセルの値を格納できるのですが
最終行が不明の場合はどうすればいいのでしょうか?

イミディエイトウインドウに表示される値は
,1,2,3,4,5,6,7,8,9,10
,11,12,13,14,15,16,17,18,19,20
,21,22,23,24,25,26,27,28,29,30
,31,32,33,34,35,36,37,38,39,40
,41,42,43,44,45,46,47,48,49,50
,1,2,3,4,5,6,7,8,9,10
,11,12,13,14,15,16,17,18,19,20
,21,22,23,24,25,26,27,28,29,30
,31,32,33,34,35,36,37,38,39,40
,41,42,43,44,45,46,47,48,49,50
です。

最終行まで来たらまた2行目から取得しなおします。
なのでIf cnt = 0 Or cnt = 42 Thenにしました。
最終行が60だったり65だったりした場合は、strに10個格納できないですが、少ない分には問題ないです。

これで、最終行が100でも200でも対応できるコードを作りたいのですが
わかりません。

お知恵を拝借願います。

「最終行がわからない場合」の質問画像

A 回答 (4件)

.End(xlUp).



で最終行を求めようとしますと、「現時点で実際に値が入力されている最終行」よりも下の行に、
「過去において値が入力された事はあるものの、その後、値が削除されて、現在は空欄となっているセル」や「ワークシート関数によって空欄が表示されているセル」等があった場合には、
求められる最終行の行番号が、「現時点で実際に値が入力されている最終行」の行番号ではなく、「過去の最終行」のそれとなってしまう場合があります。
 ですから、最終行を求める場合には、Match関数を応用する方法の方が宜しいかと思います。


 今仮に、「数値が入力されている最終行の行番号」の値を表す変数をLRとしますと、次の様なやり方で変数LR定義してから、変数LRを使用してセル範囲や、繰り返し処理の回数を記述すれば良いかと思います。

Dim LR As Long
If Application.WorksheetFunction.Count(Columns("A:A")) = 0 Then Exit Sub
LR = Application.WorksheetFunction.Match(9E+307, Columns("A:A"))


 因みに、「数値が入力されている最終行の行番号」ではなく、「文字列データが入力されている最終行の行番号」を求める場合には、以下の様なやり方となります。

Dim LR As Long
If Application.WorksheetFunction.CountIf(Columns("A:A"), "*?") = 0 Then Exit Sub
LR = Application.WorksheetFunction.Match("*?", Columns("A:A"), -1)
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/04/12 23:12

No.2です!


投稿後に気づきました。
内容はほとんどNo.1さんと一緒になっていました。
どうもごめんなさい。

尚、前回のコード内の
>Debug.Print str
の行を
>Debug.Print Left(str, Len(str) - 1)
に変更すれば、余計なカンマは表示されないと思います。

何度も失礼しました。m(_ _)m
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/04/12 23:12

こんばんは!


一例です。

Sub Sample1()
Dim i As Long, cnt As Long, str As String
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row Step 10
For cnt = 0 To 9
If Cells(i + cnt, 1) <> "" Then
str = str & Cells(i + cnt, 1) & ","
End If
Next cnt
Debug.Print str
str = ""
Next i
End Sub

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/04/12 23:12

やり口はアイデア次第で様々ですが、ふつーに二重ループさせるだけで十分に見えます。



例:簡単のためとちゅーに空白セルが無い場合
sub macro1()
 dim r1 as long
 dim r2 as long
 dim res as string

 for r1 = 2 to cells(rows.count, "A").end(xlup).row step 10
  res = ""
  for r2 = 0 to 9
   if cells(r1 + r2, "A") = "" then exit for
   res = res & "," & cells(r1 + r2, "A")
  next r2
  res = mid(res, 2, 9999)
  debug.print res
 next r1
end sub
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/04/12 23:12

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