エクセルのVBAを書くときに指を折って数を数える不思議

最新鋭のPCの前で、プログラミングしながら、本当に指を折って数を数えるんです。ABCDE…と、数を覚え始めの幼児のように、指を折ってアルファベットを数えるんです。
今回は、A1形式とR1C1形式のお話です。VBAを使うときにどちらの形式がいいのか考えてみましょう。結論から申し上げますと、R1C1形式です。A1形式だと指を折って数を数える必要が出てきます。
Jはアルファベットの10番目とか完全に記憶していれば、A1形式でも問題ありませんが、たぶん、RZは記憶していないでしょう。指を折って数えるとしても、RZは494番目になるので、私は間違える自信があります。R1C1形式ならば、を折って数を数える必要もなく494だとわかります。

以下のような繰り返し処理をする場合を考えます。

Dim LoopI as long

For LoopI=1 to 10
  Sheet1.Cells(LoopI,1)=LoopI
Next

Sheet1のA1セルからA10セルに1から10までの数字を入れる処理です。
VBAでワークシートを扱う場合は、ワークシートを2次元配列と同じだと理解すると簡単です。逆もしかりです。2次元配列は2つの添え字で要素を指定します。つまり、R1C1形式のワークシートです。
たとえば
Dim LoopI as long
Dim LoopJ as long
Dim Counter as long

Counter=1
For LoopI=1 To 10
  For LoopJ=1 To 10
    Sheet1.Cells(LoopI,LoopJ)=Counter
    Counter=Counter+1
  Next
Next

ダブルクォーテーションでアルファベットを指定する方法も散見しますが、行列の2方向に繰り返す場合は、現実的ではないでしょう。

とはいえ、エクセルの操作をするときには、A1形式のほうが使いやすいので、普段は、A1形式にしてVBAを作成するときは、R1C1形式にしています。A1形式とR1C1形式の切り替えは、割と面倒です。「ファイル」「オプション」「数式」で「R1C1参照形式を使用する」にチェックしないといけません。こんな時にVBAでしょう。まずは、マクロの記録をしてみましょう。
Sub Macro1()
  Application.ReferenceStyle = xlR1C1
End Sub
こんなコードが記録されています。ここで、「Application.ReferenceStyle」を「MicroSoft Learn VBA」で確認すると、「セル参照と行見出しと列見出しを A1 または R1C1 参照スタイルで表示する方法を設定または返します。 XlReferenceStyle の読み取り/書き込み。」とあります。つまりこのプロパティを読み込み、A1形式の時は、R1C1形式に、R1C1形式の時には、A1形式に設定するようなVBAのコードを作成すれば便利そうです。
Sub TogglesBetweenA1R1C1()
  If Application.ReferenceStyle = xlA1 Then
    Application.ReferenceStyle = xlR1C1
  ElseIf Application.ReferenceStyle = xlR1C1 Then
    Application.ReferenceStyle = xlA1
End If
こんな感じでしょうか。「ElseIf Application.ReferenceStyle = xlR1C1 Then」の部分は、ElseだけでもOKです。これをパーソナルマクロブックに保存して、リボンに登録すれば、簡単にA1形式とR1C1形式の切り替えができます。これで、BAの作成時に指を折ってアルファベットを数えることはなくなりました。でも、実は、まだ数えるんです。「VLOOKUP(A1,G:N,5,FALSE)」のような式を書いた場合に、GHIJKと5を指を折って数えるんです。このお話は、VBAでとは直接関係がないのでまたの機会にしましょう。



「0の表示」「計算結果ではなく数式の表示」も同じような処理になりますので、あわせて作成すると便利そうです。以下のようなコードになります。

Sub TogglesBetweenDisplay0()
  If ActiveWindow.DisplayZeros = True Then
    ActiveWindow.DisplayZeros = False
  Else
    ActiveWindow.DisplayZeros = True
  End If
End Sub

Sub TogglesBetweenDisplay0()
  If ActiveWindow.DisplayFormulas = True Then
    ActiveWindow.DisplayFormulas = False
  Else
    ActiveWindow.DisplayFormulas = True
  End If
End Sub

コメント

タイトルとURLをコピーしました