【お題】甲子園での思い出の残し方

最終行を下記の方法で取得して、CSV出力するマクロを作ってます。

lastRow = shtData.Cells(shtData.Rows.Count, 1).End(xlUp).Row

↑この処理で、A列の最終行を取得してるのですが、
A列には、「=IF(C2="","",・・・・」が入っており、集計表自体は100行まであっても、
画面上に見えてるレコードが7行だったら7レコード分だけ出力したいのですが、
100行まるまる出力されてしまいます。(セルに関数が入っているだけでカウントされてしまう)
画面に数値が表示されている最終行を取得するにはどうしたら良いでしょうか?

A 回答 (4件)

No.2さんの案(下記)に1票。


C列で最終列を取得する。
lastRow = shtData.Cells(shtData.Rows.Count, 3).End(xlUp).Row
C列に限らず、最終行にデータが入力されている列があるはず、だと思います。


代案
A列全体をコピーして最終列の右列に値で貼付けて、その列で最終行を取得する。
lastRow = shtData.Cells(shtData.Rows.Count, 貼り付けた列).End(xlUp).Row
貼り付けた列は消しても消さなくてもよいです。お好みで。
データ数にもよりますが、追加分による実行時間は0.1秒もかからないでしょう。
    • good
    • 0

こんにちは


空白行のある対象範囲を取得する時に使う AutoFilter で・・・

With shtData
.Range("A1").AutoFilter 1, "<>"
r = .Range("A1").SpecialCells(xlLastCell).Row
c = .Range("A1").SpecialCells(xlLastCell).Column
.Range("A1").AutoFilter

間に空白行の存在する可能性を踏まえて
Open fileFllPath For Output Asの場合
For i = 1 To r
If .Cells(i, 1) <> "" Then
Print #1, Application.TextJoin(",", 0, .Cells(i, 1).Resize(1, c))
End If
Next
みたいになるのかな・・

でも
If Cells(i, 1) <> "" Thenを書くならば処理速度はともかく
lastRow = shtData.Cells(shtData.Rows.Count, 1).End(xlUp).Row
でも空白行を除き出力されますね・・・

範囲にlastRowを使って設定しているのかな
AutoFilterを使って
Range("A1").AutoFilter 1, "<>"
set r=Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible)
で範囲を取得し(Copyなどで)使う方法もアリかな?
    • good
    • 0
この回答へのお礼

色んなパターンをご教授いただきありがとうございます。
今回助かりましたし、次回も試せて大変助かりました。
ありがとうございました。

お礼日時:2024/07/31 23:34

こんにちは



実際の表がどうなっているのか不明ですけれど・・

ご提示の計算式を見る限り、C列を参照しているようですので、A列ではなくC列の最終行を求めるのでは上手くいきませんか?
(C列が直接入力であろうと想像)

あるいは、表全体が関数等で作成されているという事でしょうか?
ご質問の文章通りに、「A列の空白以外の最終行」を求めたければ、No1様の回答の方法でも良いですし、どこかの空きセルに
 =MAX(INDEX((A1:A100<>"")*ROW(A1:A100),))
を入力しておけば、そのセルの値を参照することでも得ることができます。
    • good
    • 1
この回答へのお礼

なるほど。関数で最終行を出しておくって事ですね
ありがとうございます。

お礼日時:2024/07/29 14:59

100行目から上に向かって、空白("")でない行を探せば良いかと思います。

    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A