はてな記法 テーブル作成マクロの改良
はじめに
前回、
vba-belle-equipe.hatenablog.com
下のようなマクロができました。
Sub makeTblTxt() Dim i As Long, j As Long Dim str As String For i = 1 To 13 str = "" For j = 1 To 3 If i = 1 Then str = str + "|*" & Cells(i, j) Else str = str + "|" & Cells(i, j) End If Next Debug.Print str & "|" Next End Sub
ちょっと改良してみましょう。
気になるところ
'縦の繰り返し For i = 1 To 13 '横の繰り返し For j = 1 To 3
繰り返しのfor文で、繰り返す回数を縦に13回、横に3回と指定しています。
これは下のような表を対象にしているから。
ただ、いつも表の行、列が同じとは限りません。
表の大きさが変わった時にどうするか考える、というのが今回のテーマです。
考え方
①マクロの数字を直す
②大きさに関係なく実行できるようマクロを修正する
③ユーザーに指定させる
①マクロの数字を直す
行数、列数を表の大きさにあわせて、その都度修正する方法です。
表が変わるたびに修正するなんて、いかにも原始的でめんどくさい。
最終手段としてとっておきます。
②大きさに関係なく実行できるようマクロを修正する
まずはこちらを考えましょう。
ただし、うまくいかない、効率的でないといったケースもありますので、その場合は①を選ぶこともあります。
自動的に表の大きさを取得する
さて、自動でやろうと思った時に
「VBA 行数 取得」とか「VBA 最終行 取得」とか検索するわけですが、こちら ↓ のページが出てくると思います。
自分がVBAを始めたばかりの頃、何度も何度もお世話になりました。
最終行の取得がそれだけよく使うテクニックだということでもあるし、それだけ自分が覚えられなかったということでもあります。
なんかよく見るなーこのキャラ → てことは...
Sub 最終行取得() Dim 覚えた As Boolean Dim 回数 As Long Do While 覚えた = False 回数 = 回数 + 1 覚えた = True Call 何かやる 覚えた = False If 回数 > 100 Then Exit Do End If Loop Debug.Print "さすがに覚えました" End Sub
こんな感じですかね。
最終行の取得
覚えたといってもページの内容を全部覚えたわけではなく、
Dim maxRow As Long maxRow = Cells(Rows.Count, 1).End(xlUp).Row
上の書き方です。
ほぼこれだけでいけると思います。
最終列の取得
最終列も同様に
Dim maxCol As Long maxCol = Cells(1, Columns.Count).End(xlToLeft).Column
を使います。
「xlLeft」ではなく「xlToLeft」なのがポイントです。
是非とも何回か引っかかって「なんでやねん」とつっこむことをお勧めします。
修正案
ということで、
Sub makeTblTxt() Dim maxRow As Long, maxCol As Long Dim i As Long, j As Long Dim str As String maxRow = Cells(Rows.Count, 1).End(xlUp).Row maxCol = Cells(1, Columns.Count).End(xlToLeft).Column For i = 1 To maxRow str = "" For j = 1 To maxCol If i = 1 Then str = str + "|*" & Cells(i, j) Else str = str + "|" & Cells(i, j) End If Next Debug.Print str & "|" Next End Sub
自動的に表の大きさにあわせてくれるようになりました。
メデタシメデタシ。
・・・・・・・・・・
何か1つ、残っている気がしますが、
それはまた、別の話...