SendKeysステートメント
SendKeys “+{F2}”
マクロでコメントを挿入した後、その場でコメントの内容をキーボードから入力できるようにしたいケースがあります。ところが、マクロには、「コメントを編集状態にする」という命令はありません。せっかくマクロでコメントを挿入しても、その内容を入力するには、いちいち「コメントの編集」メニューを選ばなければならないのでしょうか。
そんなことはありません。Excelでは、Shiftキーを押しながらF2キーを押すと、コメントを挿入して編集状態にできます。マクロで実行するときも、考え方は同じです。セルを選択した上で、SendKeysという、キーを打つのと同じ効果を持つステートメントを実行すればよいのです。
Shift+F2キーは「+{F2}」と指定します。なお、すでにコメントが挿入されているセルでこのマクロを実行すると、既存のコメントを編集状態にできます。
アクティブセルにコメントを挿入し、編集状態にする
Sub Sample1()
SendKeys “+{F2}”
End Sub
実行結果


AddCommentメソッド
セル.AddComment.Text 文字列
セルにコメントを挿入するには、セル(Rangeオブジェクト)のAddCommentメソッドを使います。ただし、すでにコメントが挿入されているセルにAddCommentメソッドを実行するとエラーになります。そこで、セルにコメントが挿入されているかどうかを事前に判定するとよいでしょう。
コメントの有無を調べるにはTypeName関数を使います。セルのCommentオブジェクトが「Comment」という文字列を返すかどうかを調べればOKです。
コメントの有無を判定した上で、なければコメントを挿入する
Sub Sample()
If TypeName(ActiveCell.Comment) <> “Comment” Then
ActiveCell.AddComment.Text “コメントを入力しました”
End If
End Sub
実行結果


Findメソッド
検索範囲.Find
セルを検索するにはFindメソッドを使います。引数Whatに検索語を指定します。
注意したいのは、「見つからなかった」ときです。Findは、検索値が見つからなかったときにNothingという特別な値を返します。返り値がNothingかどうかを判定するときは、=」演算子ではなく「Is」演算子を使います。
右のサンプルは、FoundCellというオブジェクト型の変数を用意し、検索結果を代入します。オブジェクト型の変数にオブジェクトを格納するときは、Setステートメントを使います。次に、FoundCellに代入した結果がNothingかどうかをIf文で判定し、見つかった場合だけ、セルのアドレスを表示します。
B列で「★」を検索して該当セルを表示する
Sub Sample()
Dim FoundCell As Range
Set FoundCell = Range(“B:B”).Find(What:=”★”)
If FoundCell Is Nothing Then
MsgBox “見つかりませんでした。”
Else
Msgbox FoundCell.Address & ”セルにありました。”
End If
End Sub
実行結果


SpecialCellsメソッド
セル.SpecialCells(xlCellTypeBlanks)
任意のセル範囲で空白セルだけ操作したいとき、手動では、F5キーを押して「ジャンプ」ダイアログボックスを開き、「セル選択」ボタンを押します。すると「選択オプション」画面が表示されるので、「空白セル」を選択してOKを押します。これで選択範囲中の空白セルのみを選択できます。
この選択オプションの機能に相当するのが、SpecialCellsメソッドです。引数にxlCellTypeBlanksを指定すると、空白セルを表せます。
SpecialCellsの引数となる主な定数
空白セル |
xlCellTypeBlanks |
コメント |
xlCellTypeComments |
定数 |
xlCellTypeConstants |
数式 |
xlCellTypeFormulas |
最後のセル |
xlCellTypeLastCell |
条件付き書式 |
xlCellTypeSameFormatConditions |
B2 ~ B10セルの範囲内にある空白セルに「★★★」と入力する
Sub Sample()
Range(“B2:B10”).SpecialCells(xlCellTypeBlanks) = “★★★”
End Sub
実行結果


