may the VBA be with you

Excel VBAとか業務自動化とか

はてな記法 テーブル作成マクロの改良

はじめに

前回、

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回と指定しています。

これは下のような表を対象にしているから。

f:id:vba-belle-equipe:20160302111917p:plain


ただ、いつも表の行、列が同じとは限りません。

表の大きさが変わった時にどうするか考える、というのが今回のテーマです。

考え方

①マクロの数字を直す
②大きさに関係なく実行できるようマクロを修正する
③ユーザーに指定させる

①マクロの数字を直す

行数、列数を表の大きさにあわせて、その都度修正する方法です。

表が変わるたびに修正するなんて、いかにも原始的でめんどくさい。

最終手段としてとっておきます。

②大きさに関係なく実行できるようマクロを修正する

まずはこちらを考えましょう。

ただし、うまくいかない、効率的でないといったケースもありますので、その場合は①を選ぶこともあります。

自動的に表の大きさを取得する

さて、自動でやろうと思った時に

VBA 行数 取得」とか「VBA 最終行 取得」とか検索するわけですが、こちら ↓ のページが出てくると思います。

No.8 ワークシートの最終行、最終列を取得する


自分が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つ、残っている気がしますが、


それはまた、別の話...