①
セルに入力する
Valueプロパティ
object.Value = Variant objectは対象となるRangeオブジェクト、variantはセルの値
ExcelVBAでは、差往査対象のセルを的確に指定できなければ、マクロは作成できない。まずは基本操作。
セルはRangeオブジェクトで表されます。
VBAでRangeオブジェクトを特定するには、いろいろな方法がありますが、基本的には、RangeプロパティとCellプロパティを使う。
Rnageプロパティは続く括弧の中に文字列形式でセルのアドレスを指定します。。Cellsプロパティは括弧内に行と列を数値で指定する。
例えば下記のように。
Range(“A1”)
Cells(2, 2)
セル内に入力されているデータはValueプロパティで表されます。セルA1にデータを代入するには、「Range(“A1”).Value = “マクロ”」のようにする。
1 2 3 4 |
Sub sample() Range("A1").Value = "マクロ" Cells(2, 2) = Range("A1") End Sub |
ValueプロパティはRangeオブジェクトの標準プロパティなので、Valueプロパティを省略するとValueプロパティが指定されたものとみなされる。
②セルのデータを取得する
object.Value/object.text object=対象となるRangeオブジェクト
セル(rangeオブジェクト)に入力されているデータは、Valueプロパティで表されます。したがってセルのデータを取得するとき、一般的には、Valueプロパティを使います。セルに入力されているデータを取得するとき、一般的にはValueプロパティを使います。セルに入力されているデータを取得する場合はそれでいいのですが、もし、セルに表示形式が設定されていて、セルに表示されている状態を知りたいときは、Valueプロパティではいけない。そんなときは、textプロパティを使う。
textプロパティはセルに表示されている文字列を返すプロパティです。表示形式が繁栄された結果を取得することができる。
textプロパティは読み取り専用。textプロパティに任意の値を設定することはできないので注意
1 2 3 4 |
Sub sample() MsgBox Range("A1").Value MsgBox Range("A1").Text End Sub |
③セルのシリアル値を取得する
object.Value2 object = 対象となるRangeオブジェクト
セルに入力されているデータはValueプロパティで取得できる。ではセルに日付が入力されている場合は、どうか。
セルに日付を入力すると、そのセルには、「シリアル値」という特別な数値が入力される。シリアル値は1900年1月1日を「1」として、以降1日で1ずつ増加する連続した数値。
例えば2010年8月16日のシリアル値は「40406」です。
セルに日付を入力すると、実際にはセルにこのシリアル値(連続した数値)が入力される。ただし、同時にExcelが日付の表示形式を設定するので、ユーザーはシリアル値の存在を意識することはない。では、VBAでセルに入力されているシリアル値を取得するにはどうしたらいいか。
Valueプロパティでは2010/8/16のような形式が返ってきます。こんなときは、Value2プロパティを使いましょう。
Value2プロパティはセルに入力されているシリアル値を返すプロパティです。
1 2 3 4 |
Sub sample3() MsgBox Range("A1").Value MsgBox Range("A1").Value2 End Sub |
④セルをコピーする
object.Copy Destination:=object object= 対象となるRageオブジェクト
セルのコピーをマクロ記録すると、次のようなコードが記憶されます。
実際の操作がこのように記録されることから、セルをコピーするときは、この4行が必要だと勘違いしているユーザーがとても多いようです。マクロ記録は、実際に行った操作を忠実に記録してくれますが、決して最適化されたコードを生成するわけではない。マクロ記録によって、Copyメソッドがセルをコピーする命令だと分かったら、ヘルプを見てみる。
Copyメソッドには貼り付け先を指定できると記載されている。それが引数Destinationです。セルのコピーは1行で済みますし、直接貼り付け先を指定できるのでアクティブシートが頻繁に切り替わることもない。
実行速度が速く、ソースコードも短くなる、良いことずくめ。
1 2 3 |
Sub sample4() Range("A1").Copy Destination:=Range("B1") End Sub |
Copyメソッドの引数はDestinationの一つなので引数を省略することもできる。
1 2 3 |
Sub samle5() Range("A1").Copy Range("B1") End Sub |
⑤セルの値だけをコピーする
object.Value = object.Value object= 対象となるRageオブジェクト
セルをコピーするには、Copyメソッドを使う。Copyメソッドを使うと、セルに入力されているデータだけではなく、セルに設定した書式や表示形式なども一緒にコピーされる。書式や表示形式は必要なく、セル内のデータだけを別のセルに代入したいときは、どうしたらいいか。Excelには「形式を選択して貼り付け」という機能がある。この中の「値だけを貼り付ける」というオプションを使う手もある。これには、PasteSpecialメソッドを使う。
これだと複雑になるため。簡単な方法でセルの値だけを別のセルにコピーすることができる。セルの値を別のセルに代入するわけ。
Range(“A1”) = Range(“B1”) のようなシンプルな方法で実現可能。
セル(Rangeオブジェクト)はValueプロパティを省略するとValueプロパティが指定されたものとみなされる。ただ、複数セル間でセルの値をコピーするときは、次のようにValueプロパティを指定しなければならない。
A1の値をB1に代入するので、右辺にA1を指定しないといけないことに注意です。
1 2 3 |
Sub sample5() Range("B1").Value = Range("A1").Value End Sub |
⑥セルに数式を代入する
object.Formula = objform object= 対象となるRageオブジェクト objform=A1形式の数式
セルに数式を代入する操作をマクロ記録すると、次のようなコードが生成される。
これはアクティブセルをセルA4において
「=SUM(A1:A3)」という数式を代入した所です。生成されたコードでは、見慣れない「=SUM(R[-3]C:R[-1]C)」という数式が記録されています。
代入しているプロパティは「R1C1形式」の数式を受け取るFormulaR1C1プロパティです。これは業と列を相対的な位置関係で表すR1C1形式の数式です。Excelは標準で、セルの一を、A列、B列、2行目3行目、、、など固定された位置で管理するA1形式が適用されていますが、オプションでR1C1形式に切り替えることも可能。
マクロで数式を代入したいのであれば、いつも使い慣れているA1形式の数式をセルに代入すればいいのです。代入するプロパティはValueプロパティでかまいません。
Excelは戦闘が「=」で始まる文字列はすべて数式である。と認識してくれるので正しく数式が入力される。
1 2 3 |
Sub sample6() Range("A4") = "=SUM(A1:A3)" End Sub |
⑦セルの数式を取得する
object.Formula = objform object= 対象となるRageオブジェクト objform=A1形式の数式
セルに数式を代入するときは「=」で始まる数式を、セルのValueプロパティに代入します。Excelでは。「=」で始まる文字列は、全て数式として認識してくれます。
ではセルに入力されている数式を取得するにはどうしたらいいでしょう。
Valueプロパティはセルに入力されているデータを表すプロパティですが、セルに数式が入力されている場合は、数式の計算結果を返します。
せるに入力されている数式は、Formulaプロパティで取得できます。もし、セルに数式が入力されていないとき、Formulaプロパティはセルに入力されている値を返します。
1 2 3 4 5 6 7 |
Sub sample7() Dim buf As String buf = AciveCell.Formula If InStr(buf, "A1:A3") > 0 Then ActiveCell.Formula = Replace(buf, "A1:A3", "B1:B3") End If End Sub |
※オブジェクトが必要とエラー
1.変数の宣言
VBA変数の宣言には「Dim」を利用します。変数名と同時に型も宣言します。
Dim 変数名 As データ型
2.「Dim」の意味
本題ですが、Dimは「Dimension」の略のようです。
Dimensionは「次元」という意味があります。また「寸法、容積」といった意味もあります。
InStr
VBAである文字列の中に指定の文字列が含まれているか検索したい場合、InStr関数を使用します。
buf
中間処理などで一時的に格納するときなど。「緩衝器」を表す英単語Bufferの略
Dim buf As String
buf = Range(“A1”)
tmp
一時的に使用する変数など。「仮の」を表す英単語Temporaryの略
Dim tmp As Variant
tmp = Split(buf, “,”)
if tmp(1) = “” Then Exit Sub
⑧セルに表示形式を設定する
object.NumberFormatLocal = string object= 対象となるRageオブジェクト string =表示形式
セルに表示形式を設定するには、セル(Rangeオブジェクト)のNumberFormatLocalプロパティに書式記号を設定します。書式記号とは、「セルの書式設定」ダイアログボックスの表示形式タブでユーザー定義するときに使用する記号です。例えば、セルA1に数値が入力されているとして、これに¥1,234のような¥記号と3桁カンマを設定するには以下のように記載します。
1 2 3 |
Sub sample8() Range("A1").NumberFormatLocal = "\#,###" End Sub |
※セルの表示形式を表すプロパティには、NumberFormatとNumberFormatLocalの2つがあります。NumberFormatプロパティは多国語言語のExcelでも同じように動作するプロパティです。一方のNumberFormatLocalプロパティは現在マクロを作成している言語に依存するプロパティです。上記の「¥」は日本では円を表す記号ですが、他の言語では別の意味でつかわれているかもしれません。そこで¥を日本語の円記号として使うとき、NumberFormatLocalプロパティを使う。
⑨別のシートのセルを選択する
object.Goto Reference object= 対象となるApplicationオブジェクト Reference = 移動先のRangeオブジェクト
アクティブシートではないセルを、いきなりSelectプロパティやActivateプロパティで選択しようとするとエラーになる。
この原因はセルをSelectやActivateするときは、選択したいセルがアクティブシートでなければいけないため。したがって、次のように2行で書けば問題ない。
Sheets(“Sheet2”).Select
Range(“A1″).Select
しかしSelectプロパティやActivateプロパティではない命令を使えば、アクティブではないシートのセルをいきなり選択することもできます。その命令は、ApplicationオブジェクトのGotoメソッドです。GotoメソッドはSelectやActivateと同じように、アクティブセルを移動する動きをしますが、アクティブシートではないセルを指定することも可能です。
1 2 3 |
Sub sample9() Application.Goto Sheets("sheet2").Range("A1:A3") End Sub |
⑩結合セルを操作する
object.Merge object.MergeArea
object.MergeCells object.UnMerge object= 対象となるRangeオブジェクト
セルを結合するには、結合したいセル範囲に対してMergeメソッドを実行します。セルの結合を解除するときは、Unmargeメソッドを実行します。結合を解除するときは、結合されているセル範囲全体を指定する必要はなく、結合しているセルのうち、どれか1つに対してUnMergeメソッドを実行することで結合を解除できます。
任意のセルが結合されているかどうかは、MergeCellsプロパティで判定できます。MergeCellsは、そのセルが結合されている(結合セルの一部である)ときは、Trueを返します。また結合されているセル範囲の大きさはMergeAreaプロパティでわかる。
1 2 3 4 5 6 7 8 9 10 |
Sub sample10() Dim i As Long, msg As String Range("B2:C3").Merge msg = "結合: " & Range("B2").MergeArea.Address & vbCrLf For i = 1 To 4 msg = msg & Cells(i, 2).MergeCells & vbCrLf Next i MsgBox msg Range("B2").UnMerge End Sub |
⑪セルが数値かどうか判定する
IsNumeric(Expression) Expression=調べる変数や式
セルに入力されているデータが数値かどうかを判定するには、IsNumeric関数を使います。IsNumeric関数は引数が数値のときTrueを返します。
下の画面
A1 数値
A2 文字列
A3 日付(シリアル値)
A4 時刻(シリアル値)
A5 数式(=IF(A1>100,”big”,”small”))
セルA1の数値がTrueとなるのは当然ですが、セルA3の日付がFalseと判定されることに留意してください。日付の実態はシリアル値という連続した数値です。しかし、そのセルに日付の表示形式が設定されているとIsNumericは純粋な数値ではないと判定します。
一方、同じシリアル値であっても、セルに時刻の表示形式が設定されているときは、IsNumeric関数がTrueを返します。セルに数式が入力されている場合は、数式の計算結果が数値どうかで判定されます。
セルA1~A5のデータが数値であるかを判定。
数値の場合はTrueと表示される。
1 2 3 4 5 6 7 8 9 10 |
Sub sample11() Dim i As Long For i = 1 To 5 If IsNumeric(Cells(i, 1)) Then Cells(i, 2) = True Else Cells(i, 2) = False End If Next i End Sub |
整数 :Long
小数 :Double
文字列:Strng
その他:Variant
for 構文
Dim 変数 As Integer
For 変数=初期値 To 最大値
~繰り返し処理を記述~
Next 変数
⑫セルの日付かどうか判定する
IsDate(Expression) Expression=調べる変数や式
セルに入力されているデータが日付かどうかを判定するには、IsDate関数を使います。IsDate関数は引数が日付のときTrueを返します。
下の画面
A1 数値
A2 日付(シリアル値)
A3 時刻(シリアル値)
A4 数式(=IF(A1>100,”2010/5/22″,””))
A5 数式(=IF(=DATE(2010,5,22))
1 2 3 4 5 6 7 8 9 10 |
Sub sample12() Dim i As Long For i = 1 To 5 If IsDate(Cells(i, 1)) Then Cells(i, 2) = True Else Cells(i, 2) = False End If Next i End Sub |
セルA1~A5のデータが日付であるかを判定。
日付の場合はTrue
⑬セルが文字列かどうか判定する
TypeName(varname) varname= 対象となるバリアント型変数
セルが数値かどうかを判定するには IsNumeric関数で判定します。ではセルが文字列かどうかを判定するにはどうしたらいいでしょう。文字列かどうかを判定するIsString関数はVBAには存在しない。そんなときはTypeName関数を使うことになる。
TypeName関数はどんな値でも格納できるバリアント型変数に現在格納されているデータの形式を調べる関数。このTypeName関数うにセルの値を渡すと、その形式を判別することが可能です。
セルのデータが数式のときはDoubleという文字列を返す。セルのデータがシリアル値の場合は、日付の表示形式が設定されているとDate、時刻の表示形式が設定されているとDoubleを返します。セルのデータが文字列の時はStringを返すので、これでセルが文字列かどうかを判定可能。またセルの数式がエラーになっていると、TypeName関数はErrorを返します。
1 2 3 4 5 6 |
Sub sample13() Dim i As Long For i = 1 To 5 Cells(i, 2) = TypeName(Cells(i, 1).Value) Next i End Sub |
⑭セルにフリガナを設定する
object.SetPhonetic
object.Characters(start,Length).PhoneticCharacters object = 対象となるオブジェクト Start = 指定文字の開始位置 Length=参照する文字数
Excelにはセルの文字列にフリガナを設定できます。このフリガナには、セルに文字列を入力するとき、キーボードから入力した漢字変換前の読みが設定されます。したがって他のアプリケーションからコピーした文字列やあマクロで代入した文字列などにはフリガナが設定されない。
セルの文字列にフリガナを設定するには、SetPhoneticメソッドを使います。
SetPhoneticはセル内に入力されている漢字に対して、最も標準的な読みと思われるフリガナを自動的に設定します。この読みはMS-IMEの辞書から調べます。ただし、つか合われる地所はユーザーが変換した結果を学習する一般的な辞書ではなく、MS-IMEが内部で使用する隠し辞書。学習は反映されない。
SetPhoneticはセル内の文字列に対して、一括で標準的な読みをフリガナに設定する便利な機能ですが、文字単位に任意のフリガナを設定することも可能。
そのときはCharactersプロパティを使って、何文字目から何文字分と文字列を指定し、PhoneticCharactersプロパティに任意のフリガナを指定します。たとえば1文字目から2文字分の文字列に対して「スガノ」というフリガナを設定するにはサンプルの5行目のようにする。
1 2 3 4 5 6 |
Sub sample14() Range("A1") = "田中" Range("A2") = "菅野" Range("A1").SetPhonetic Range("A2").Characters(1, 2).PhoneticCharacters = "スガノ" End Sub |
※フリガナが表示されない
⑮行や列全体を削除する
object.Delete
object.EntireRow.Delete object=対象となるRangeオブジェクト
行全体を削除するにはどうしたらいいでしょう。わからないときはマクロ記録です。ここでは6~8行目を削除するとします。まず、行番号6~8をドラッグして、6~8行名全体が削除できました。
記録されるのは次のようなコードです。その状態で右クリックして「削除」を実行します。これで6~8行目全体が削除できました。記録されるのは次のようなコードです。
Rows(“6:8”).Select
Selection.Delete Shift:=xlup
まとめると Rows(“6:8”).Dleteになる。削除したあとシフトする方向を指定している引数Shiftは省略しました。引数Shiftを省略すると、Excelが最も適切と判断した方向にシフトしてくれる。さえ、このコードを使って、任意の行を削除するにはRows(“6:8”).Dleteの6:8を変更。しかしこのように行の番号で指定するのではなく、普段使い慣れているRangeやCellsを使って削除することも可能。それにはEntireRowプロパティを使います。EntireRowプロパティはRange(“A1”).EntireRowのように使ってセルA1を含む行全体を表す。
1 2 3 4 |
Sub sample15() Rows("6:8").Delete Range("A6:A8").EntireRow.Delete End Sub |
6行目から8行目を削除
セル範囲A6:A8を削除
⑯セルのデータをクリアする
object.ClearContents object = 対象となるRangeオブジェクト
セルに設定した書式はそのまま残し、入力したデータだけをクリアするのは簡単です。マクロ記録すればわかるように、ClearFormatsメソッドはセルに設定されている書式だけをクリアし、Clearメソッドは書式とデータの両方をクリアします。
このように、セルのデータだけをクリアするにはClearContentsメソッドを使えばいいのですが、実はもっと簡単な方法がある。それはRange(“A2”) = “” のようにセルに空欄””を代入します。セルのデータをクリアするということは、セル内が空欄になるということなので、空欄を代入するのと、ClearContentsは同じ結果になる。
1 2 3 4 |
Sub sample16() Range("A2:A7").ClearContents Range("B2:D7") = "" End Sub |
セル範囲A2:A7をクリア
セル範囲B2:D7に空欄を代入
⑰セルの書式をコピーする
object.PasteSpecial
object.NumberFormat = object.NumberFormat object= 対象となるRangeオブジェクト
セルに¥記号や3桁カンマなどの表示形式が設定されていたとします。この表示形式を別のセルにコピーする方法を考えてみましょう。
まず思いつくのは「形式」を選択して貼り付けの書式によるコピーです。マクロ記録すると次のようなコードが生成されます。
range(“B1”).PasteSpecial Paste:=xlPasteFormats
PasteSpecialメソッドは形式を選択して貼り付けを実行する命令です。なおここでは書式以外の引数は割愛しました。
もちろん、この方法で表示形式をこぴーすることができますが、実はもっと簡単な方法もあります。それは表示形式をあらわすNumberFormatプロパティを代入する方法です。NumberFormatプロパティは取得も設定も可能です。したがって、セルA2のNumberFormatプロパティをセルB2に代入すれば、それは表示形式をコピーしたのと同じ結果になる。
1 2 3 4 5 6 |
Sub sample17() Range("A1").Copy Range("B1").PasteSpecial Paste:=xlPasteFormats Application.cutcopmode = False Range("B2").NumberFormat = Range("A2").NumberFormat End Sub |
⑱セルに格子罫線を引く
object.Borders.LuneStyle = xlContinuous
セルに罫線を引く操作をマクロ記録すると、目を疑うほど膨大なコードが生成されます。たかが罫線をひくだけなのに、どうして大量のコードが必要なのでしょうか。セルの罫線は、手動で設定するときにわかるように、セルの4辺を別々に設定できる。また複数のセル範囲を対象にする場合は、セル範囲の外枠と内側が区別されます。さらにセル内には2種類の斜め罫線を引くことができます。
このように、セルの罫線は多くのパーツから構成されているので、マクロ記録ではそのすべてが設定されたものとして記録されてしまう。
セルの罫線はBorderオブジェクトで表せられ、その集合体がBordersコレクションです。例えば、セルの右側の罫線はBorders(xlEdgeRight)のように指定します。
このBordersコレクションは括弧内でどの罫線であるかを指定しないと。、セルの4辺の罫線を返すという特徴があります。
したがって、セルに格子の罫線を引くなら次の1行で済みます。
Range(“A2:C4”).Borders.LineStyle = xlContinuous
罫線の設定には、
LineStyleプロパティ:罫線の種類
Weightプロパティ:罫線の太さ
ColorIndexプロパティ:罫線の色
を設定できますが、このうち必ず設定しなければならないのはLineStyleプロパティだけです。標準の太さと標準の色で罫線を引くのなら、設定を省略することができます。
1 2 3 |
Sub sample18() Range("A2:C4").Borders.LineStyle = xlContinuous End Sub |
セル範囲A2:C4に格子罫線を設定
「xl○○」を定数
⑲セルの外枠罫線を引く
object.BorderAround Weight
セルに格子の罫線を引くには、次のようにします。
Range(“A2:C4”).Borders.LineStyle = xlContinuous
マクロ記録で生成される膨大なコードは必要ない。罫線(Boderオブジェクトの集合体であるBordersコレクションはセル4辺のうちどの罫線かを指定しないと4辺罫線のすべてを返すという特徴があるから。
では格子罫線の次によく使う外枠罫線を引くときにはどうでしょう。Bodersコレクションでは4辺の罫線すべてが引かれてしまうので、外枠だけを指定することはできません。ここはやはり、膨大なコードに頼るしかないのか。いえ。
ほとんど知られていませんが、セル(Rangeオブジェクトには外枠罫線を引く専用の命令があります。それがBorderAroundメソッドです。
1 2 3 |
Sub sample19() Range("A2:C4").BorderAround Weight:=xlMedium End Sub |
⑳大文字と小文字を区別しない
セルのデータを比較するときは、等しいかどうか判定する比較演算子=を使います。例えばセルA1の文字列がExcelかどうかは if range(“A1”) = “excel” thenのように判定します。
これで正しく判定できるのですが、セルにEXCELと大文字で入力されていると等しくないと判断されます。しかし時には、大文字と小文字を区別しないで判定したい場合もあります。ExcelやEXCEL、excelなどすべて同じであると判定したいケースです。
そんなときは発想を変えてみる。入力されている文字列をそのまま比較するのではなく、大文字に変換してその結果をEXCELと比較します。文字列を大文字に変換するのは、Ucase関数を使います。
こうした処理はファイルの拡張子を判定するようなケースでも役に立つ。Excelの拡張子であるxlsxやxlsmなどは、一般的に
If Right(FileName, 4) = “xlsx” then
のように判定できます。
If UCase(Right(FileName, 4)) = “XLSX” then
と大文字に変換してから比較すると間違いありません。なお文字列を小文字に変換するには、LCase関数を使う。
1 2 3 4 5 6 7 |
Sub sample20() If UCase(Range("A1")) = "EXCEL" Then MsgBox "OK" Else MsgBox "NG" End If End Sub |
㉑セルを検索する
object.Find(what)
object–対象となるRangeオブジェクト、what–検索内容
セルの検索をマクロ記憶すると、例えば次のようなコードが生成される。
Cells.find(what:=”田中”).Activate
引数Whatは検索語です。実際にはもっとたくさんの引数が記録されていますが、ここでは割愛します。このコードは全セルから「田中」を探して、そのセルをアクティブにしなさい。という意味です。しかしマクロから検索を行うとき、検索語が必ず見つかるとは限りません。
もし検索語が見つからなかった時は、サンプルはエラーになります。見つからなかったセルをActivateすることはできないからです。マクロでセルを検索するときは見つからなかった場合を想定しなければならない。それにはFindメソッドの結果を変数に格納します。見つかった場合、Findメソッドはセル(Rangeオブジェクト)を返すので、受け取る変数の型は、Range型がいいでしょう。変数に格納するとき、Setステートメントをつけるのを忘れないでください。
Dim FoundCell As Range
set FoundCell = Range(“A:A”).Find(what:=”田中”)
検索に成功するとFindメソッドは見つかったセル(Rangeオブジェクト)を返します。返されるセルが変数に格納されるので、その変数を使って次の処理を行います。もし検索に失敗すると(見つからないと)、FindメソッドはNothingという特別な結果を返します。したがって、Findメソッドをじっこうした後で、変数がNothingかどうかを判定しましょう。そのとき「FoundCell = Nothing」と=で比較することはできない。Nothingというのは、どこも参照していないという特別な状態だから。
If FoundCell Is Nothing Then
のようにlsキーワードを使う。
1 2 3 4 5 6 7 8 9 |
sub Sample21() Dim FoundCell As Range Set FoundCell = Range("A:A").Find(what:= "田中") If FoundCell ls Nothing Then MsgBox "見つかりません" Else MsgBox FoundCell.Address End if End Sub |
Findステートメントは、検索して見つかったRrangeオブジェクトを返します。オブジェクトを格納するオブジェクト型変数は、代入するときにSetステートメントを付けなければなりません。オブジェクト型変数ではない、一般的な変数の場合は「変数名=値」と何もつけずに代入できますが、正確には、Let 変数名 = 値とLetステートメントを使います。。ただし、Letステートメントは省略できるので、一般的にLetステートメントは使われません。
22.右隣のセルを参照する
object.Next
object.Previous
object.Offset(RowOffset,ColumnOffset)
あるセルから見て、右隣のセルを参照するにはどうしたらいいでしょう。例えば、A列に名前、B列に数値が入力されていたとします。A列から任意の名前を検索して、見つかった行のB列を参照するとします。このような相対的な位置を参照するときは、Offsetプロパティを使うのがセオリーです。例えば、セルA1から見て1列右のセルは、Range(“A1”).Offset(0,1)のようにあらわされます。
Offsetプロパティを使うと、相対的な位置にあるセルを参照できるので便利です。ただし、参照するセルが必ず右隣であるなら、もう少し簡単な方法もある。それはNextプロパティです。Nextプロパティはタブキーを押したときにアクティブセルが移動する先のセルを返すプロパティです。一般的な保護されていないワークシートではタブキーを押すと右隣のセルにアクティブセルが移動します。なおShift+Tabを押したときにアクティブセルが移動する左隣のセルはPreviosプロパティで取得できる。
23.列の幅を設定する
object.EntireColumn.AutoFit、object.ColumnWidth = single
列の幅を自動調整するには、AutoFitメソッドを実行します。この操作をマクロ記録すると、Columns(“A:C”).EntireColumn.AutoFitのようにEntireColumnプロパティが記録されますが、実際には必要ありません。EntireColumnプロパティはあるセルが存在する列全体を表しています。もちろん、対象となる列を、RangeやCellsなどで特定するときは、Range(“A1:C1″).EntireColumn.AutoFitのように指定します。
列の幅を任意の数値に設定するときは、ColumnWidthプロパティを使います。ColumnWidthプロパティに設定する数値は、標準フォントの文字がセルになんもじ表示できるかといった文字数です。列幅の単位は、標準スタイルの1文字分の幅に相当します。プロポーショナルフォントでは、数字の0の幅が列幅の単位になります。
1 2 3 4 5 6 7 |
Sub sample23() Columns("A:B").AutoFit 'A列B列の列幅を自動調整 Columns("A:A").ColumnWidth = Columns("A:A").ColumnWidth + 1 'A列列幅を1文字分増やす End Sub |
24.数式がエラーかどうかを判定する
IsError(Expression)
object.Formula
セルに入力した数式がエラーかどうかを判定してみましょう。VBAには任意の数式や値がエラーかどうかを調べるIsError関数があります。一般的にはVBA内でなんらかのエラーを調べる時に使用しますが、このIsError関数は、セル内の数式がエラーになっているかどうかも判定できます。
1 2 3 4 5 6 7 8 |
Sub sample23() If IsError(Range("A1").Value) Then MsgBox Range("A1").Formula & vbCrLf & " はエラーです" 'A1 の数式がエラーの場合は数式を表示 End If End Sub |
25.数式が入力されているかどうか判定する
object.HasFormula
object.HasArray
セルに数式が入力されているかどうかは、セル(Rangeオブジェクト)のHasFormulaプロパティで判定できます。HasFormulaプロパティは、セルに数式が入力されているときTrueを返します。入力されている数式が配列数式かどうかを判定するには、HasArrayプロパティを使います。配列数式とは、数式内で複数のセルを配列として参照するような数式です。
セルに数式を入力して、確定するときは、Ctrl+shift+Enterキーを押します。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub sample25() If ActiveCell.HasFormula Then 'アクティブセルに数式が入力されているか判定 If ActiveCell.HasArray Then '数式が配列数式か判定 MsgBox "配列数式が入力されています" Else MsgBox "普通の数式が入っています" End If Else MsgBox "数式が入力されていません" End If End Sub |
26.数式が参照しているセルを調べる
object.Precedents
セルに数式が入力されているとき、その数式がどのセルを参照しているのか調べてみましょう。あるセルが別のセルを参照している時、その参照先セルはPrecedentsプロパティで知ることができます。Precedentsプロパティは参照先のセル(Rangeオブジェクト0を返します。例えば、セルA1に=SUM(B1:B3)という数式が入力されているとき、セルA1のPrecedentsプロパティは、Range(B1:B3)と返します。さらに例えばセルB1がセルC1を参照している様なケースでは、セルA1のPrecedents プロパティが、Range(B1:B3,C1)を返します。つまり、セルの値が変化することによって、セルA1に影響をおよぼすであろうセル郡です。
ただし、他のセルを参照していないセルに対してPrecedentsプロパティを使うと、「該当するセルがありません。」というエラーになります。このエラーは事前に探知していて回避することができません。一般的には他のセルを参照しているセルには数式が入力されているので、If ActiveCell.HasFomula Then と数式が入力されているかどうかをチェックするのが有効ですが、もし=SUM(1,2,3)のようなどのセルも参照していない数式が入力されていると、エラーを回避できません。そんな時は、On Error Resume Next ステートメントを使って発生するエラーを無視するといいでしょう。
1 2 3 4 5 6 7 8 |
Sub sample26() Dim c As Range On Error Resume Next For Each c In ActiveCell.Precedents 'アクティブセルの数式が参照しているセルを調べる c.Interior.ColorIndex = 3 ' セルの背景を赤く塗りつぶす Next c End Sub |
27. セルに###が表示されているかどうかを判定する
object.Text
object.Value
IsError(Expression)
セルに数値を入力した時、列の幅が足りなくて、全ての数値が表示できないとき、セルには###のような記号が表示されます。マクロでこうしたセルを判定してみましょう。###はセルに入力されているのではなく、表示されているだけなので、Valueプロパティではわかりません。ここは、セルに表示されている文字列を返すTextプロパティを使います。
しかし、セルに文字列で#1のように入力されていると区別がつきません。そこで、ValueプロパティとTextプロパティで比較します。烈幅が足りなくて###のように表示されているセルは、入力されているデータと表示されている画面が異なっているはずだからです。
まだ安心はできません。数式エラーの#DIV/0! #NAMEなども左1文字が#で始まっています。数式がエラーかどうかは、IsError関数で判定します。
1 2 3 4 5 6 7 8 9 |
Sub sample27() With ActiveCell If Not IsError(.Value) Then If .Value <> .Text And Left(.Text, 1) = "#" Then .EntireColumn.AutoFit End If End If End With End Sub |
28. 数値から列番号を調べる
object.Address
Split(expression, delimiter, limit, compare)
Cellsを使ってセルを操作する時、行と列を数値で指定します。行の数値は、ワークシートを見ればわかりますが、列の位置を数値で指定する時は工夫が必要です。ここでは列番号の数値がどこの列を表しているかを調べてみましょう。
例えば、42番目の列はどこでしょう。列はアルファベットで表されるので、42をアルファベットに変換しなければなりません。ただしABCと続いてZの次はAAとなります。42番目がどのアルファベット(列番号)になるのか、数えるのは現実的ではありません。こんな時は、セルのアドレスを返します。結果は$AP$1です。ここから列番号のAPを抜き出すには、$AP$1の$をSplit関数で分割します。分割した結果は配列形式になり、列番号を表す文字列は2番目の要素です。したがってSplit(“$AP$1”, “$”)(1)で取り出せます。これなら列番号が何文字でも対応可能です。
1 2 3 4 5 |
Sub sample28() Dim C As String C = Split(Cells(1, 42).Address, "$")(1) MsgBox "42列目は" & C & "列です" End Sub |
39. セルにコメントを挿入する
セルにコメントを挿入するには、セル(Rangeオブジェクト)のAddCommentメソッドを実行します。挿入されたコメントの文字列を指定するには、挿入したコメント(Commentオブジェクト)のtextメソッドで、表示したい文字列を指定します。2つのメソッドを1行で書くとサンプルの3行目のようになります。コメントを挿入して任意の文字列を表示するには、実はこれだけです。
しかし、コメントを挿入する時は注意が必要です。それはすでにコメントが挿入されているセルに対してAddCommentメソッドを実行するとエラーになることです。したがって、コメントを挿入する前に、そのセルにコメントが挿入されていないかどうかを判定しなければなりません。それには、TypeName関数を使います。
TypeName関すは、バリアント型変数に格納されているデータの型を調べる関数ですが、セルのCommentオブジェクトに対して実行すると、すでにコメントが挿入されている時は、Commentという文字列が返ります。これを利用して、コメントが挿入されているかどうかを判定できます。
1 2 3 4 5 |
Sub sample29() If TypeName(ActiveCell.Comment) = "Nothing" Then ActiveCell.AddComment.Text "これはコメントです" End If End Sub |
30. セルないの一部だけ色を設定する
object.Characters(Start, Length).Font.ColorIndex
セル内の文字列に色を設定するには、FontオブジェクトのColorIndexプロパティに色番号を設定します。例えば、アクティブセルの文字色を赤にするには「ActiveCell.Font.ColorIndex = 3」 とします。では東京都新宿区栄町のような文字列がセルに入力されていて、新宿区岳を赤色にするにはどうしたらいいでしょう。
セル内の文字列は、文字単位で書式を設定できます。このとき何文字目から何文字文の文字列を操作するか指定します。そこで使うのがCharactersプロパティです。Characters(スタート位置,文字数)のように指定します。
新宿区は4文字目から始まって3文字分なのでサンプルの2行目のようになります。
1 2 3 |
Sub sample30() ActiveCell.Characters(Start:=4, Length:=3).Font.ColorIndex = 3 End Sub |
31.大量のセルを配列に入れてから操作する
VBAは非常に高速です。基本に忠実なコードを書いていれば、あまり速度を気にすることもありません。しかし、とても大量なセルを操作する時は、大量のセルを一度変数に入れ、その変数を操作した方が速度的に有利な場合もあります。
下記のコードは、セルA1〜A50000の数値を合計しています。For Next ステートメントを使って、
1 2 3 |
For i = 1 To 50000 Result = Result + Cells(i, 1) Next i |
とすれば合計できますが、操作対象のセルを一度バリアント型変数に格納し、その変数を配列として操作する方が早くなります。ただし、高速になるのは、大量のデータを扱う場合に限ります。PCのスペックなどによりますが、少なくとも数万個から数十万個のセルでなければ、速度に差が出ないだけでなく、逆に遅くなるかもしれません。また変数に格納できるのはセルのデータだけなので、書式を設定するなど、変数を介してセルを操作することはできません。
1 2 3 4 5 6 7 8 |
Sub sample31() Dim i As Long, Result As Long, C As Variant C = Range("A1:A50000") For i = 1 To 50000 Result = Result + C(i, 1) Next i MsgBox Result End Sub |
32. 配列をセルに代入する
object.Resize(RowSize, ColumnSize),
UBound
配列に格納されたデータは、セルに一括代入することができます。代入するセルの大きさを配列の大きさと合わせるには、UBound関数やLBound関数を使うと便利です。UBound関数は、引数に指定した配列で最も大きいインデックス番号を返し、LBound関数は最も小さいインデックス番号を返します。サンプルでは、配列をDim tmp(3)と宣言しているので、使用できるインデックス番号は、tmp(0)、tmp(1)、tmp(2)の3つです。この場合、UBound関数は2を返し、LBound関数は0を返します。
このような一次元配列を複数セルに一括代入する時は、セル範囲A1:C1のように横方向のs流範囲にしか代入できません。一次元配列を、セル範囲A1:A3の様な縦方向のセル範囲に一括代入するには、配列を二次元配列に変換しなければなりません。
33.二次元配列をセルに代入する
34.ワークシート関数を使う
35.文字列として入力する
36.3桁カンマ区切りの表示形式を設定する
37.空白セルだけを操作する
38.色を設定する
39.セルを並べ替える
40.セルが範囲内にあるかどうか判定する
41.セルが空欄かどうか判定する
42.セルのコメントを削除する
object.Delete
セルのコメントを削除するには、CommentオブジェクトのDeleteメソッドを使います。削除する前には、セルにコメントを挿入する時と同じように、そのセルにコメントが存在しているのかどうかをTypeName関数で確認してください。
1 2 3 4 5 |
Sub sample42() If TypeName(ActiveCell.Comment) = "Comment" Then ActiveCell.Comment.Delete End If End Sub |
43.コメントを編集状態にする
セルにコメントを挿入するときは、AddCommentメソッドを使います。これは、ワークシート上でShift+F2キーを押したときと同じです。しかし両者はまったく同じではありません。ワークシート上でShift+F2キーを押すと確かにコメントが挿入され正宇。もしそのセルにすでにコメントが挿入されていた場合は、既存のコメントが編集状態になりますが、VBAのAddCommentメソッドはエラーになってしまいます。マクロでも同じように既存のコメントを編集状態にするにはどうしたらいいでしょう。そうした命令はVBAにありません。専横の命令がないのでしたら、手動操作と同じことを実行しましょう。SendKeysステートメントはキーボードからキーを押すのと同じ働きをします。
44.セルのコメントに画像を表示する
セルのコメント枠はオートシェイプです。オートシェイプは背景に画像を表示することができます。これを応用すると画像のコメントを挿入できます。コメントの背景に画像を表示するには、UserPictireメソッドで表示したい画像ファイルを指定します。これだけならマクロ記録でもわかりますが、そうして表示した画像は、コメント枠の大きさに縮小されてしまいます。せっかく画像を表示するのだから、反対に画像の大きさに合わせて、コメント枠の大きさを自動調整したいところです。これには、画像ファイルをLoadPicture関数でオブジェクトに変換して行います。変換したオブジェクトには高さと幅の情報があるので、それに合わせてコメント枠を変更します。
45.コメントの枠を変更する
コメント枠の実体はオートシェイプの四角形です。Excel2003までは図形描画ツールバーを使って、コメント枠の種類を変更できました。しかしExcel2007からは、ツールバーがなくなってしまったので、手動操作でコメント枠を変更することができなくなりました。しかし機能が削除されたわけではありません。マクロからオートシェイプを設定することで、コメント枠を自在に変更することが可能です。オートシェイプを表す定数の一覧はP661を参照してください。
46.複数のセルに同じ数式を代入する
下図では、セル範囲A1:A5に数値が入力されています。隣のB列に=A1*2のように簡単な数式を代入するとします。もちろん1行名はA1*2ですが、2行目以降はA2*2 A3*2 と参照するセルのアドレスが変化します。こんなとき、それぞれのセルに1つずつ数式を代入するのではなく、サンプルのように複数セルに一括代入できます。入力されるセルに応じて、参照するセルのアドレスも自動調整されます。これは複数のセル(ここではセル範囲B1:B5)を選択して、アクティブセルに=A1*2と入れ、Control+Enterキーを押すのと同じ動作です。同じことはVBAからでも可能です。なお、サンプルではValueプロパティに数式を代入しています。セルの数式はFormulaプロパティで表されますが、Excelは=で始まる文字列は自動的に数式と認識されるので、Valueプロパティに代入しても数式と認定されます。
47.ワークシート関数を入力する
セルに関数を入力する操作をマクロ記録すると、Selection.FormulaR1C1 = “SUM(R[-5]C:R[-1]C)”のようにR1C1形式の数式が記録されます。マクロ記録で記録されることから、VBAでセルにワークシート関数を代入するときは、R1C1形式でなければいけないと誤解しているユーザーが多いようです。そんなことはありません。普段使いなれているA1形式の数式を、そのまま代入すればExcelは普通通りに応えてくれます。
48.条件に一致するセルの個数を数える
A列に名前が入力されています。この中から田中が何個あるかカウントしてみましょう。Excelでは、何かをするとき、そのための機能や仕組みを選ぶことが多くなります。このように田中が何件あるかをカウントする時、その件数を一発で返す仕組みを探すユーザーもいます。しかし、そもそもプログラミングで数をカウントするとはどういうことかを理解していれば、基本的な命令だけで簡単に求められます。cnt = cnt + 1は、変数cntを1ずつ増加させます。
49.条件に一致するセルの数値を合計する
ある条件に一致した数値を合計するときも、条件に一致するセルの個数を数えると同じようにプログラミング的な発想で可能です。実際に、手作業で電卓を使って合計を求めるなら、誰もがこう考えるはずです。A列を上から順にみていって、もし田中だったらB列の数値を電卓にたしていく、、、、それと同じことをプログラミングすればよいわけです。
50.ワークシート関数を使って条件に一致するセルの数値を合計する
もし下図のような表でA列が田中の隣のセルB列だけを合計するとしたら、ほとんどのユーザーがワークシート関数のSUMIF関数を思い浮かべることでしょう。たしかにワークシート上で計算するのであれば、それが当然です。VBAからワークシート関数を呼び出すには、WorksheetFunctionプロパティを使います。全てのワークシート関数を使えるわけではありませんが、ケースによっては便利に使えます。VBAからワークシート関数を呼び出すときは引数にセルのアドレスではなくRangeオブジェクトを指定することに留意してください。
51.行を挿入する
object.Rows(Index).Insert(Shift, CopyOrigin)
object.EntrireRow.Insert(Shift, CopyOrigin)
Excelで行を挿入する操作は2種類あります。1つは行全体を選択し、右クリックして挿入を実行する操作です。もう一つは、任意のセルを右クリックし、挿入を実行して表示される挿入ダイアログボックスで行然体を選択する操作です。両者では、マクロ記録で記録されるコードが異なります。
・行全体の挿入
Rows(“4:4”).Select
Selection.Insert
・セルの挿入ー行全体
Range(“4:4”).Select
Selection.EntireRow.Insert
後者の操作は認知度が低いことから、記録されるEntireRowプロパティもあまり知られていません。EntireRowプロパティは、任意のセルの行を表します。例えば、Range(“A4”).EntireRowは4行目全体です。マクロでは●行目を削除だけでなくあるセルの行全体を削除という処理も多いです。そんな時必須のプロパティがEntireRowです。
1 2 3 4 |
Sub sample51() Rows("4:5").Insert Range("A7").EntireRow.Insert End Sub |
52.行を挿入して書式を引き継ぐ
object.EntireRow.Insert CopyOrigin:=Const
行を挿入したとき、新しく挿入された行に対して、上の行の書式を適用するか、それとも下の行の書式を適用するかを、引数CopyOriginで指定できます。指定できる定数は次の2つです。
xlFormatFromLefOrAbove:上行の書式を適用する
xlFormatFromRightOrBelow:下行の書式を適用する
1 2 3 4 |
Sub sample52() Range("A3").EntireRow.Insert CopyOrigin:=xlFormatFromLeftOrAbove Range("A7").EntireRow.Insert CopyOrigin:=xlFormatFromRightOrBelow End Sub |
53.行を挿入して書式は引き継がない
object.EntireRow.Insert.ClearFormats
行を挿入した時に表示されるスマートタグでは、上と同じ書式を適用、下と同じ書式を適用の他に書式のクリアという選択肢があります。書式を適用するときは、引数CopyOriginに定数を指定しますが、書式のクリアに該当する定数はありません。マクロ記録するとわかりますが、この時は挿入した行に対してClearFormatsメソッドを実行します。
1 2 3 4 5 6 |
Sub sample53() With Range("A4").EntireRow .Insert .ClearFormats End With End Sub |
54.特定のセルの上に行を挿入する
object.EntireRow.Insert(Shift, CopyOrigin)
あらかじめ作成した表に対して、ある条件に一致した位置に行を挿入するという処理は一般的です。ここでは、佐藤の上に新しい行を挿入するマクロを考えてみましょう。まず、こうした繰り返し処理では、For Nextステートメントが使えません。行を挿入すると、調べるセルの範囲の大きさが変化するたため、繰り返しの回数をあらかじめ決められないからです。こんな時は、セルが空欄になるまでという条件でDo Loopステートメントを使います。
1 2 3 4 5 6 7 8 9 10 11 |
Sub sample54() Dim i As Long i = 1 Do While Cells(i, 1) <> "" If Cells(i, 1) = "佐藤" Then Cells(i, 1).EntireRow.Insert i = i + 1 End If i = i + 1 Loop End Sub |
55.特定のセルの下に行を挿入する
54と同じようにある条件に一致した位置に新しい行を挿入します。今度は鈴木の下に挿入します。サンプルの表では同じ結果になりますが、特定セルの下に挿入する方法と上に挿入する方法の違いを、それぞれ正しく理解してください。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub sample54() Dim i As Long i = 1 Do While Cells(i, 1) <> "" If Cells(i, 1) = "鈴木" Then i = i + 1 Cells(i, 1).EntireRow.Insert i = i + 1 End If i = i + 1 Loop End Sub |
56.列を挿入する
Columns(Index).Insert(shift, CopyOrigin)
object.EntireColumn.Insert(Shift, CopyOrigin)
列の挿入も、行の挿入と考え方は同じです。列全体を表すColumnsプロパティを使ってColumns(“C:C”).Insertのように書くこともできますし、任意のセルが属する列全体を返すEntireColumnプロパティも便利です。
1 2 3 4 |
Sub sample56() Columns("C:C").Insert Range("F1").EntireColumn.Insert End Sub |
57.特定のセルの左に列を挿入する
object.Find(What)
object.EntireColumn.Insert(Shift, CopyOrigin)
あらかじめ作成された表の特定の位置に列を挿入してみましょう。ここでは、1行目に合計と入力されているセルの手前(左)に新しい列を挿入します。例えばRange(”E1″).EntireColumn.Insertとすれば、セルE1の左に列が挿入されます。合計と入力されたセルは、Find メソッドで検索しています。
1 2 3 4 5 6 7 |
Sub sample57() Dim FoundCell As Range Set FoundCell = Range("1:1").Find("合計") If Not FoundCell Is Nothing Then FoundCell.EntireColumn.Insert End If End Sub |
58.特定のセルの右に列を挿入する
object.Find(What) object.Offset(RowOffset,ColumnOffset).EntireColumn.Insert(Shift, CopyOrigin)
今度は6月と入力されたセルを探し、その右に新しい列を挿入します。Findメソッドで6月セルを検索し、見つかったセルの1つ右の列に対してInsertメソッドを実行します。
1 2 3 4 5 6 7 |
Sub sample58() Dim FoundCell As Range Set FoundCell = Range("1:1").Find("6月") If Not FoundCell Is Nothing Then FoundCell.Offset(0, 1).EntireColumn.Insert End If End Sub |
59.特定のセルの行を削除する
object.EntireRow.Delete
ある条件に一致した行だけを全て削除するような操作は、多くのユーザーが望むマクロの1つです。ここではA列で小計と入力された行を削除してみましょう。A列を順番に見ていって、小計と入力されていたらその行を削除するのですが、こういう処理では対象範囲をしたから見ていくのがセオリーです。なぜなら、行を削除してしまうと、1行下のセルが上に繰り上がってしまうからです。
例えばセルA3とセルA4に続けて小計が入力されていたとします。3行目を削除すると、それまで4行目だったセルA4が新しくA3になります。しかしセルA3はすでにチェック済みなので次はそれまで5行目だった新しいセルA4から処理が継続されてしまうからです。
1 2 3 4 5 6 7 8 |
Sub sample59() Dim i As Long For i = 8 To 1 Step -1 If Cells(i, 1) = "小計" Then Cells(i, 1).EntireRow.Delete End If Next i End Sub |
60.空白セルの行を削除する
object.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
A列が空白だった時、その行を削除する場合も、前項と同じ考え方で削除できます。Ifの条件をIf Cells(i, 1) = “” thenとすればいいでしょう。ただし、空白セルを探しだすには、もう一つ便利な方法があります。SpecialCelllsプロパティです。このプロパティはF5キーを押してジャンプダイアログボックスを開き、セル選択ボタンで表示される選択オプションダイアログボックスと同じ働きをします。指定した範囲内で、全ての空白セルを一気に取得できますので、削除の処理も一回で済みます。
1 2 3 |
Sub sample60() Range("A1:A8").SpecialCells(xlCellTypeBlanks).EntireRow.Delete End Sub |
61.アクティブセルを調べる
object1.ScreenUpdating, object2.Activate
アクティブセルはActiveCellプロパティで取得できます。現在のアクティブセルがどこかは、すぐに調べられます。では、現在アクティブではないワークシートのアクティブセルを調べるのは、どうしたらよいでしょう。
それはできません。そもそもアクティブセルというのは、キーボードから入力したデータが代入されるセルの事です。開いていない(アクティブでない)ワークシートにはどうやっても代入できないので、アクティブセルはアクティブシートにしか存在しないのです。別のワークシートでどのセルが選択されているのかは、実際にワークシートを開いてみなければ分かりません。
1 2 3 4 5 6 7 8 9 |
Sub sample61() Dim Target As Range Application.ScreenUpdating = False ActiveSheet.Next.Activate Set Target = ActiveCell ActiveSheet.Previous.Activate Application.ScreenUpdating = True MsgBox "右シートのアクティブセルは" & Target.Address & "です" End Sub |
62.アクティブシートではない別のシートのセルを選択する
object.Select
開いていない(アクティブでない)ワークシートのセルには、いきなりActivateメソッドやSelectメソッドは使えません。この操作をマクロ記録すると、次のようなコードが記録されます。
Sheets(“Sheet2”).Select
Range(“B3″).Slect
これを続けてSheets(“Sheet2”).Range(“B3”).Selectと書くとエラーになります。これはVBAの仕様です。開いていないワークシートを開いて、任意のセルを選択するときは、ワークシートのSelectメソッドとセルのSelectメソッドを2つに分けて記述してください。
1 2 3 4 |
Sub sample62() Sheets("Sheet2").Select Range("B3").Select End Sub |
63.非連続のセルが選択されているかどうかを調べる
object.Area
ExcelはControlキーを押しながらセルをクリックまたはドラッグすると連続してない複数のセルを選択できます。こうした非連続のセルが選択されているかどうかは、Areasコレクションで取得できます。Areasコレクションは、選択されているセル範囲Selecction内で連続した領域を返すコレクションです。コレクションですが、Areaオブジェクトというものはありません。Areasコレクションの数Countプロパティを調べることで、非連続のセルが選択されているかどうかが判定できます。
1 2 3 4 5 6 7 8 9 10 11 |
Sub sample63() Dim msg As String, i As Long If Selection.Areas.Count = 1 Then MsgBox "非連続のセルは選択されていません" Else For i = 1 To Selection.Areas.Count msg = msg & Selection.Areas(i).Address & vbCrLf Next i MsgBox "選択されているのは" & vbCrLf & msg End If End Sub |
64.行単位のセル範囲を操作する
セルを特定するときは、RangeプロパティまたはCellsプロパティを使います。Rangeプロパティはアドレスが固定されているときに使い、Cellsプロパティはマクロ中でセルが移動や変化するときに使います。Rangeプロパティには引数にセルのアドレスを文字列指定しますが、Rangeプロパティにはもう1つの書式があります。それはRange(始点セル、終点セル)です。始点セルから終点セルまでのセル範囲を返します。この書式を使うと、表のデータを行単位で特定するのが用意になります。
65.セルに印をつける
RangeオブジェクトにはIDプロパティというプロパティがあります。IDプロパティは、ワークシートをWebページとして保存するとき、ハイパーリンクの参照先ターゲットを設定するプロパティです。ワークシートをWebページとして保持しないのであれば、このIDプロパティは通常では使用しません。しかしせっかくですから有効活用しましょう。サンプルは、まずユーザーが選択したセルのIDプロパティにSelectedという文字列を書き込みます。次にアクティブシートでIDプロパティがSelectedのセルだけを選択します。2つのマクロは続けて実行する必要はありません。
66.大量のセルを選択する
セルを選択するときは、Range(“A1”).Selectのようにします。複数のセルを選択するのならRange(“A1,A3,A5″).Selectのようにします。複数のセルを選択するのならRange(”A1,A3,A5”).SelectのようにRangeの引数に複数セルのアドレスをカンマで区切って指定します。しかし意外に知られていませんが、Rnageの引数に指定する文字列は255文字までという制限があります。255文字を超えるアドレスを指定するとエラーになります。大量のデータを選択する場合、アドレスを文字列として合体するとこの制限は問題になります。そんなときは、Unionメソッドを使います。Unionメソッドは複数の非連続セルを返します。
67.セルのフリガナを取得する1
セルに文字列を入力すると、セルにフリガナの情報が記録されます。日本語変換で変換した日本語は、変換前にキーボードから入力した読みがフリガナになります。アルファベットは、入力したアルファベットがそのままフリガナとして登録されます。なお、Excelのフリガナは標準でカタカナで登録されます。
68.セルの振り仮名を取得する2
セルのフリガナはPhoneticオブジェクトのTextプロパティで取得できます。これは、セルに記録されているフリガナ全体を表します。セルのフリガナは、入力時に変換した文字列ごとに記録されます。例えば田中直美をたなか、なお、みと3回に分けて変換し入力した場合、セルには3つのフリガナ情報が記録されます。記録されているフリガナの数は、PhoneticsコレクションのCountプロパティでわかります。それぞれのフリガナはPhonetic(1)のようにして操作します。
69.入力されていない文字列の振り仮名を取得する
セルに登録されるフリガナは、キーボードから入力した日本語変換前の読みです。したがって、キーボードから入力していない文字列には、フリガナ情報が登録されません。ふりがな情報が登録されていないセルに対しては、SetPhoneticメソッドで標準的なフリガナを自動的に設定できます。そうではなく、セルに入れる前にフリガナを取得するにはApplicationオブジェクトのGetPhoneticメソッドを使います。GetPhonetiçメソッドは、セルに関係なく、引数に指定した文字列のフリガナを返します。
70.セルのフリガナ設定を変更する
ワークシートで使うPHONETIC関数や、RangeオブジェクトのPhonetic.Textで取得できるフリガナがカタカナなので、Excelのフリガナは標準でカタカナが変えるように設定されています。ひらがなのフリガナを取得するには、フリガナが記録されているセルの設定を変更します。フリガナの種類は、CharacterTypeプロパティに次の定数を指定します。
xlHiragana:ひらがなにする
xlKatakanaHalf:半角カタカナにする
xlKatakana:カタカナにする
71.全種類のフリガナを取得する
任意の文字列のフリガナを返すGetPhoneticメソッドは便利な特徴があります。引数に感じを指定すると、その漢字の読みを返しますが、続けて引数を省略して実行することで、別の読みを次々と返してくれます。
72.セルにフリガナを表示・非表示に設定する
セルにフリガナを表示するかどうかは、PhoneticオブジェクトのVisibleプロパティで設定します。Trueは表示でFalseが非表示です。フリガナの表示・非表示を切り替えるには、Visibleプロパティに現在と反対の値TrueまたはFalseを指定します。Not演算子は値を反転する働きをします。
73.ひらがなとカタカナを変換する
ひらがなとカタカナを変換するには、StrConv関数を使います。StrConv関数の第一引数には変換前の文字列を指定し、第二引数には何に変換するかを表す定数を指定します。
vbKatakana:カタカナに変換する
vbHiragana:ひらがなに変換する
74.半角と全角を変換する
半角と全角を変換するには、StrConv関数を使います。StrConv関数の第一引数には返還前の文字列を指定し、第二引数には何に変換するかを表す定数を指定します。
vbWide:全角に変換する
vbNarrow:半角に変換する
75.大文字と小文字を変換する
大文字と小文字を変換する機会は多くなります。例えばブックを開くときはWorkbooks(“Book1.xlsx”).Opento
76.空白を除去する1
VBAには文字列から空白を除去するTrim関数があります。Trim関数は半角の空白と全角の空白の両方を除去しますが、サンプルでも分かるように除去されるのは、左右の空白だけです。Microsoft Excelの間にある空白は除去されません。
77.空白を除去する2
文字列から空白を除去するTrim関数は、手軽ですが汎用性は高くありません。半角の空白だけを除去したり、文字列にふくまれるすべての空白を除去したいようなときはTrim関数ではなく、Replace関数を使います。Replace関数は指定した文字を別の文字に置換する関数です。置換後の文字に空白””を指定すれば指定した文字はすべて削除されます。
78.単位がついた数値を計算する
Excelで100円など単位のついた数値を扱うときは、セルに100と入力し表示形式で円を表示します。円は直接セルに入力してはいけません。なぜなら100は数値なので計算できますが、円は文字なので計算できないからです。100円もエクセルにとっては文字と認識されるため計算できません。これでは困ります。しかしExcelに不慣れなユーザーはつい単位まで入力しがちです。そうした単位のついた数値を計算するにはどうしたらいいでしょう。Replace関数を使って円を空白””に置換する手もありますが、ここではVal関数を覚えてください。Val関数は文字列を数値に変換する関数ですが、文字列の先頭(左端)から見て数値に変換できるところまでを数値に変換するという便利な特徴があります。これを使えば100回だろうが100人だろうが単位のついた数値を恐れる必要なない。
79.入力規則を設定する
セルに入力規則を設定するには、ValidationオブジェクトのAddメソッドを実行します。ただし、すでに入力規則が設定されているセルに、さらにAddメソッドを実行するとエラーになります。セル(Rangeオブジェクト)には、入力規則を1種類しか設定できないからです。そこで念のため、設定する前にDeleteメソッドで削除しておきます。定数xlValidateWholeNumberは整数を表します。
xlBetween
xlEqual
xlGreater
80.日付に関する入力規則を設定する
サンプルは日付、次の値以上、2010/7/1の入力規則を設定しています。Addメソッドの引数Typeには、次の定数を指定します。
xl
定数xlValidateListを指定すると、セルにリストが作成されます。引数Formula1にはリストに表示するデータをカンマで区切って指定するか、データが入力されているセル範囲を指定します。
81.入力規則のリストを設定する
入力規則のリストを設定するには、Addメソッドの引数Typeに定数xlValidateListを指定し、引数Formula1にリストに表示するデータを指定します。データを直接入力するときは、Formula1:=”田中,鈴木,山田”のように各データをカンマで区切って指定します。リストに表示したいデータがすでにワークシート上に入力されている場合は、そのセル範囲を指定できます。サンプルはSheet2のセル範囲A1:A3を指定しています。
82.入力時のメッセージを表示する入力規則を設定する
入力規則では、そのセルにアクティブセルを移動した時、入力時のメッセージを表示することができます。入力時のメッセージは、Addメソッドの引数InputTitleと引数InputMessageに指定します。引数InputMessageには改行コードを指定することもできます。
83.入力規則とエラーメッセージを設定する
入力規則では指定した範囲外のデータが入力されたとき、エラーメッセージを表示できます。エラーメッセージは引数ErrorTitleと引数ErrorMessageに指定します。引数ErrorMessageには改行コードを指定することも可能です。
84.入力規則とエラーメッセージのスタイルを設定する
標準の入力規則では、指定した範囲以外のデータが入力させると入力した値は正しくありません。というエラーメッセージが表示されて、指定した範囲外のデータは入力できません。こうした入力規則のレベルはエラーメッセージのスタイルで設定できます。スタイルには、停止・注意・情報の2種類があります。これらは引数AlertStyleに次の定数を指定します。
xl
xl
xl
85.日本語入力に関する入力規則を設定する
入力規則では、アクティブセルを移動したとき、自動的に日本語入力IMEを切り替える設定があります。日本語入力の設定は、引数IMEModeに次の定数を指定します。
xl
xl
xl
サンプルでは、日本語入力だけを設定しています。このように入力できる範囲に規則を設定しない場合は、引数Typeに定数xlValidateInputOnlyを指定します。
86.入力規則が設定されているかどうかを判定する
任意のセルに、入力規則が設定されているかどうかを一発で判定するプロパティなどはありません。セルに入力規則が設定されているかどうかは、セルの入力規則(Validationオブジェクト)を操作してみて、エラーになるかどうかで判断します。エラーにならなかったら、そのセルには入力規則が設定されているということです。サンプルは選択したセル範囲内d入力規則が設定されているセルの背景を赤色で塗りつぶします。
87.無効データをチェックする
入力規則は、その名の通り「入力に対しての規則」なので、マクロによる代入や、値の貼り付けなどの使うと、規則に反した無効データを簡単に代入できます。無効データのチェックはWorksheetオブジェクトのCircleInvlidメソッドを実行して表示される赤い楕円はShapeオブジェクトです。実行する前のShapeオブジェクト数と比較することで、無効データがいくつあるかわかります。
88.オートフィルタを設定する
object.AutoFiliter
オートフィルタを設定する時は、AutoFilterメソッドを実行します。このときの対象は、オートフィルタを設定したい表内のセルであれば、どこでも構いません。表全体を指定する必要はありません。AutoFilterメソッドは、オートフィルタを設定すると同時に、表を絞り込むこともできます。
1 2 3 |
Sub sample88() Range("A1").AutoFilter End Sub |
89.オートフィルタを解除する
オートフィルタを解除するときもAutoFilterメソッドを実行します。引数を何も指定しないでAutoFilterメソッドを実行すると、オートフィルタの設定と解除を繰り返します。対象のセル範囲は、一般的にはオートフィルタが設定されている表内のセルを指定しますが、実はどのセルを指定しても解除できます。Excelでは、ワークシート上に1つしかオートフィルタを設定できないからです。
1 2 3 |
Sub sample89() Range("A1").AutoFilter End Sub |
90.オートフィルタを設定して絞り込む
AutoFilterメソッドは引数を指定しないで実行すると、オートフィルタの設定と解除を繰り返します。この場合の設定とは、タイトル行にオートフィルタを矢印が表示されるかどうかです。またAutoFilterメソッドは、引数を指定して実行することで、オートフィルタの設定と同時に絞り込みを行うことも可能です。引数Fieldには、絞り込む列の位置を数値で指定シます。引数Criteria1は1つ目の条件です。サンプルでは東京という文字で絞り込んでいます。
1 2 3 |
Sub sample90() Range("A1").AutoFilter Field:= 2 Criteria1 :="東京" End Sub |
91.オートフィルタを設定してオートフィルタ矢印を非表示にする
AutoFilterメソッドの引数VisibleDropDownにFalseを指定すると、絞り込んだ列のオートフィルタ矢印を非表示にできます。
1 2 3 4 |
Sub sample91() Range("A1").AutoFilter Field = 3, Criteria1:="田中", _ VisibleDropDown:=False End Sub |
92.すべてのオートフィルタ矢印を非表示にする
サンプルのように、全ての列(フィールド)に対してVisibleDropDown:=Falseを指定すれば、全ての列でオートフィルタ矢印を隠すことができます。
マクロでオートフィルタを操作し、その結果をユーザーに見せるだけのような場合に便利です。
93.オートフィルタが設定されているかどうかを判定する
オートフィルタが設定されているかどうかは、ワークシート(Worksheetオブジェクト)のAutoFilterModeプロパティで判定できます。AutoFilterModeプロパティで判定できます。AutoFilterModeプロパティは、ワークシート上でオートフィルタが設定されているとTrueを返します。
94.オートフィルタの適用範囲を調べる
ワークシート上には、1つしかオートフィルタを設定できません。したがってすでに設定されているオートフィルタは、ActiveSheet.AutoFilterやSheets(“Sheet1”).AutoFilterのようにしてアクセスできます。現在設定されているオートフィルタの適用範囲は、AutoFilterオブジェクトのRangeプロパティでわかります。この適用範囲とは、絞り込んだ結果の範囲ではなく。オートフィルタを設定している表全体の範囲です。
95.絞り込まれているかどうか判定する1
オートフィルタが設定されているかどうかは、AutoFilterModeプロパティでわかりますが、では何らかの条件に絞り込まれているかは、どうやって判断すればいいのでしょう。それには、FilterModeプロパティを使います。FilterModeプロパティは、オートフィルタが絞り込まれているとTruueを返します。ただし、FilterModeプロパティは、Excel2007で追加されたプロパティです。Excel2003まででは使えないので注意してください。
96.絞り込まれているかどうか判定する2
では、Excel2003までのバージョンでオートフィルtが絞り込まれているかどうかを判定するには、どうしたらいいでしょう。オートフィルタ矢印が表示されている各列は、Filterオブジェクトで表されます。FilterオブジェクトのOnプロパティはその列が絞り込まれているとTrueを返します。
97.絞り込んだ件数を調べる
オートフィルタ(AutoFilterオブジェクト)には、絞り込んだ結果は何件かを返すプロパティがありません。絞り込んだ結果の件数を調べるには、ワークシート関数のSUBTOTAL関数をVBAから呼び出します。
98.絞り込んだ結果の数値合計を求める
絞り込んだ件数と同様に、絞り込まれている数値の合計を求めるときも、ワークシート関数のSUBTOTAL関数を使うと便利です。
99.絞り込んだ条件を調べる
どの列が絞り込まれているかは、各列を表すFilterオブジェクトのOnプロパティで判定できます。指定した条件は、Critera1プロパティとCriteria2プロパティに設定されます。サンプルでは、Criteria1プロパティで1番目の条件しか取得していませんが、●または×、●から×など2つの条件を指定しているときは、Criteria2プロパティを参照してください。
100.文字列で絞り込む1
文字列データの●と等しいで絞り込むには、Criteria1プロパティに絞り込たい文字列を指定します。●と等しくないで絞り込むには、指定sるう文字列の前に<>を付けます。
101.文字列で絞り込む2
●で始まるや●で終わるあるいは、●を含むという条件で文字列を絞り込むには、ワイルドカードを使います。ワイルドカードの?は任意の1文字に該当し、*は文字数に関係ない任意の文字に該当します。
102.文字列で絞り込む3
●又は×という条件で絞り込むには、引数Operatorに定数xlOrを指定し、2つの条件をCriteria1とCriteria2に指定します。●かつ×の場合は、引数Operatorに定数xlAndを指定します。
103.数値で絞り込む
数値を絞り込む時は、条件に比較演算子を使います。ただしnと等しいの場合は、文字列と同じように=を省略できます。
104.空白セルを絞り込む
空白セルで絞り込む時は、条件に”=”を指定します。反対に空白でないセルで絞り込む時は、条件に”<>”を指定します。
105.日付で絞り込む1
オートフィルタを日付で絞り込むのは難しいです。セルに設定されている表示形式や、引数Criteria1の指定によって結果が異なります。またExcelのバージョンによっても結果が違います。まずセルに標準の表示形式*2001/3/14が設定されている場合です。このとき、引数Criteria1に2009/12/20と文字列形式の日付を指定したとします。結果は次のようになります。
Excel 2007/2003
Excel 2013/2010
Excel 2007/2003では、引数Criteria1にDateValue(“2009/12/20”)と関数を使うか、日付リテラルの*12/20/2009#としなければなりません。ただしこちらはExcel2013/2010では失敗します。
106.日付で絞り込む2
セルに2001/3/14や3月14日など、先頭に*がつかない表示形式が設定されている場合、引数Criteria1には”2009/12/20″のように、セルに表示されている形式の日付を文字列で指定します。先頭に*がついていない表示形式が指定されているときは、引数Criteria1にDateValue(“2009/12/20”)や日付リテラルの#12/20/2009#を指定すると、絞り込みに失敗します。
107.日付で絞り込む3
Excel2010では、オートフィルタで日付を絞り込む時、リストから年月日を指定できるようになりました。こうした日付をグループ化する絞り込を行う時は、引数Operatorに定数xlFilterValuesを指定し、Criteria2に条件を表す配列を指定します。
108.日付で絞り込む4
Excel2010では、オートフィルタに日付フィルタという機能が追加されました。これは絞り込みたい日付を、去年・今週・今月の初めから今日まで・第1四半期などで指定できます。日付フィルタで絞り込むには、引数Criteria1に日付を意味する定数を指定します。定数には、次の種類があります。
109.絞り込んだ結果をコピーする
オートフィルタで絞り込んだ結果を、別のシートにコピーしてみましょう。セルのコピーはコピー元.Copy 貼り付け先です。オートフィルタで絞り込んだ状態とは、条件に一致しない行の高さが0に設定されて隠れています。絞り込まれているとは言え、行
110.絞り込んだ結果だけ取得する
マクロでオートフィルタを使うときは、絞り込んで終了、、、という事は少なくなります。たいていは、絞り込んだ結果に対して、件数を調べたり合計を求めたりします。あるいは、絞り込んだ結果に対して、件数を調べたり合計を求めたりします。あるいは、絞り込んだデータをさらに調べるかもしれません。意外と難しいのがタイトル行を除いた実データのセル範囲を特定する事です。そんなときは発想の転換をしましょう。タイトル行を含むデータ範囲は、CurrentRegionプロパティで簡単に取得できます。この時Excelはちゃんと表示されているセルだけを返してくれます。そこでタイトル行を含むデータ全体を別のシートにコピーして、タイトル行(ここでは1行目)を削除しましょう。
111.条件付き書式を設定する1
サンプルは、セル範囲のA1:A10にセルの値が40から60の条件付き書式を設定しています。条件付き書式は、FormatConditionオブジェクトで表されます。条件付き書式を設定するには、FormatConditionsコレクションに新しいFormatConditionオブジェクトを追加します。引数Typeには次の定数を指定します。
xl
xl
xl
112.設定されている条件付き書式の数を調べる
セルには複数の条件付き書式を設定できます。設定できる条件付き書式は、Excel2003までは3つ。Excel2007以降では、設定できる条件の数はPCに搭載されているメモリの量に依存します。事実上は無制限と考えていいでしょう。セルに設定されている条件付き書式の数はFormatCoditionsコレクションのCountプロパティで分かります。
113.条件付き書式を削除する
条件付き書式の条件を削除するには、FormatConditionオブジェクトのDeleteメソッドを使います。条件の削除をマクロ記録すると、一度全ての条件を削除し、削除しなかった条件を再設定するというコードが記録されますが、実際には個別に削除できます。
114.条件付き書式を設定する2
サンプルは、セル範囲A1:A10に数式が=A1=MAX($A$1:$A$10)の条件付き書式を設定しています。数式がの条件付き書式を設定するときは、引数TypeにxlExpressionを指定して、引数Formula1に数式を指定します。Formula1に指定する数式で、相対参照で指定しているアドレスは、選択範囲内(ここではセル範囲A1:A10)のアクティブセルの位置と関連します。サンプルではRange(“A1:A10”).Cells(1)はセルA1なので、相対参照で指定するセルもA1になります。
115.条件付き書式を設定する3
サンプルはセル範囲A1:A10にセルの強調表示ルール→指定の値より大きいで60より大きいの条件付き書式を設定しています。指定の値より大きいを指定するときは、引数Typeに定数xlCellValueを指定して、引数Operatorに定数xlGreaterを指定します。Excel2007のリボンに追加された条件付き書式のセルの強調表示ルールは、同等の条件付き書式をワンタッチで指定できるようにした機能です。同じコードでExcel2003に設定することも可能です。
116.条件付き書式を設定する4
サンプルは、セル範囲A1:A10に上位/下位ルールで平均より上の条件付き書式を設定しています。この機能はExcel2007で追加されました。AddAboveAvverageメソッドは、AddAboveAverageオブジェクトを返します。AddAboveAverageオブジェクトはセル範囲内で平均または標準偏差より、上または下の値を見つけるために使用されます。AddAboveAverageメソッドで挿入したAddAboveAverageオブジェクトのAboveBelowプロパティには次の定数を指定します。
xl
xl
xl
117.条件付き書式でグラデーションのデータバーを設定する
サンプルは、セル範囲A1:A10にデータバー→塗りつぶしグラデーションの条件付き書式を設定しています。この機能はExcel2007で追加されました。AddDatabarメソッドは指定された範囲で、データバーの条件付き書式ルールを示すDatabarオブジェクトを返します。条件付き書式のデータバーはExcel2007で追加された機能ですが、データバーを単色で表示する機能はExcel2010で追加されました。Excel2007ではデータバーを単色表示できません。したがってExcel2007でデータバーを設定するときは、BarFillTypeプロパティの設定を省略してください。BarFillTypeプロパティを省略すると、グラデーションが指定されたものとみなします。
118.条件付き書式で単色のデータバーを設定する
散布rは、セル範囲A1:A10にデータバー→塗りつぶし単色の条件付き書式を設定しています。この機能はExcel2010で追加されました。AddDatabarメソッドは、指定された範囲でデータバーの条件付き書式ルールを示すDatabarオブジェクトを返します。データバーの単色を指定するときは、BarFiillTypeプロパティに定数xlDataVarFillSolidを指定します。BarFillTypeプロパティを省略すると、データバーのグラデーションを表す定数xlDataBarFillGradientが指定されたものとみなします。
119.データバーの数値を非表示にする
条件付き書式のデータバーを設定すると、データバーだけでなく、セル内の数値も表示されたままになります。セル内の数値を非表示にしてデータバーだけを表示するには、条件付き書式(FormatConditionオブジェクト)のShowValueプロパティにFalseを指定します。サンプルでは、セル範囲A1:A10に設定した条件付き書式のうち、先頭1番目の条件を操作しています。
120.ルールの優先順位を変更する
同じセルに複数設定した条件付き書式には、ルールが適用される優先順位があります。ルールの優先順位は、ルールの管理を実行して表示される条件付き書式ルールの管理ダイアログボックスで指定できます。上に登録されているのが、最も優先順位の高いルールです。FormatConditionオブジェクトのSetFirstPriorityメソッドを実行すると、指定したルールの優先順位を最上位にします。
121.条件を満たす場合に停止する
同じセルに複数の条件付き書式が設定されているとき、あるルールの条件に一致したら、それ以降のルールを適用させないようにできます。これはExcel2007で追加された機能です。条件が一致したとき、それ以降のルールを適用させないようにするには、FormatConditionオブジェクトのStoplfTrueプロパティにTrueを設定します。なお、データバー、カラースケール、アイコンセットの条件付き書式で、StopIfTrueプロパティを設定することはできません。
122.最短のバーと最長のバーを設定する
データバーを設定するとき、最短のバーと最長のバーをそれぞれどのように評価するかを指定できます。最短のバーはMinPointプロパティで表され、最長バーはMaxPointプロパティで表されます。設定するときは、Modifyメソッドを使います。Modifyメソッドの書式は次の通りです。
Modify newtype, newvalue
引数newtypeにはバーを評価する方法を次の定数で指定します。
引数newvalueには、引数newtypeで指定した評価に設定する値や数式を指定します。サンプルでは、最小値にセルA2の値を設定しています。最大値には数式を使って、2番目に大きい数値を指定しています。数式を指定する場合は、セルのアドレスを絶対参照にしなければならなりません。
123.データバーの方向を指定する
データバーが表示されている方向を指定するには、Directionプロパティに次の定数を指定します。
このプロパティはExcel2010で追加されました。
124.バーの枠線を設定する
データバーの枠線はBarBorderオブジェクトで表されます。枠線を表示するかしないかは、Typeプロパティに次の定数を指定します。
xl
xl
枠線を表示する場合、枠線の色を指定できます。枠線の色はFormatColorオブジェクトで表されます。サンプルの.Color.Colorは左のColorプロパティがFormatColorオブジェクトを返し、右のColorプロパティはFormatColorオブジェクトの色を表すプロパティです。.Color.ColorIndexや.Color.ThemeColorを使うことも可能です。
125.マイナスのバーを設定する
データバーを設定した範囲内にマイナスの数値があるとき、マイナスのデータバーを区別して表示できます。これはExcel2010で追加された機能です。マイナスのバーを塗りつぶす色は、NegativeBarFormatオブジェクトのColorTypeプロパティに次の定数を指定します。
xl
xl
xl
定数xlDataBarColorを指定した場合は、Colorプロパティで色を指定できます。マイナスのバーとプラスのバーを区切る軸は、AxisPosionプロパティで指定します。
xl
xl
xl
126.カラースケールの条件付き書式を設定する
サンプルは、セル範囲A1:A10にカラースケールの条件付き書式を設定しています。塗分ける色は2色です。この機能はExcel2007で追加されました。カラースケールを設定するときは、FormatConditionsコレクションのAddColorScaleメソッドを実行します。引数ColorScaleTypeには、塗り分ける式数(2または3)を指定します。各色はColorScaleCriteriaオブジェクトとして設定します。
Color
Color
Color
各色のTypeプロパティには、次の定数を指定します。
127.アイコンセットの条件付き書式を設定する
サンプルは、セル範囲A1:A10にアイコンセットの条件付き書式を設定しています。アイコンセットの種類は指定していませんので、標準のxl3TrafficLights1:3つに信号(枠なし)が指定されたとみなします。
128.アイコンセットを変更する
アイコンセットの種類を設定するには、条件付き書式(FormatConditionオブジェクト)のIonSetプロパティにWorkbookオブジェクトのIconSetsプロパティによって取得できるアイコンセットを設定します。IconSetsプロパティには、次の定数を指定できます。
xl
xl
x
129.アイコンの順序を逆にする
アイコンの表示順位を逆順にするかどうかは、FormatConditionオブジェクトのReverseOrderプロパティで設定します。ReverseOrderプロパティにTrueを設定すると、アイコンの表示順が逆になります。
130.アイコンだけ表示する
アイコンセットの条件付き書式を設定したセルで、セル内のデータを非表示にして、アイコンだけを表示するには、FormatConditionオブジェクトのShowIconOnlyプロパティにTrueを設定します。
131.ハイパーリンクを挿入する
Hyperlinks.Add(Anchor,Address,TextToDisplay)
セルにハイパーリンクを挿入するには、HyperlinksコレクションのAddメソッドを実行します。引数Anchorにはハイパーリンクを挿入するセルを指定し、引数Addressには表示したいWebページのURLを指定します。
引数TextToDisplayには、セルに表示する文字列を指定します。指定したセルには、この文字列が代入されます。引数AddressにURLを指定した場合、ハイパーリンクをクリックすると標準のブラウザが起動します。
Sub sample131()
ActiveSheet.Hyperlinks.Add _
Anchor:=Range(“B3″), _
Address:=”http://yahoo.co.jp/”, _
TextToDisplay:=”ヤフー”
End Sub
132.ハイパーリンクのリンク先にメールアドレスを指定する
ハイパーリンクのリンク先にメールアドレスを指定する場合は、メールアドレスの先頭にmailto:を付けます。リンクをクリックすと標準のメールソフトが起動してメールの本文を入力できます。
Sub sample132()
ActiveSheet.Hyperlinks.Add _
Anchor:=Range(“B3″), _
Address:=”mailto:keishiro720@gmail.com”, _
TextToDisplay:=”メール送信”
End Sub
133.メールの件名を指定する
ハイパーリンクのリンク先にメールアドレスを指定している場合、リンクをクリックすると標準のメールソフトが起動して、メールの本文を入力できます。このとき、タイトルも同時に指定したい場合は、HyperlinkオブジェクトのEmailSubjectプロパティにタイトルの文字列を設定しておきます。引数うAddressにmailto:abc@xyz?subject=ご確認ください。と設定されていてもEmailSubjectプロパティの方が優先されます。
Sub sample133()
ActiveSheet.Hyperlinks(1).EmailSubject = “資料です”
End Sub
134.ハイパーリンクを挿入して任意のセルにジャンプさせる
ハイパーリンクは任意のセルにジャンプさせることも可能です。例えば同じブックのSheet3のセルA1にジャンプさせるには、サンプルのようjにSheet3!A1と指定します。別のブックにジャンプさせるときは、[Book2.xlsx]Sheet3!A1のようにブック名を指定しますが、ジャンプ先のブックが開いていないとエラーになります。Addメソッドの引数Addressには空欄を指定します。省略してはいけません。
Sub sample134()
ActiveSheet.Hyperlinks.Add Anchor:=Range(“B3″), _
Address:=””, _
SubAddress:=”Sheet3!A1″, _
TextToDisplay:=”メニューシート”
End Sub
135.ハイパーリンクを挿入してジャンプ先にブックを指定する
ハイパーリンクのジャンプ先に、ファイル名を指定すると、そのファイルを開くことができます。Excelのブックを指定した場合は、現在作業中のExcelを開きます。Excelのブックだけでなく、例えばAddress:=C\Work\リンク先.txt”のように任意のデータファイルを指定することも可能です。この場合、ファイルに関連づけられているアプリケーションが起動して、指定したファイルを開きます。なお、指定したファイルが存在しないときはエラーになります。
1 2 3 4 5 |
Sub sample135() ActiveSheet.Hyperlinks.Add Anchor:=Range("B3"), _ Address:="C:\User\keishiro tsuchiyama\Desktop\下書き.txt", _ TextToDisplay:="メニューシート" End Sub |
136.ハイパーリンクのツールチップを設定する
挿入したハイパーリンクにマウスポインタを合わせると、「リンク先に移動するには~といったツールチップがポップアップします。このツールチップは、HyperlinkオブジェクトのScreenTipプロパティで任意の文字列に変更できます。標準のツールチップに戻すには、ScreenTipプロパティに空欄””を指定します。
1 2 3 |
Sub sample136() ActiveSheet.Hyperlinks(1).ScreenTip = "クリックしてください" End Sub |
137.ハイパーリンクを開く
セルに挿入したハイパーリンクを開くには、HyperlinkオブジェクトのFollowメソッドを実行します。
1 2 3 |
Sub sample137() ActiveSheet.Hyperlinks(1).Follow End Sub |
138.ハイパーリンク先ファイルを新規に作成する
ハイパーリンクのリンク先に別ファイルを指定しているとき、CreateNewDocumentメソッドを実行すると、その名前の新しいファイルを作成して開くことができます。
1 2 3 4 5 |
Sub sample138() With ActiveSheet.Hyperlinks(1) .CreateNewDocument .Address, True, True End With End Sub |
139.ハイパーリンクを削除する
object.Hyperlinks.Delete
ハイパーリンクを削除するときは、HyperlinkオブジェクトのDeleteメソッドを実行します。ハイパーリンクには、自動的に青文字+下線の書式が設定されますが、これはユーザーが自由に変更できます。ハイパーリンクを設定したセルに対して太字+20ポイントなどの書式を設定することも可能です。ただし、HyperlinkオブジェクトのDeleteメソッドを実行すると、こうしたユーザーが独自に設定した書式はすべてクリアされて標準の状態に戻ります。
1 2 3 |
Sub sample139() Range("B3").Hyperlinks.Delete End Sub |
140.ハイパーリンクをクリアする
Deleteメソッドでハイパーリンクを削除すると、ユーザーが設定した独自の書式もクリアされてしまいます。そうではなく、書式はそのままで、ハイパーリンクだけをクリアするには、ClearHyperlinksメソッドを実行します。ClearHyperlinksメソッドはExcel2010で追加された機能です。
1 2 3 |
Sub sample140() Range("B3").ClearHyperlinks End Sub |
141.セル内改行されているか調べる
Windowsで一般的に使われている改行コードは、16進数の0Dと0Aの2文字です。VBAでは、この改行コードにvbCrLfという定数が割り当てられています。
したがってmagbox “A” & vbCrLf & “B”とすれば、改行された文字列を表示できます。セル内で改行されているかどうかは、セル内の文字にこうした改行コードがふくまれているかどうかを判定すれば分かります。ただし注意が必要です。
Excelでは、セル内でAlt + Enterキーを押して改行した時、挿入される改行コードは0Aの1文字です。InStr関数で判定するときは、16進数の0Aを表すvbLfを探してください。
1 2 3 4 5 6 7 |
Sub sample141() If InStr(ActiveCell, vbLf) > 0 Then MsgBox "改行されています" Else MsgBox "改行されていません" End If End Sub |
142.セル内の改行コードを削除する
Excelではセル内でAlt + Enterキーを押して改行した時、挿入される改行コードは、16進数の0A1文字です。セル内改行されている文字列から、改行コードを削除するには、この0Aを除去します。サンプルでは、RePlace関数で改行コードを空欄””に置換します。VBAでは一般的に使われる改行コードに次のような定数が割り当てられています。
0D:vbCr
0A:vbLf
0D0A:vbCrLf
1 2 3 |
Sub sample142() ActiveCell = Replace(ActiveCell, vbLf, "") End Sub |
143.特定のセルを含むセル範囲を取得する
Excelはひとかたまりのセルの範囲を認識できます。グラフやピボットテーブルを作るとき、データが入力されている全ての範囲を選択しなくても、範囲内に存在する任意のセルを選択しておけば、そのセルが含まれているひとかたまりのセル範囲を自動で認識してくれます。同じことは、CurrentRegionプロパティで実現できます。
1 2 3 4 |
Sub sample143() ActiveCell.CurrentRegion.Select MsgBox Range("A1").CurrentRegion.Address End Sub |
144.列の幅を自動調整する
入力されているセルに合わせて列幅を自動調整するには、AutoFitメソッドを使います。AutoFitメソッドの対象として指定できるのは、セル(Rangeオブジェクト)ではなく列(Columnオブジェクト)です。A列を自動調整しようとしてRange(“A1”).AutoFitとするとエラーになります。セルA1が属する列A列を取得するには、Range(“A1”).EntireColumnのようにEntireColumnプロパティを使います。
1 2 3 4 |
Sub sample144() Columns("A:A").AutoFit Range("B1").EntireColumn.AutoFit End Sub |
145.選択範囲の列幅を自動調整する
列幅を自動調整するには、列見出しの境界をダブルクリックします。この操作をVBAで実現するのがAutoFitメソッドです。Excelにはもう一つ選択範囲の列幅を自動調整する機能があります。例えば、セルA1に長い文字列がタイトルとして入力されていると、A列を自動調整すると、このタイトルに合わせた列幅になってしまいます。タイトルを除いた、実データだけで自動調整するときは、自動調整したいセル範囲内の列に対してAutoFitメソッドを実行します。
1 2 3 |
Sub sample145() Range("A3:B5").Columns.AutoFit End Sub |
146日付(年・月・日)からシリアル値を取得する.
日付(年月日)が、複数のセルに数値として入力されていると、これはシリアル値ではないため、計算や変数はできません。このように分割入力されている数値をシリアル値に変換するには、DateSerial関数を使います。DateSerial関数の書式は上のようになり、年月日をそれぞれ数値で指定します。あり得ない数値を指定するとExcelが適切な日付に置き換えてくれます。例えばDateSerial(2010,13,32)は2011/2/1を返します。
1 2 3 4 5 |
Sub sample146() Dim D As Date D = DateSerial(Range("A2"), Range("B2"), Range("C2")) MsgBox D End Sub |
147.文字列からシリアル値を取得する
文字列形式の日付をシリアル値に変換するには、DateValue関数を使います。日付に変換できない文字列を変換しようとするとエラーになるので、事前にIsDate関数で日付に変換できる文字列かどうかを判定します。平成22年5月3日(月)のように曜日まで入力されていると、日付には変換できません。
1 2 3 4 5 6 7 |
Sub sample147() If IsDate(Range("B2")) Then MsgBox DateValue(Range("B2")) Else MsgBox Range("B2") & "は日付に変更できません" End If End Sub |
148.日付から年を取得する
日付(シリアル値)から年を取得するには、Year関数を使います。日付の左から4文字が年であるという判断では、Windowsの設定が変わった場合などで誤動作を起こします。年を取得するときは、素直にYear関数を使いましょう。
1 2 3 |
Sub sample148() MsgBox Year(Range("B2")) End Sub |
149.日付から月を取得する
日付(シリアル値)から月を取得するには、Month関数を使います。日付関数のYear関数、Month関数、Day関数は引数に文字列や空白””を指定するとエラーになりますが、空欄のセルは0とみなされるので、シリアル値の0が示す1899/12/30が返ります。
1 2 3 |
Sub sample149() MsgBox Month(Range("B2")) End Sub |
150.日付から日を取得する
日付(シリアル値)から日を取得するには、Day関数を使います。
1 2 3 |
Sub sample150() MsgBox Day(Range("B2")) End Sub |
151.日付から曜日を取得する1
WeekDay(date)
日付(シリアル値)から曜日を取得するには、いくつかの方法があります。1つは、Weekday関数を使う方法です。Weekday関数は、曜日を表す数値を返します。標準では、曜日が1で土曜が7です。Weekday関数で調べた曜日を示す数値からChoose関数などで曜日の文字列に変換します。
1 2 3 4 5 |
Sub sample151() Dim n As Long n = Weekday(Range("B2")) MsgBox Choose(n, "日", "月", "火", "水", "木", "金", "土") End Sub |
152.日付から曜日を取得する2
Weekday関数で調べた数値は、WeekdayDame関数で曜日を表す文字列に変換することもできます。WeekdayName関数が返す曜日文字列の書式は変更できます。
1 2 3 4 5 |
Sub sample152() Dim n As Long n = Weekday(Range("B2")) MsgBox WeekdayName(n) End Sub |
153.日付から曜日を取得する3
日付(シリアル値)から曜日を取得するには、Format関数を使うと便利です。Format関数は、セルに表示形式を設定した結果を返す関数です。セルの初期設定ダイアログボックスで使用できる書式記号が使えます。Format関数を使って、年月日を調べることも可能ですが、Year関数、Month関数、Day関数は数値を返すのに対してFormat関数は常に文字列を返します。
1 2 3 4 5 6 |
Sub sample153() MsgBox Format(Range("B2"), "aaa") & vbCrLf & _ Format(Range("B2"), "aaaa") & vbCrLf & _ Format(Range("B2"), "ddd") & vbCrLf & _ Format(Range("B2"), "dddd") End Sub |
154.日付を計算する
セルに日付(シリアル値)が入力されているとき、日付を数値のように計算できます。
155.月末の日を取得する
ある月の月末日を調べるにはどうしたらいいでしょう。例えば8月の月末は31日です。この8月31日は9月1日の前日です。つまり月末日とは翌月1日の前日ということです。DateSerial関数で翌月1日のシリアル値を取得し、そこから1を引けば月末の日になります。
1 2 3 4 5 6 |
Sub sample155() Dim D As Date With Range("B2") MsgBox DateSerial(Year(.Value), Month(.Value) + 1, 1) - 1 End With End Sub |
156.和暦に変換する
日付シリアル値の西暦を環暦に変換するには、Format関数を使います。Format関数はセルの表示形式を設定した結果を返す関数です。和暦に関しては、次のような書式記号を使用できます。
g
gg
ggg
e
157.時間を計算する
時間(シリアル値)の計算も、足し算や引き算が可能ですが、時間を表すシリアル値は少数なので、そのままで普段使う時間にはなりません。時分秒を表すには、計算結果をFormat関数で変換するといいでしょう。1時間32分を92分のようにあらわすには、時間を単位(ここでは分)で割ります。1分を表すシリアル値はTimeValue関数で取得できます。
158.日付が今年の第何周目か調べる
日付がその年の第何週にあたるかは、Format関数の書式記号wwで取得できます。
1 2 3 |
Sub sample158() MsgBox Format(Range("B2"), "ww") End Sub |
159.日付が今年の何日目か調べる
日付がその年の何日目にあたるかは、Format関数の書式記号yで取得できます。
1 2 3 |
Sub sample159() MsgBox Format(Range("B2"), "y") End Sub |
160.日付がどの四半期であるか調べる
日付の四半期は、Format関数の書式記号qで取得できます。第一四半期は1から3月です。四半期のスタート月を変更することはできません。
1 2 3 |
Sub sample159() MsgBox Format(Range("B2"), "q") End Sub |
161.セルが選択されているかどうか判定する
Selectionプロパティは、現在選択されているオブジェクトを返します。必ずしもセルとは限りません。セルが選択されているかどうかは、Type関数で調べることができます。
162.確実にセルを操作する
何が選択されているかにかかわらず、確実にセルを操作したいのであれば、Selectionではなく、RangeSelectionプロパティを使いましょう。RangeSelectionプロパティは、ワークシート(Worksheetオブジェクト)のプロパティではなく、Windowオブジェクトのプロパティです。
163.セルに名前をつける
セルの名前はNameオブジェクトで表されます。セルに名前を付けるということは、新しいNameオブジェクトを追加する事です。操作をマクロ記録すると、セルのアドレスがR1C1形式で記録されますが、使い慣れたA1形式でも問題ありません。
164.セルの名前を削除する
セルの名前を削除するには、NameオブジェクトのDeleteメソッドを使います。
165.相対参照と絶対参照を変換する
数式内で参照しているアドレスの相対参照と絶対参照を変換するには、ApplicationオブジェクトのConvertFormulaメソッドを使います。先頭の引数Formulaには、変換元の数式を指定します。数式は戦闘が=で始まらなければいけません。2番目の引数FromReferenceStypeには、変換元の数式がA1/R1C1参照形式のどちらかなのかを次の定数で指定します。
166.コメント内を検索する
セル内のデータを検索するFindメソッドは、引数LookInに定数xlCommentsを指定すると、コメント内を検索できます。検索した文字(ここでは「売上」が見つかるとFindメソッドは、そのコメントが挿入されているセル(Rangeオブジェクト)を返します。
167.複数のコメント内を検索する
ワークシートに複数のコメントが挿入されていて、その中から特定の文字が含まれるコメントだけを全て検索するには、コメントの名kを1つずつチェックする手もあります。サンプルはまずセル範囲A1:D7内でコメントが挿入されているセルを探し、次にコメントの中に注意という文字が含まれているかどうかを判定しています。
168.特定のセルを操作する
F5キーを押して開くジャンプダイアログボックスのセル選択ボタンをクリックすると、様々な条件でセルを選択できるセル選択ダイアログボックスが表示されます。このダイアログボックスでは、特定のセルを選択することしかできませんが、VBAを使えば選択せずに操作することも可能です。。サンプルは表内の空白セルだけ背景を赤く塗りつぶします。
169.数値が入力されているセルのみを操作する
サンプルは表内で数値が入力されているセルだけ値をクリアします。数式や文字列が入力されているセルは対象外です。
170.エラーになっているセルを操作する
サンプルは表内でエラーになっているセルを探し、そのセルのアドレスと入力されている数式を表示します。
171.表内のコメントを操作する
サンプルは表内で挿入されている全てのコメントをセルA11から下に列挙します。
172.条件付き書式が設定されていないセルを操作する
サンプルは、データを入力するセル範囲B2:D7内で、条件付き書式が設定されていないセルを調べます。
173.入力規則が設定されていないセルを操作する
サンプルでは、セル範囲B2:D7内で、入力規則が設定されていないセルの背景を青色で塗りつぶします。
174.空白行を削除する
表内の空白行を全て削除するには、どうしたらいいでしょう。A列を上から順にみていき、もしセルが空白だったら行を削除する。そんな手間をかけるより、SpecialCellsメソッドを使えば、1行で削除できます。
175.重複しないリストを作る
A列にたくさん名前が入力されていたとします。この中から重複しない名前のリストを作成するには、どうしたらいいでしょう。これには、Collectionオブジェクトを使います。Collectionオブジェクトとはユーザーが独自の要素を追加してコレクションを作成できるオブジェクトです。Collectionオブジェクトには重複したKeyを設定することができません。この特性を利用すると、重複しないリストを作成することが可能です。
176.全てのセルを検索する
FindNextメソッドは、直前の検索を繰り返す命令です。セル内を同じ条件ですべて検索するには、最初に見つかったセルに戻るまで、次々とFindNextメソッドを実行します。サンプルは見つかったセルを選択しています。
177.重複しているか判定する
あるデータが重複しているかどうか判定するには、どうしたらいいでしょう。重複しているということは、同じデータが2つ以上あるという事なので、データが入力されている全てのセルをチェックして、2つ以上あるデータが重複していると判断できます。いわゆる力業ですね。
178.オートフィルタで重複しているか判定する
重複しているかどうかの判定に、オートフィルタを使う手もあります。任意のデータをオートフィルタで絞り込んだ結果、該当する行が2つ以上あったら、それは重複しているという事です。サンプルで>2と判定しているのは、タイトル行が含まれてるからです。
179.CountIF関数で重複しているか判定する
重複しているかどうかを判定するという事は、そのデータが何個あるか調べるという事です。もしワークシート上で行うなら、迷わずCOUNTIF関数を使うことでしょう。であれば、VBAからCOUNTIF関数を呼び出せば簡単に判定できます。
180.2つのセル範囲を入れ替える
プログラムで何かを入れ替える時は、まずAをどこかに格納し、次にBをAに代入します。最後に格納していたAをBに代入して終了です。では2つのセルやセル範囲を入れ替えるにはどうしたらいいでしょう。問題は、Aをどこに格納するかです。一般的な変数ではセルの書式が格納できません。オブジェクト型変数では、Bを代入した時点でオブジェクト変数の中も変わってしまいます。こんなときは、別の空いているセルにAを一時待避させます。確実に空いているセルとはどこでしょう。それは新しく挿入したワークシート上のセルです。
181.重複データを削除する
重複データを削除する機能は、Excel2007から追加されました。セル範囲から重複しているデータを削除するには、RemoveDuplicatesメソッドを使います。RemoveDuplivatesメソッドの引数Columnsには、重複をチェックする列の位置を配列で指定します。引数Headerには、先頭行をタイトル行とみなすかどうかを表す定数xlYesまたは定数xlGuessを指定します。RemoveDuplicatesメソッドでは、重複しているデータのうち、先頭行だけが残されます。
182.スパークラインを挿入する
スパークラインを挿入する機能はExcel2010で追加されました。スパークラインを追加するには、SparklineGroupsコレクションのAddメソッドを使います。引数Typeには、スパークラインの種類を表す定数を指定します。引数SourceDataには、スパークラインの元になる数値が入力されているセル範囲を指定します。
183.スパークラインをクリアする
単一セルのスパークラインをクリアするには、Clearメソッドを使います。スパークラインのグループ全体をクリアするには、ClearGroupメソッドを使います。
184.スパークラインの種類を設定する
スパークラインの種類を設定するには、Typeプロパティに次の定数を指定します。
xl
スパークラインの種類は、スパークラインを挿入するAddメソッドの引数Typeでも指定できます。使用できる定数は同じです。
185.空白セルのプロット方法を設定する
空白セルをスパークラインにプロットするときの方法は、DisplayBlanksAsプロパティに次の定数を指定します。
xl
xl
xl
186.非表示列をプロットする
標準のスパークラインでは、非表示列はプロットされません。非表示列もプロットするには、DisplayHiddenプロシージャにTrueを設定します。
187.日付を検索する
セルにシリアル値が入力されている場合、Findメソッドで日付を検索するときは、引数WhatにDateValue関数等で変換したシリアル値を指定します。What:=”2010/7/20″のように文字列形式で指定すると、検索に失敗します。また引数LookInには、定数xlFormulaを指定します。
188.数式で入力されている日付を検索する1
セルにシリアル値が入力されているのではなく「=A2+1」のような数式が入力されている場合は、そのセルに設定されている表示形式によって検索の方法が異なります。サンプルはセルA2にシリアル値2010/7/1を入力し、セルA3以降は=A2+1という数式を入力してコピーしています。表示形式に*2001/3/14のように先頭*の付く標準の表示形式を設定しているときは、Findメソッドの引数WhatにはDateValue関数を指定してください。そして引数LookInには定数xlValuesを指定します。
189.数式で入力されている日付を検索する2
188で開設したようにセルにシリアル値が入力されているのではなく、=A2+1のような数式が入力されている場合は、そのセルに設定されている表示形式によって検索の方法が異なります。サンプルはA2にシリアル値2010/7/1を入力値
190.連続データを作成する
連続データを作成するときは、AutoFillメソッドを使います。これは、セルのフィルハンドルをドラッグするのと同じ操作です。AutoFillメソッドの引数には、連続データを作成するセル範囲を指定します。
191.プログラムの内部で連続データを作成する
AutoFillメソッドは便利な機能ですが、ワークシート上でしか実行できません。プログラムの内部で連続データだけを生成したいときは、ダミーのワークシートを挿入して連続データを作成し、配列を入れるなどしてからダミーのワークシートを削除します。
192.相対的な位置のセルを操作する
Offsetプロパティは、あるセルから見て●行下で×列右のように、相対的な位置にあるセルを返します。サンプルのようにすでに入力されているデータの末尾に新しいデータを追記するようなときに便利です。
193.選択範囲の大きさを変更する
単一のセルは1行×1列の大きさを表されます。こうしたセル範囲の大きさを変更するには、Resizeプロパティを使います。サンプルでは、A列の単一セルを1行×3列の大きさに変更して、色を塗っています。
194.セルの背景色を設定する
セルの背景色を設定するには、InteriorオブジェクトのColorIndexプロパティに色番号を指定します。指定している3はExcelの標準的な色パレットで赤色が設定されている色番号です。
195.RGB関数でセルの背景色を設定する
色を設定できるオブジェクトには、色番号を指定するColorIndexプロパティとRGB関数によって色を指定するColorプロパティがあります。RGB関数は赤、緑、青をそれぞれ0~255の数値で指定します。数値によって、淡い中間色を指定することもできますが、Excel2003まではワークシート上で56色までしか表現できません
Excel2007以降は1600万色まで表示できるので、淡い中間色を表現することも可能です。
196.ThemeColorプロパティでセルの背景色を設定する
Excel2007からはテーマという機能が実装されました。文字の色や背景署などで使用する色パレットは、上部にテーマの色が並んでいます。これらは絶対的な色を示しているのではなく、現在設定されているテーマのアクセントに割り当てられている色を表しています。したがってテーマの色は設定しているテーマによって変化します。テーマの色を設定するにはThemeColorプロパティにテーマの色を表す定数を指定します。
197.TintAndShadeプロパティでセルの背景色を設定する
TintAndSahadeプロパティは色の明暗を表すプロパティです。ColorプロパティやThemeColorプロパティなどで指定した色を、明るく表示するか、暗く表示するかを決めます
TintAndShadeプロパティには-1最も暗いから1最も明るいまで数値を指定します。実際には、-1を指定するとどんな色であっても黒色になり、1を指定すると白色になります。
198.セルの背景パターンを設定する
セルの背景にパターンを設定するときは、InteriorオブジェクトのPatternプロパティにパターンを表す定数を指定します。パターンの色はInteriorオブジェクトのColorプロパティやColorIndexプロパティなどで指定します。
199.セルの背景にグラデーションを設定する
Excel2007からはセルの背景にグラデーションを設定できるようになりました。グラデーションを設定するには、InteriorオブジェクトのPatternプロパティにxlPatternLinerGradientを設定します。GradientオブジェクトのDegreeプロパティは、色が変化する方向の角度を指定します。
続いてグラデーションを構成する色を2つ指定しますが、その前に色の情報をくりあしておきます。色はColorStopオブジェクトで表され、Addメソッドで追加します。Addメソッドの引数(0)は0番目に追加せよという意味です。追加したColorStopオブジェクトは、ColorプロパティやThemeColorプロパティで色を設定します。ColorIndexプロパティは使えません。
200.セルの背景に対角線方向や放射状のグラデーションを設定する
Patternプロパティに定数xlPatternRectangularGradientを指定すると、対角線方向や放射状のグラデーションを設定できます。上下左右の位置は、RectangleLeftプロパティなどで指定します。
201.ピボットテーブルを作成する
ピボットテーブルを作成するときは、まずピボットキャッシュを作り、そのキャッシュからピボットテーブルを作成します。ピボットテーブルの作成をマクロ記録すると、膨大で難解なコードが記録されますが、整理すると、ピボットテーブルの作成に最低限必要なコードはこのサンプル程度になります。
202.ピボットテーブルの存在を確認する
ピボットテーブルが存在するかどうかは、ワークシートにPivotTableオブジェクトが存在するかどうかで確認できます。またピボットテーブルの名前はNameプロパティで調べられます。
203.レイアウト内容を調べる
ピボットテーブルの列フィールドや行フィールドなどの全てのフィールドはPivotFieldオブジェクトとして操作できます。サンプルでは、それぞれのフィールドにレイアウトされている項目名を取得しています。Orientationプロパティはフィールドの位置を次の定数で設定・取得できます。
xl
xl
xl
xl
xl
サンプルが、データフィールドにレイアウトした金額のOrientationプロパティが0を返すのはおそらくバグでしょう。
204.フィールドのアイテムを取得する
フィールドに集計されているアイテムは、PivotItemオブジェクトとして操作できます。サンプルでは、行フィールドにレイアウトした名前に集計されているアイテムを表示しています。
205.特定のデータだけコピーする
PivotItemオブジェクトのDataRangeプロパティは、そのアイテムが集計されているセル範囲を返します。Rangeオブジェクトを返すのでコピーもできます。
206.特定の集計結果を取得する
GetDataメソッドは、指定したフィールドやアイテムの集計結果を取得できます。
207.テーブルに変換する
範囲をテーブルに変換するには、ListObjectsコレクションのAddメソッドを実行します。マクロ記録では、テーブルに変換すると同時に、てーぶるの名前を設定するコードが記録されますが、あえて名前を設定しなくても、テーブルを作れば自動的に(便宜的な)名前が設定されます。
208.テーブルの装飾をクリアする
ショートカットキーやマクロでテーブルを作成すると、標準で「テーブルスタイル(中間)2」というスタイルが設定されます。こうしたあらかじめ組み込まれているテーブルスタイルを適用したくない時は、スタイルをクリアしましょう。テーブルのスタイルをクリアするには、TableStyleプロパティに空欄を代入します。テーブルに指定できるスタイルは、WorkbookオブジェクトのTableStylesコレクションに登録されています。任意のスタイルをテーブルに適用するには、TableStylesコレクションに登録されています。任意のスタイルをテーブルに適用するには、TableStylesコレクション内で指定したいスタイルの名前を探し、その名前をListObjectオブジェクトのTableStyleプロパティに設定します。
209.テーブルに新しいデータを追加する
テーブルは、Excelがデータベースとして管理する特別な領域です。テーブルに新しいデータを使いするとき、Range(“A8”)=”桜井”のようにセルのアドレスを指定することもできますが、これはテーブルのお作法に反してします。例えば一般のワークシートと同じ感覚で、
のようにすると予期しない結果になります。実際に試してください。
テーブル内の”行”は、ListRowオブジェクトで表されます。新しい行を挿入するときは、まずListRowsコレクションのAddメソッドで空の行を追加し、その追加したセルに値を代入します。
210.テーブルに新しい列を追加する
テーブルの列はListColunオブジェクトで表されます。列全体がListColumnsコレクションです。テーブルに新しい列を追加するには、このListCoumnsコレクションのAddメソッドを実行します。列のタイトルは、Nameプロパティに任意の文字列を指定します。ただし、そのテーブル内ですでに使われているタイトルは指定できません。同じタイトルを指定すると無視されて列1など便宜的なタイトルがつけられます。
テーブル内の列を指定するときは、構造化参照を使います。下記サンプルコードではRage(テーブル1[計算])のようにテーブル名を決め打ちしていますが、汎用的なマクロにするためには、テーブル名をListObjects(1).Nameで取得してください。
211.テーブルに行を挿入する
テーブルで特定の列内を検索し、行を挿入します。Findメソッドで検索する列は、ListColumnオブジェクトのDataBodyRangeプロパティで指定します。DataBodyRangeプロパティは列のタイトルや集計行を除く、テーブルのデータ領域を表します。
Offsetプロパティを使って、見つかったセルの1行下に新しい行を挿入(Insert)していますが、このとき行ではなくセルを挿入している点に留意してください。テーブルはExcelがデータベースとして管理する特別な領域です。セル単体の挿入や削除は許されていません。データベースのレコードがずれるからです。テーブルでは、セルを挿入・削除することで、テーブル内の行が挿入・削除されます。
212.テーブルをオートフィルタで絞り込む
テーブルには、自動的にオートフィルタが設定されます。このオートフィルタを操作するには、一般のセル範囲と同様にAutoFilterメソッドを使いますが、ListObjects(1).AutoFilterとしてはいけません。ListObjectオブジェクトは、Excelが管理する特別な領域です。オートフィルタはその特別な領域ではなく、テーブル内のセル範囲で使える機能です。ListObjectオブジェクトのRangeプロパティはテーブルのセル範囲を表します。
213.テーブルの列見出しを探す
ある列見出しを探すには、ListColumnオブジェクトのNameプロパティを調べます。見つかった列見出しが、テーブル内で左から何番目にあるかは、ListColumnオブジェクトのIndexプロパティで取得できます。しかし必ずしもテーブルがA列から始まっているとは限りません。テーブル内で左から何番目ではなく、その列見出しがワークシートの何列目かを調べるのでしたら、ListColumnオブジェクトのRangeプロパティを使ってセル範囲を取得し、そのセル範囲のColumnプロパティ列位置を調べてください。
コメントを残す