[[20200520131438]] 『表の最終行確認』(noa) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『表の最終行確認』(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列じゃなくてB列で最終行を調べればよいとおもいますが、それではダメなのですか?

>罫線等書式なしの表になった場合、"D"列の最終行が空欄になると、
Endプロパティを使って調べる場合、セルの書式は関係なかったとおもいます。

※検索(Findメソッド)を使えば、"B:D列の中で一番下"を調べることはできるんですが、説明が難しいのでB列を見れば問題解決するなら、そちらを勧めようとおもっています。

(もこな2 ) 2020/05/20(水) 14:07


もこな2様

いつもありがとうございます。
(セルの書式は関係ないのですか?罫線入れたら動きが変わったような気が
 していたのですが、何か勘違いしてますね)

そうなのです、すべて確実に入っている列があればいいのですが、
上記の例でいくと(可能性は低いですが)果物の種類がわからんのでとりあえず空欄にした、
ということもあり、どこが抜けるか分からないので…
でも、簡単に「この範囲の一番下」という形ではいけそうにないのですね。
(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


もこな2様

返信いただいていたのに気づきませんでした。
いつもありがとうございます。

作業前に元データに空欄が無いことを確かめる!という形でごまかしつつやっていましたが、これでいけそうです。
アプローチ1が私にとってはわかりやすかったので、ひとまずこれを覚えます。
同じ結果になっても元の表データの作りによっては別のやりかたが必要ですね。
例示していただいて助かりました。他の2例もメモしておきます。

(noa) 2020/05/28(木) 14:44


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.