ユーザーがやる一般的な操作を知らない人のマクロ?
最近、とある Q&A サイトを見ていて気になることがあります。
例えば、A1:E10 の範囲内のセルに文字を入力した場合に、先頭1文字目だけを太字にするというイベントプロシージャを書くとき、どのように書くでしょうか?
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub End If If Target.Row < 11 And Target.Column < 6 Then If IsEmpty(Target.Value) Then Target.Font.Bold = False Else If (Not Target.HasFormula) And _ (VarType(Target.Value) = vbString) Then Target.Characters(1, 1).Font.Bold = True Else Target.Font.Bold = False End If End If End If End Sub
以前の日記にも書いたけど、これは素人くさい浅はかなコードです。
初めてイベントプロシージャを書く人ならともかく、常連回答者が書くコードではないと思ってます。
Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Range For Each i In Target If i.Row < 11 And i.Column < 6 Then If IsEmpty(i.Value) Then i.Font.Bold = False Else If (Not i.HasFormula) And _ (VarType(i.Value) = vbString) Then i.Characters(1, 1).Font.Bold = True Else i.Font.Bold = False End If End If End If Next i End Sub
1番目よりははるかにマシですが、無駄なステップが実行されがちです。範囲外のセルへの入力/消去であってもループの中に入ってしまうので。
Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Range Dim rngU As Range Set rngU = Application.Intersect(Target, Me.Range("A1:E10")) If Not rngU Is Nothing Then For Each i In rngU If IsEmpty(i.Value) Then i.Font.Bold = False Else If (Not i.HasFormula) And _ (VarType(i.Value) = vbString) Then i.Characters(1, 1).Font.Bold = True Else i.Font.Bold = False End If End If Next i End If End Sub
どうも、そのサイトでは、1番目と2番目ばかり目につくんです。
※.Excel World の 2007年4月28日 00:47 の日記をコピーしています。
http://excel.sns.fc2.com/excel/