読者です 読者をやめる 読者になる 読者になる

VBAによる自動化の第一歩(補足)

VBA一般

 昨日のブログをtwitterに上げたら、早速フォロワー様からご指摘をいただいた。

 「空欄があった場合の対応がないぞ!」と。

 ははは。ホントだ。

 f:id:akashi_keirin:20170212090408j:plain
 こんな場合に、

 f:id:akashi_keirin:20170212090412j:plain
全部選択して実行すると、

 f:id:akashi_keirin:20170212090413j:plain
当然こうなるwww


Sub 様をつける3()
    Dim objCell As Range
    For Each objCell In Selection
        If objCell.Value <> "" Then                     '……(1)
            If Right(objCell.Value, 1) <> "様" Then
                objCell.Value = objCell.Value & " 様"
            End If
        End If                                          '……(2)
    Next
End Sub

 こんなコードでいかがでしょう?
 (1)に追加したのは、新しい条件。「セルの値が空白じゃなかったら」と言う意味。これで、「objCell」が空白だったら、間をすっ飛ばして(2)まで行くことになるから、「空白セルに『様』だけが入力される」というマヌケなことが回避できる。

 f:id:akashi_keirin:20170212090415j:plain
 「様をつける3」プロシージャの中にカーソルを置いて実行すると、

f:id:akashi_keirin:20170212090416j:plain
ほれ、この通り。


Sub 様をつける4()
    Dim objCell As Range
    For Each objCell In Selection
        If objCell.Value <> "" And _
           Right(objCell.Value, 1) <> "様" Then     '……(3)
            objCell.Value = objCell.Value & " 様"
        End If
    Next
End Sub

 こんな風に書いても同じ結果が得られる。「セルが空白でなく、かつ、右端が『様』でなかったら」という条件。

Sub 様をつける5()
    Dim objCell As Range
    For Each objCell In Selection
        If objCell.Value <> "" Then
            If Right(objCell.Value, 1) <> "様" Then
                objCell.Value = objCell.Value & " 様"
            End If
        Else
            objCell.Value = "氏名未記入"            '……(4)
        End If
    Next
End Sub

 上のコードでは、「様をつける3」プロシージャに(4)の部分を追加している。「else」のところは、1個目の「if」に対応していて、「さもなくば」ぐらいの意味。
 「セルが空白でないという条件にあてはまらなければ」、要するに「セルが空白だったら」、else以下を実行しなさい、ということ。よって、コレを実行すると、



f:id:akashi_keirin:20170212090417j:plain

当然こうなります。

セルを表す「Range」オブジェクト(プロパティ)には、「Value」意外にもたくさんのプロパティがあるので、条件によってセルに色をつけたり、罫線を引いたり……と工夫次第でいろんなことができる。