[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『表の最終行確認』(noa)
空欄を含む一覧表の最終行を確認したいです。
見出し行に入っているB1を、見出しを除くA列にすべて入れたい。
下記表、B1の「果物」をA3〜6に入れるための作業です。
A B C D
1見出し 果物 5月
2見出し 種類 個数 産地
3 果物 みかん 愛媛
4 果物 りんご 5
5 果物 みかん 2 熊本
6 果物 なし 長野
sub test()
さいご as long
さいご=cells(rows.count,"D").end(xlup).row range("B1").copy range("A3:A"&さいご).pastespecial
end sub
現在は表に罫線を入れているので"D"でなくても動くのですが、
罫線等書式なしの表になった場合、"D"列の最終行が空欄になると、
上の方法では最終行が拾えていません。
B:D列の中で一番下に何か入っているところを取れるようにしたい。
どうすればよいでしょうか?
< 使用 Excel:Excel2019、使用 OS:Windows10 >
>罫線等書式なしの表になった場合、"D"列の最終行が空欄になると、
Endプロパティを使って調べる場合、セルの書式は関係なかったとおもいます。
※検索(Findメソッド)を使えば、"B:D列の中で一番下"を調べることはできるんですが、説明が難しいのでB列を見れば問題解決するなら、そちらを勧めようとおもっています。
(もこな2 ) 2020/05/20(水) 14:07
いつもありがとうございます。
(セルの書式は関係ないのですか?罫線入れたら動きが変わったような気が
していたのですが、何か勘違いしてますね)
そうなのです、すべて確実に入っている列があればいいのですが、
上記の例でいくと(可能性は低いですが)果物の種類がわからんのでとりあえず空欄にした、
ということもあり、どこが抜けるか分からないので…
でも、簡単に「この範囲の一番下」という形ではいけそうにないのですね。
(noa) 2020/05/20(水) 14:18
>でも、簡単に「この範囲の一番下」という形ではいけそうにないのですね。
Sub test()
'A1セルを含む表の範囲の With ActiveSheet.Range("A1").CurrentRegion '行数プラス1の行のA列のセルへ転記 .Cells(.Rows.Count + 1, "A").Value = .Range("B1").Value End With End Sub
こういうことですかね?
参考URL>>
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html
(まっつわん) 2020/05/20(水) 14:40
ありがとうございます。
こういうこと…ではなかったのですが、表の形を変えればこれでもいけそうです。
(実際はE列以降も右に繰り返して表が入っているので)
current regionですね。とても便利そうです。覚えておきます。
(noa) 2020/05/20(水) 15:43
__A____B________C______D______E____ 1 2 見出し 果物 5月 3 見出し 種類 個数 産地 4 みかん 愛媛 5 りんご 5 6 みかん 2 7 なし
下記のようにいくつかアプローチはあるとおもいます。
■アプローチ1
B〜D列までを巡回して、それぞれの行でEndプロパティを用いて最大行を調べて、そのうち最大行が最終行とみなす
※数式で""にしている場合、無視させることはできない
■アプローチ1
B3〜からD列最大行の中で、何か入っているセルがあればそこを最終行とする
■アプローチ3
一旦表範囲を取得して、最後の行のセルの行番号を取得して最終行とする
※罫線などセルの書式も表としてみなされる
Sub アプローチ1() Dim 列 As Long Dim buf As Long
For 列 = 3 To 5 buf = WorksheetFunction.Max(Cells(Rows.Count, 列).End(xlUp).Row, buf) Next
MsgBox "最終行は " & buf & " 行目です" End Sub '--------------------------------------------------------------------------------------- Sub アプローチ2() Dim MyRNG As Range
Set MyRNG = Range("C4", Cells(Rows.Count, "E")).Find(What:="*", LookIn:=xlValues, LookAt:=xlPart, SearchDirection:=xlPrevious)
If MyRNG Is Nothing Then MsgBox "有効データなし" Else MsgBox "最終行は " & MyRNG.Row & " 行目です" End If
End Sub '--------------------------------------------------------------------------------------- Sub アプローチ3() With Range("B2").CurrentRegion MsgBox "最終行は " & .Cells(.Rows.Count, 1).Row & " 行目です" End With End Sub
最終行さえわかっちゃえば、わざわざコピペしないでも↓のようにもできますよね。
Sub てすと() Const さいご As Long = 10 Range("A3:A" & さいご).Value = Range("B1") End Sub
(もこな2 ) 2020/05/20(水) 23:08
返信いただいていたのに気づきませんでした。
いつもありがとうございます。
作業前に元データに空欄が無いことを確かめる!という形でごまかしつつやっていましたが、これでいけそうです。
アプローチ1が私にとってはわかりやすかったので、ひとまずこれを覚えます。
同じ結果になっても元の表データの作りによっては別のやりかたが必要ですね。
例示していただいて助かりました。他の2例もメモしておきます。
(noa) 2020/05/28(木) 14:44
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.