シート.Select → セル.Select
別シートのセルは、「Sheets(”Sheet2″).Range(”B3″)」のようにシート名をピリオドでつないで表すことができます。ところが、このセルを選択状態にしようとして「Sheets(”Sheet2″).Range(”B3″).Select」のように記述するとエラーになります。
別シートのセルを選択する場合は、まずシートを選択してから、次にセルを選択する、という2段階が必要です。
別シートのセルを選択する
Sub Sample()
Sheets(“Sheet2”).Select
Range(“B3”).Select
End Sub
実行結果。まずシートを選択してから(左)、セルを選択する(右)

Offsetプロパティ
セル.Offset(行数, 列数)
あるセルから見て、相対的な位置にあるセルを操作するには、Offsetプロパティを使います。指定した行数だけ下方向に移動し、指定した列数だけ右方向に移動した位置にあるセルを表せます。
例えば、1つ下にあるセルは「Offse(t 1, 0)」となります。行数や列数にはマイナスの値も指定でき、1つ上にあるセルは「Offset(-1, 0)」となります。
B2セルから見て、2行下、1列右にあるセルに「Jam&Momo」と入力
Sub Sample()
Range(“B2”).Offset(2, 1) = “Jam&Momo”
End Sub
実行結果


Nextプロパティ/Previousプロパティ
セル.Next / セル.Previous
RangeオブジェクトのNextプロパティは、右隣のセルを返します。また、左隣のセルを返すのがPreviousプロパティです。上のセルや下のセルを返すプロパティはありませんので、上や下のセルを操作する場合には、下で紹介するOffsetプロパティなどを使います。
アクティブセルの右隣に2倍、左側に1/2の数値を入力する
Sub Sample()
ActiveCell.Next = ActiveCell.Value * 2
ActiveCell.Previous = ActiveCell.Value / 2
End Sub
実行結果


セル.Value = “”
セルが空欄かどうかを調べたいとき、「セルの値が“長さ0”であることを、どのように調べればよいのか?」などと難しく考える必要はありません。最も手っ取り早い方法は、Excelで空欄を表す「””」(ダブルクォーテーション2つ)を使って、セルの値が「””」かどうかを判定する方法です。
ただし、この方法では、数式に「””」を指定して空欄にしているセルも「空欄」と見なされます。数式も入っていない完全な空欄を判定するには、IsEmpty関数を使う方法があります。
アクティブセルが空欄かどうかを判定する
Sub Sample()
If ActiveCell.Value = “” Then
MsgBox “空欄セルです。”
Else
MsgBox “空欄セルではありません。”
End If
End Sub
実行結果

TypeName関数
TypeName(調べる対象)
セルに入力されている値が文字列かどうかを調べるには、セルの値(Valueプロパティ)をTypeName関数で調べます。
TypeName関数は、バリアント型の変数などを対象に、現在格納されているデータの形式を調べるものです。セルが数値の場合はDouble、日付の場合はDate、文字列の場合はString、エラーの場合はErrorなどを返します。
そこで、TypeName関数の結果がStringかどうかを調べれば、セルの値が文字列かどうかを判定できます。If文を使って判定すればよいでしょう。
アクティブセルが文字列かどうかを判定する
Sub Sample()
If TypeName(ActiveCell.Value) = “String” Then
MsgBox “文字列です。”
Else
MsgBox “文字列ではありません。”
End If
End Sub
実行結果


IsDate関数
IsDate(調べる対象)
セルに入っている値が日付かどうかを調べるには、IsDate関数を使います。セルにシリアル値が入っていて、日付の表示形式が設定されているとき、IsDate関数はTrueを返します。
また、セルに「2014年1月15日」のような文字列が入力されていても、その文字列をExcelが日付と認識できる場合、IsDate関数はTrueを返します。
アクティブセルが日付かどうかを判定する
Sub Sample()
If IsDate(ActiveCell.Value) Then
MsgBox “日付です。”
Else
MsgBox “日付ではありません。”
End If
End Sub
実行結果

