VBAの基礎・基本の要約
マクロVBA入門は、全体で基本142回+デバッグ10回+参考ページ多数で構成されています。
より詳しく知りたい場合は、元のVBA入門のページを参照してください。
膨大なVBA入門学習のひとつの手助けになれば幸いです。
目次
1-1. マクロとは、VBAとは
1-2. RangeとCells
1-3. 変数と繰り返し処理
1-4. If条件分岐
1-5. 関数とは、引数とは
1-6. ブック、シート、セル
1-7. セルの書式
1-8. 別シートにセルをコピー
1-9. VBA関数
1-10. オブジェクトとは、コレクションとは
1-11. ブック・シートを安全に扱う
第1回.マクロって何?VBAって何?
マクロの中身がプログラミング言語のVBA(Visual Basic for Applications)です。
Excel操作を自動化する「マクロ機能」の中身が、プログラミング言語である「VBA」で記述されています。
第2回.まずはマクロVBAを使う準備
左メニューの「オプション」
左メニューの「リボンのユーザー設定」
右側にある、「開発」にチェック
これで「OK」
第3回.マクロの記録
「開発」タブ→「コード」グループ→マクロの記録
マクロ記録の限界
・不要な設定まで記録される
・全てが記録されるわけではない
個人用マクロブック
個人用マクロブックは、標準で非表示になっています。
第4回.マクロはどこに書くの(VBEの起動)
「Visual Basic Editor」の表示方法
標準モジュールの挿入
「Module1」の名称変更
「Module1」の削除
第5回.VBEのオプション設定(OptionExplicit)
「変数の宣言を強制する」にチェックを付けて下さい。
第6回.とにかく書いてみよう(Sub,EndSub)
VBEで実際にマクロを書いてみましょう
と入力し、Enterして下さい、
subがSubと先頭が大文字になり、後ろに()が付きます。
そして、1行空けてその下に、End Subが追加されます。
この、SubからEnd Subまでがマクロでこれをプロシージャーと言います。
range("A1")="おはよう!"
rangeと入れたものがRangeと、先頭が大文字に変換されます。
これは、Rangeが正しい記述であり、自動で変換されたという事です。
"a1"と入力しても、"A1"とは変換されません。
"A1"はセル番地なので、シート関数と同じ見た目になるように大文字で入れる事をお勧めします。
プロシージャーについて
プロシージャー名の付け方にはいくつかの制限があります。
✅先頭には、数字やアンダーバー(_)は使えない、英文字か漢字で始める
✅使えない予約語(VBAが特別に使っている単語)がある
✅長さは半角で255文字まで
✅1つの標準モジュール内では、同じ名前は付けられない
漢字を使う事p@vはありまが、VBAでは特に気にする必要はないでしょう。
第7回.マクロを実行するには(F5)
VBEの画面で実行
SubからEnd Subの間のどこかに入力カーソル(縦棒の点滅カーソル)がある状態で、
ワークシートで実行
一覧から実行したいマクロを選択して、
右側の「実行」ボタンをクリックします。
第8回.セルに文字を入れるとは(RangeオブジェクトのValueプロパティ)
セル番地ついて
= 記号について
「=」の右側の文字・数値を左側に入れると言う事です。
Range("A1") ← "おはよう!"
値はValue
↑ ↑ ↑
セル の 値 に 文字を入れる。
ただし、.Valueは書かなくても良いので先のVBAのように.Valueは省略しても構いません。
オブジェクトとは、プロパティとは
そして、Valueはプロパティと言います。
↓ ↓ ↓
Range("セル番地").Value = "文字"
↑ ↑ ↑
セル の 値 に 文字を入れる。
そして、「=」で、値を入れます。
セルに文字を入れるとは
セル(Rangeオブジェクト)のValue(プロパティ)に、文字を入れると言う事です。
結果として、指定したセルに文字が入り表示されます。
第9回.Rangeでのセルの指定方法
複数のセル(矩形のセル範囲)
これで、A1セルからC5セルの四角いセル範囲(15個のセル)が指定できます。
Range(始点セル, 終点セル)
列全体
A列全体になります。
A列からC列までの3列の範囲指定になります。
行全体
1行目全体の指定になります。
1行から5行までの5行の範囲指定になります。
名前定義のセル範囲
特殊な指定方法
この指定では、A1セルとC5セル(2個のセル)のみ対象となります。
"(ダブルクォーテーション)の中で、,(カンマ)で区切って指定します。
これは、A:Cと1:5の交差している範囲、
つまり、A1~C5の矩形セル範囲になります。
Range("A1","C5")と同じになりますので、ほとんど使うことは無いでしょう。
マクロVBAで良く使う書き方
Range("A1:C5")
Range("A:A")
Range("1:1")
Range("名前定義の名前")
第10回.Range以外の指定方法(Cells,Rows,Columns)
Cells(行番号, 列番号)
行番号は、縦方向の行位置で、1行目は1、10行目は10です。
列番号は、横方向の列位置で、A列は1、J列は10です。
Cells(1, 1) または Cells(1, "A")
A1セルになります。
Cells(5, 3) または Cells(5, "C")
C5セルになります。
Rows(行番号)
行番号は、縦方向の行位置で、1行目は1、10行目は10です。
これで、5行目の行全体になります。
"(ダブルクォーテーション)を使わずに数値をそのまま書きます。
このように指定すれば、1~5行の5行分全体の範囲になります。
"(ダブルクォーテーション)で囲みます。
複数行の場合は、:(コロン)で区切り"(ダブルクォーテーション)で囲みます。
Columns(列番号)
列番号は、横方向の列位置で、A列は1、J列は10です。
これで、3列目、つまりC列の全体になります。
"(ダブルクォーテーション)を使わずに数値をそのまま書きます。
数値指定の場合は複数列の指定はできません。
Columns("C")
複数列範囲の場合は、
Columns("A:C")
これで、A列~C列の3列の指定になります。
複数列の場合は、:(コロン)で区切り"(ダブルクォーテーション)で囲みます。
第11回.RangeとCellsの使い方
Rangeを使うのは
✅セル範囲(複数セル)の場合
✅名前定義を使う時
Cellsを使うのは
固定セル(固定位置)の指定
Range("A1:C5")
Range("1:5")
Range("A:C")
Range("名前定義の名前")
名前定義を使う場合は、Rangeでしか記述できません。
1つの(VBAで位置を変化させる)セルを指定する場合
Cells(5, 3)
Cells(5, "C")
どちらで書いても同じC5セルになります。
Cells(i, 3)
Cells(i, j)
セル範囲(複数セル)を指定する場合
Range(Cells(1, 1), Cells(5, 1))
Range(Cells(1, 1), Cells(5, 3))
Range(Cells(1, 1), Cells(i, 1))
Range(Cells(1, 1), Cells(1, i))
複数行全体、複数列全体の指定
Range(Rows(1), Rows(5))
Range(Columns(1), Columns(3))
Range(Rows(1), Rows(i))
Range(Columns(1), Columns(i))
RangeとCellsの使い分け方のまとめ
変数を使う時はCells、Rows、Columnsを使用すると言う事です。
第38回.セルに計算式を設定(Formula)
計算式を設定できるプロパティ
Formula
FormulaArray … これは配列数式でありVBAで使う事は滅多にありません
FormulaLocal
FormulaR1C1
FormulaR1C1Local
Formula2Local
Formula2R1C1
Formula2R1C1Local
Valueプロパティ
Range("A1").Value = "=B1+C1"
これは、普通に計算式を指定すれば良いです。
関数を入れる場合でも同じです。
A1セル = B1:B10セルの合計
Range("A1").Value = "=SUM(B1:B10)"
Formulaプロパティ , FormulaLocalプロパティ
違いは、計算式の入っているRangeを取得した時になります。
Formulaプロパティは、計算式が取得されます。
FormulaR1C1プロパティ , FormulaR1C1Localプロパティ
計算式をR1C1参照形式で指定するこということです。
R1C1参照形式
行位置をRに続けて記述し、列位置をCに続けて記述します。
R ・・・ Rの後に何も記述しない場合は同一行
C ・・・ Cの後に何も記述しない場合は同一列
R1 ・・・ Rの後に数値のみ記述した場合はその絶対行数
C1 ・・・ Cの後に数値のみ記述した場合はその絶対列数
R[1]・・・ Rに続けて[数値]とした場合は、数値行数分、行位置をずらした行
C[1]・・・ Cに続けて[数値]とした場合は、数値列数分、列位置をずらした列
例.C5セルに計算式を設定する場合、
RC1 ・・・ A5セル
R1C ・・・ C1セル
R[1]C[2] ・・・ E6セル
RC[-1] ・・・ B5セル
Localが付くプロパティについて
Range("B1").Formula = "=JIS(A1)"
これは、#NAME?となってしまいます。
それぞれの違い(Localは除く)
Range("A1").Value = "=B1+C1"
Range("A2").Formula =
"=B1+C1"
Range("A3").FormulaR1C1 =
"=B1+C1"
Range("A4").Value = "=RC[1]+RC[2]"
Range("A5").Formula = "=RC[1]+RC[2]"
Range("A6").FormulaR1C1 = "=RC[1]+RC[2]"
上記では、A3セルのみ正しく設定されません。
Valueだけで良い事になりますが、コードの可読性を考慮して適宜使い分けます。
何故、こんなに多くのプロパティが存在しているのか
Range("A1").Value = "=B1+C1"
これを実行した後に、そのプロパティを参照すると、
Range("A1").Value ・・・ 計算結果の値
Range("A1").Formula ・・・
=B1+C1
Range("A1").FormulaR1C1 ・・・ =RC[1]
このように、取得されるものが違ってきます。
Value
だけでも良いが、
計算式を参照する場合は、
.Formula
.FormulaR1C1
これらを使う必要が出てくることがあります。
R1C1形式を使うメリット
通常の参照形式では、
2行目は、=A2*100
3行目は、=A3*100
というようになり、行ごとに計算式を変更しなければならなくなります。
しかし、R1C1参照形式を使えば、
Sub サンプル1()
Dim i As Long
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
Cells(i, 2).FormulaR1C1 = "=RC[-1]*100"
Next
i
End Sub
上記では2~10まで繰り返しています。
Cells(Rows.Count, 1).End(xlUp).Row
これは最終行を取得するVBAコードです。
これらについては今後詳しく解説していきます。
たった1行のVBAで複数のセルに計算式を入れる
2行目から最終行までのB列に、A列*100の計算式を設定する場合、
Sub サンプル2()
Range(Range("B1"), Cells(Rows.Count, 1).End(xlUp).Offset(0,
1)).Value = "=A1*100"
End Sub
このように、1行でも書く事が出来るようになります。
(Offsetについては、後々説明します。)
第12回.変数宣言のDimとデータ型
データ型
データ型 | 名称 | 格納できる範囲 |
Integer | 整数型 | -32,768 ~ 32,767 |
Long | 長整数型 | -2,147,483,648 ~ 2,147,483,647 |
LongLong | 64ビット符号付き数値 | -9223372036854775808 ~ 9223372036854775807 ※64ビットプラットフォームのみで有効な宣言型 |
Single | 単精度浮動小数点数型 | -3.402823E38 ~ -1.401298E-45(負の値) 1.401298E-45 ~ 3.402823E38(正の値) |
Double | 倍精度浮動小数点数型 | -1.79769313486232E308 ~ -4.94065645841247E-324(負の値) 4.94065645841247E-324 ~ 1.79769313486232E308(正の値) |
Currency | 通貨型 | -922,337,203,685,477.5808 ~ 922,337,203,685,477.00 |
String | 文字列型 | 最大約20億文字まで |
Date | 日付型 | 西暦100 年1月1日~西暦9999年12月31日までの日付と時刻 |
Byte | バイト型 | 0~255の範囲の単精度の正の数値。8 ビット(1 バイト) |
Boolean | ブール型 | 真 (True) または偽 (False) |
Object | オブジェクト型 | オブジェクト |
Variant | バリアント型 | すべてのデータ |
変数の宣言
[As データ型]の[ ]の中は省略可能という意味です。
省略すれば、前記のVariant型になって、何でも入れる事が出来ます。
Dim 変数名 [As データ型], 変数名 [As データ型], ・・・
このように、,(カンマ)で区切って、複数の変数を1行に書く事が出来ます。
このとき、変数一つ一つにデータ型を指定する必要があります、
Dim i, j, k As Long
これでは、iとjはデータ型を省略したことになりVariant、kはLongになってしまいます。
変数に値を入れる
Dim i As Long
i = 123
変数はiは長整数型 の変数で、その変数に数値の123を入れています。
Dim bookName As String
bookName = "Book1.xlsm"
変数はbookNameは文字列型 の変数で、その変数に文字列の"Book1.xlsm"を入れています。
シートの数式と同様に、文字列は"ダブルクォーテーションで囲みます。
変数名の規則
✅変数名の長さは、半角で255文字以内(全角なら127文字以内)です
✅記号はアンダーバーのみ使用可能(ピリオドやスペースは使用できない
✅1文字目は、数字、_アンダーバー、記号を使用することができない
✅VBAが意味を持たせている語句(予約語)は使用できない
✅大文字、小文字の区別がなく、同様に扱われる
✅なるべく入れるデータが容易に想像できる名称にする
良く使われる変数名
Dim i, j, k
これらは数値のみを扱い、特にセル行数や列数に使用されることが多いです。
Dim cnt As Long
件数をカウントする時に良く使われるのがcntです。
cntはcountの略になります。
このように英単語の母音を取った略文字は結構く使われています。
他には例えば年月日時分秒は、y,m,d,h,m,s、これらの文字が使われることが多いです。
Dim 行数 As Long
自動型変換、暗黙の型変換
自動型変換、暗黙の型変換
Dim i As String
i = 123
i = "123"
どちらも同じで、文字列として"123"が入ります。
Dim j As Long
j = "123"
j = 123
どちらも同じで、数値として123が入ります。
Dim i As String
Dim j As Long
i = "123"
j = i
変数jには、数値として正しく123が入ります。
代入(=)によりString型からLong型に自動変換されます。
Dim j As Long
j = "abc"
これはエラーになります。
VBAでは、代入(=)や演算においては、自動型変換されます。
しかし、型変換できない場合は、エラーになります。
変数宣言の必要性
Option Explicit
これは、「変数は必ず宣言してから使います。」とエクセルに伝えたことになります。
第13回.定数宣言のConstと型宣言文字
Const定数の基本
Const strタイトル As String = "見出し"
Const int開始行 = 3
"見出し"という文字の代わりに、strタイトルを、
3という数値の代わりに、int開始行を使うようにします。
✅意味のない数値や長い文字を、分かりやすい名称で使う事が出来ます。
✅同じ文字や数値を、VBA内で何度も記述しなくて済みます。
✅文字や数値を変更する場合、Const定数だけを修正すれば良く「保守性」が高まります。
変数でも同じ事が出来るが・・・
int開始行 = 3
ですが、マクロを処理手順を記載した文章として考えて下さい。
マクロを見たときに一目でわかる方が、手順書として優れていることは間違いないはずです。
ダブルクォーテーションについて
文字は、"(ダブルクォーテーション)で囲み、
数値は、そのまま書いていることは、気づきましたか。
文字列型の変数・定数に入れるときは"で囲むと分かり安いでしょう。
型宣言文字
型宣言文字 | 変数の型 |
% | Integer(整数型) |
& | Long(長整数型) |
! | Single(単精度浮動小数点型) |
# | Double(倍精度浮動小数点型) |
@ | Currency(通貨型) |
^ | Longlong(64ビット符号付き数値)※64ビットExcelのみ有効 |
$ | String(文字列型) |
Dim i%
Const j& = 123456
これでデータ型を指定できます。
123%
123&
16進定数、8進定数
8進 : &O
Const i2 As Long = &O11 '8進数の11なので10進数で9
日付の定数に関する注意
2011 ÷ 12 ÷ 28 の計算結果の数値となってしまいます。
このように、#で囲みます。
#12/28/2011#の部分は、#2011/12/28# と入力しても自動的に#12/28/2011#に変換されます。
その他の定数
✅ユーザー定義の定数 ・・・ 独自に設定する定数。ここまでに説明したものです。
✅条件付きコンパイル定数 ・・・ 条件によりコンパイルを変更できます。
組み込み定数について
第14回.文字の結合(&アンパサンド)と継続行(_アンダーバー)
文字結合&(アンパサンド)
Sub 練習1()
Cells(1, 3).Value = Cells(1, 1).Value & Cells(1,
2).Value
End Sub
&(アンパサンド)でつなげます。
C1セルに、=A1&B1 これと同じです。
Cells(1, 3).Value = Cells(1, 1).Value + Cells(1, 2).Value
このように書く事も出来ますが、セルの値が数値同士の場合は足し算になってしまいます。
Sub 練習2()
Cells(1, 3).Value = Cells(1, 1).Value & "xyz"
End Sub
上記では、A1セルの文字の後ろに、"xyz"を結合して、C3セルに入れています。
継続行
Sub 練習3()
Cells(1, 6).Value = Cells(1, 1).Value & Cells(1, 2).Value
& Cells(1, 3).Value & Cells(1, 4).Value & Cells(1, 5).Value
End Sub
見易いように適当に改行を入れる事が出来ます。
Sub 練習3()
Cells(1, 6).Value = Cells(1, 1).Value & _
Cells(1, 2).Value & _
Cells(1, 3).Value & _
Cells(1, 4).Value & _
Cells(1,
5).Value
End Sub
半角スペースに続けて_(アンダーバー)を書くと、次の行に続けて書く事が出来ます。
第15回.四則演算と注釈(コメント)
算術演算子
演算子 | 説明 |
+ | 足し算 |
- | 引き算(符号反転) |
* | 掛け算 |
/ | 割り算 |
\ | 割り算の商 |
Mod | 割り算の余り |
^ | 指数(べき乗) |
計算の優先順位が必要な場合は、必ず()でくくって計算順序を明示して下さい。
優先順位について簡単に記載しておきます。
B1セルに、数量として5
これらが入っているとして、
C1セルに、金額(単価×数量)として1500を入れる場合です。
Sub 練習1()
Cells(1, 3).Value = Cells(1, 1).Value * Cells(1,
2).Value
End Sub
このマクロを見ても何の計算をしているかが不明です。
C1セル = A1セル * B1セル
そこで、コメント(注釈)を付けて、何をしているか分かるようにします。
注釈
Sub 練習1()
'金額 = 単価 * 数量
Cells(1, 3).Value = Cells(1, 1).Value * Cells(1, 2).Value
End Sub
このように、'(シングルクォーテーション)の後ろは、コメント(注釈)となります。
コメントは行の途中からでも書く事が出来ます。
Sub 練習1()
Cells(1, 3).Value = Cells(1, 1).Value * Cells(1, 2).Value '金額 = 単価 * 数量
End Sub
'(シングルクォーテーション)から後ろだけがコメントになり、
その前までは、普通にマクロVBAを書く事が出来ますし、実際に実行されます。
Remステートメント
Sub 練習1()
Rem 金額 = 単価 * 数量
Cells(1, 3).Value = Cells(1, 1).Value * Cells(1, 2).Value: Rem 金額 = 単価 * 数量
End Sub
第16回.繰り返し処理(ForNext)
For Next ステートメント
[statements]
[Exit For]
[statements]
Next [counter]
counter | 必ず指定します。 カウンタに使う数値変数を指定します。 |
start | 必ず指定します。 引数 counter の初期値を指定します。 |
end | 必ず指定します。 引数 counter の最終値を指定します。 |
step | 省略可能です。 ループを繰り返すごとに引数 counter に加算される値を指定します。 引数stepを省略すると、ループを繰り返すごとに引数counterには1が加算されます。 |
statements | 省略可能です。 ループ内で実行される一連のステートメントで、For と Next の間に記述します。 |
ステートメントとは、マクロの挙動を制御する構文、命令文です。
・・・処理・・・
Next
このカウンター変数は、省略可能です。
For Next 例文
Sub 練習1()
Dim i '変数iを宣言
For i = 1 To 10 '変数iを1から10まで1ずつカウントアップ
Cells(i, 1) = 1 'A列のi行目のセルに1を入れる
Next i 'Forの範囲はここまで
End Sub
For Next をステップ イン実行で目で見て確認しましょう。
ステップ イン実行、F8を押します。
F8を押すごとに、黄色い行が進んでいきます。
その時々のシートの状態を確認してください。
1行置きに処理する場合
Sub 練習2()
Dim i
For i = 1 To 10 Step
2
Cells(i, 1) = 1
Next i
End Sub
Step 2
これが1行置きの指定です。
つまり、これを書かない時は、
Step 1
Step -1
とすれば、iは1ずつ減っていきます。
セルの行を下から処理したい場合や、シートを後ろから処理したい場合です。
Exit For
特定の条件になった場合は、指定回数の処理を完了する前にループを抜けたい場合に使用します。
Sub 練習3()
Dim i
For i = 1 To 10
If Cells(i, 1) <> "" Then
Exit For
End If
Cells(i, 1) = 1
Next
End Sub
For~Nextのネスト(入れ子)
Sub 練習3()
Dim i, j
For i = 1 To 10
For j = 1 To
10
Cells(i, j) = 1
Next j
Next i
End
Sub
ネストは、概ね3段階までが推奨されます。
第17回.繰り返し処理(DoLoop)
Do~Loopの構文
[statements]
[Exit Do]
[statements]
Loop
[statements]
[Exit Do]
[statements]
Loop [{While | Until} condition]
condition | 省略可能です。 真 (True) または偽 (False) を評価する数式、あるいは文字列式を指定します。 |
statements | 引数 condition が真 (True) である間、または引数 condition が真 (True) になるまで繰り返し実行される、 任意の行数のステートメントを記述します。 |
余分なものを消して、さらに日本語で書くと
・・・処理・・・
Loop
・・・処理・・・
Loop
Untilは、条件を満たす迄、・・・処理・・・を実行します。
条件式
比較演算子 | 意味 |
= | 等しい |
<> | 等しくない |
> | より大きい |
>= | 以上 |
< | より小さい |
<= | 以下 |
論理演算子 | 意味 |
And | 論理積 |
Or | 論理和 |
Xor | 排他論理和 |
Eqv | 論理等価 |
Imp | 論理包含 |
And、Or、Notが理解できていれば問題ありません。
Do Loop 例文
Sub 練習1()
Dim i
i = 1
Do While i <= 10
Cells(i, 1) = 1
i = i + 1
Loop
End Sub
Sub 練習2()
Dim i
i = 1
Do Until i > 10
Cells(i, 1) = 1
i = i + 1
Loop
End Sub
Whileは、条件を満たす間
Untilは、条件を満たす迄
Whileの条件 = Not(Untilの条件)
これは、変数iに1を入れています。
i = i + 1
これは、変数iに1を足して、変数iに入れ直しています。
つまり、変数iは1増える事になります。
Sub 練習1()
Dim i '変数iを宣言
i = 1 '変数iに1を入れる
Do While i <= 10 '変数iが10以下の間処理を続ける
Cells(i, 1) = 1 'A列のi行に1を入れる
i = i + 1 '変数iを1増やす
Loop 'Doの処理範囲はここまで
End Sub
Exit Do
指定の条件になる前に、
Do~Loopのループ処理を終了したい場合に使用します。
処理を終了したい時に、Exit Do
Loop
Do~Loopのネスト(入れ子)
Sub 練習3()
Dim i, j
i = 1
Do Until i > 10
j =
1
Do Until j > 10
Cells(i, j) = 1
j = j +
1
Loop
i = i + 1
Loop
End
Sub
第18回.最終行の取得(End,Rows.Count)
.End(xlDown):Ctrl+↓
A1セルが選択されている状態で、
Ctrl + ↓
これで、A11に移動できます。
Cells(1, 1).End(xlDown)
このように書きます。
.End(xlUp):Ctrl+↑
いったんシートの一番下(シートの最終行)のA列(A1048576)セルに移動してから、
Ctrl + ↑
とやれば、A11に移動できます。
Cells(Rows.Count, 1).End(xlUp)
このように書きます。
Rows.Countとは
2007以降なら1048576です、2003なら65536です。
Rowsとはシートの全行で、Countなのでその数ということです。
このEndは、Rangeオブジェクトのプロパティで、Rangeオブジェクトを返します。
Endプロパティの方向(↑↓←→)について
End(Direction)
xlDown : ↓下へ
xlToLeft : ←左へ
xlToRight : →右へ
セルの行数を取得するRowプロパティ
Cells(1, 1).End(xlDown)
Cells(Rows.Count, 1).End(xlUp)
これらは、最期のセル(行数ではなく、セルそのもの)を表しています。
つまり最期のセルのRangeオブジェクトになります。
そのままでは行数ではなく、セルに入っている値(Value)が取得されてしまいます。
Cells(1, 1).End(xlDown).Row
Cells(Rows.Count, 1).End(xlUp).Row
このように、.Rowを指定します。
Cells(Rows.Count, 1).End(xlUp).Row
これは、定型文として丸暗記して下さい。
Cells(Rows.Count, 1).End(xlUp).Rowを日本語に訳す
セルA1048576からCtrl+↑のセルの行数
EndプロパティがRangeオブジェクトを返す
そのプロパティがオブジェクトを返す。
オブジェクトを返すプロパティがあると言う事だけ知っておいて下さい。
EndはRangeオブジェクト返すプロパティでだということです。
Endプロパティの問題点
手動のCtrl+↑でも同じですが、可視セル(見えているセル)の最終行となってしまいます。
第20回.条件分岐(If)
Ifステートメントの構文
真の処理 ・・・ 条件式を満たした場合の処理
[Else
偽の処理] ・・・ 条件式を満たさない場合の処理
End If
偽とは、条件式を満たさない場合
条件を満たしている(合致している)場合は真の処理、それ以外の(条件式を満たさない)場合は偽の処理を実行します。
IFステートメントの条件式
比較演算子
比較演算子 | 意味 |
= | 等しい |
<> | 等しくない |
> | より大きい |
>= | 以上 |
< | より小さい |
<= | 以下 |
論理演算子
論理演算子 | 意味 | 条件例 | 結果 |
And | 論理積 | True And True | TRUE |
True And False | FALSE | ||
False And True | FALSE | ||
False And False | FALSE | ||
Or | 論理和 | True Or True | TRUE |
True Or False | TRUE | ||
False Or True | TRUE | ||
False Or False | FALSE | ||
Xor | 排他論理和 | True Xor True | FALSE |
True Xor False | TRUE | ||
False Xor True | TRUE | ||
False Xor False | FALSE | ||
Not | 論理否定 | Not True | FALSE |
Not False | TRUE | ||
Eqv | 論理等価 | ||
Imp | 論理包含 |
And、Or、Not以外の論理演算子は当分は使用する必要はないでしょう。
Is演算子
If オブジェクト1 Is オブジェクト2 Then
オブジェクト1とオブジェクト2の両方が同じオブジェクトを参照する場合はTrueになります。
演算子の優先順位
各演算子グループの中では、より上が優先順位が高くなります。
↑ 高 低 ↓ |
算術演算子 | → | 比較演算子 | → | 論理演算子 |
^(指数) | すべて同じ 優先順位 = <> < > <= >= Like Is |
Not | |||
-(符号反転 ) | And | ||||
* / | Or | ||||
\(割り算の商) | Xor | ||||
Mod(割り算の余り) | Eqv | ||||
+ - | Imp | ||||
&(文字列連結) |
同一優先順位の場合は、式の左から右へ順に評価されます。
Ifステートメントの使用例文
If Cells(1, 1) >= 100 Then Cells(1, 2) = "○"
A1セルが100以上の場合、B1セルに"○"
If Cells(1, 1) >= 100 Then
Cells(1, 2) = "○"
End
If
特段の事情(1行で書く事でプログラムの可読性を高めたい等の場合)が無い限り、こちらを使いましよう。
If Cells(1, 1) >= 100 Then
Cells(1, 2) = "○"
Else
Cells(1, 2)
= "×"
End If
A1セルが100以上の場合、B1セルに"○"
A1セルが100未満の場合、B1セルに"×"
If Cells(1, 1) >= 100 Then Cells(1, 2) = "○" Else Cells(1, 2) = "×"
これは、例文3と同じですが、この使い方は余程の事情がない限り使わない方がよいです、
Ifステートメントのネスト(入れ子)
If Cells(1, 1) >= 100 Then
If Cells(1, 1) >= 200
Then
Cells(1, 2) = "A" '>= 200
Else
Cells(1, 2) = "B" '>=100 AND < 200
End If
Else
If Cells(1, 1) >= 50
Then
Cells(1, 2) = "C" '< 100 AND >= 50
Else
Cells(1, 2) = "D" '< 50
End If
End
If
A1セルが
>= 200の場合、B1セルに"A"
>=100 AND < 200の場合、B1セルに"B"
< 100 AND >= 50の場合、B1セルに"C"
< 50の場合、B1セルに"D"
第21回.条件分岐(ElseIf)
IfステートメントのElseIfの構文
条件式1が真の処理
[ElseIf 条件式2 Then
条件式2が真の処理]
[ElseIf 条件式3 Then
条件式3が真の処理]
・・・
[Else
全ての条件式が偽の処理]
End If
条件式1に合致しない場合(False)は、条件式2が判定されます。
条件式2に合致した場合(True)は、「条件式2が真の処理」が処理されます。
条件式2に合致しない場合(False)は、条件式3が判定されます。
条件式3に合致した場合(True)は、「条件式3が真の処理」が処理されます。
以下ElseIfが続く限り・・・
ElseIfの説明
条件式が真の処理
If 条件式1 Then
条件式1が真の処理
ElseIf 条件式2 Then
条件式2が真の処理
ElseIf 条件式3 Then
条件式3が真の処理
Else
全ての条件式が偽の処理
End If
ElseIfを使わずに書くと、
If 条件式1 Then
条件式1が真の処理
Else
If 条件式2 Then
条件式2が真の処理
Else
If 条件式3 Then
条件式3が真の処理
Else
全ての条件式が偽の処理
End If
End If
End If
この二つのVBAコードは同じになります。
多肢分岐の場合は、ElseIfを使う事で見易くなります。
ただし、できればこのElseIfより、Select Caseを使うことを考えましょう。
第22回.条件分岐(SelectCase)
Select Caseステートメントの構文
[Case expressionlist-n
[statements-n]]
・・・
[Case Else
[elsestatements]]
End Select
testexpression | 必ず指定します。 任意の数式または文字列式を指定します。 |
expressionlist-n |
Case 節がある場合は、必ず指定します。 |
statements-n | 省略可能です。 引数 testexpression が引数 expressionlist-n のいずれかと一致するとき、一致した引数 statements-n のステートメントが実行されます。 |
elsestatements | 省略可能です。 引数 testexpression が Case 節のいずれとも一致しないとき、引数 elsestatements のステートメントが実行されます。 |
Select Case の例文
Select Case 変数
Case 1
'変数=1の処理
Case
2
'変数=2の処理
Case Else
'変数が上記以外の処理
End
Select
Select Case 変数
Case 1, 2
'変数=1 Or 変数=2の処理
Case 3, 4, 5
'変数=3 Or 変数=4 Or 変数=5の処理
Case Else
'変数が上記以外の処理
End Select
Select Case 変数
Case 1 To 2
'変数=1 ~ 2の処理
Case 3 To 5
'変数=3 ~ 5の処理
Case Else
'変数が上記以外の処理
End
Select
Select Case 変数
Case Is <= 2 'Is は書かなければ自動挿入されます。
'変数<=2の処理
Case Is <= 5
'変数<= 5の処理
Case Else
'変数が上記以外の処理
End
Select
Select Caseは、とても使い道が広い汎用的なステートメントです。
If~ElseIf~End Ifは、全てSelect Caseで書き直すことが出来ます。
If 条件式1 Then
'条件式1が真の処理
ElseIf 条件式2 Then
'条件式2が真の処理
ElseIf 条件式3 Then
'条件式3が真の処理
Else
'全ての条件式が偽の処理
End If
Select Case True
Case 条件式1
'条件式1が真の処理
Case 条件式2
'条件式2が真の処理
Case 条件式3
'条件式3が真の処理
Case Else
'全ての条件式が偽の処理
End Select
第23回.メッセージボックス(MsgBox)
MsgBox関数の構文
prompt | 必ず指定します。 ダイアログ ボックス内にメッセージとして表示する文字列を示す文字列式を指定します。 rompt に複数行を指定する場合は、キャリッジ リターン (Chr(13))、ライン フィード (Chr(10))、またはキャリッジ リターンとライン フィードの組み合わせ (Chr(13) & Chr(10)) を改行する位置に挿入し、行を区切ってください。 |
buttons | 省略可能です。 表示されるボタンの種類と個数、使用するアイコンのスタイル、標準ボタン、メッセージ ボックスがモーダルかどうかなどを表す値の合計値を示す数式を指定します。 省略すると、名前付き引数 buttons の既定値 0 になります。 |
title | 省略可能です。 ダイアログ ボックスのタイトル バーに表示する文字列を示す文字列式を指定します。 名前付き引数 title を省略すると、タイトル バーにはアプリケーション名が表示されます。 |
helpfile | 省略可能です。 ダイアログ ボックスに状況依存のヘルプを設定するために、使用するヘルプ ファイルの名前を示す文字列式を指定します。 |
context | 省略可能です。 ヘルプ トピックに指定したコンテキスト番号を表す数式を指定します。 |
名前付き引数
名前付き引数を使用すると、構文どおりに指定された順序で各引数に値を指定しなくても、任意の順序で値を設定することができます。
MsgBox関数のbuttonsの定数
グループ | 定数 | 値 | 内容 |
ボタンの種類 | vbOKOnly | 0 | [OK] ボタンのみを表示します。 |
vbOKCancel | 1 | [OK] ボタンと [キャンセル] ボタンを表示します。 | |
vbAbortRetryIgnore | 2 | [中止]、[再試行]、および [無視] の 3 つのボタンを表示します。 | |
vbYesNoCancel | 3 | [はい]、[いいえ]、および [キャンセル] の 3 つのボタンを表示します。 | |
vbYesNo | 4 | [はい] ボタンと [いいえ] ボタンを表示します。 | |
vbRetryCancel | 5 | [再試行] ボタンと [キャンセル] ボタンを表示します。 | |
アイコンの種類 | vbCritical | 16 | 警告メッセージ アイコンを表示します。 Windowsのシステムエラーの音が鳴ります。 |
vbQuestion | 32 | 問い合わせメッセージ アイコンを表示します。 | |
vbExclamation | 48 | 注意メッセージ アイコンを表示します。 Windowsのメッセージ(警告)の音が鳴ります。 |
|
vbInformation | 64 | 情報メッセージ アイコンを表示します。 Windowsのメッセージ(情報)の音が鳴ります。 |
|
標準ボタン | vbDefaultButton1 | 0 | 第 1 ボタンを標準ボタンにします。 |
vbDefaultButton2 | 256 | 第 2 ボタンを標準ボタンにします。 | |
vbDefaultButton3 | 512 | 第 3 ボタンを標準ボタンにします。 | |
vbDefaultButton4 | 768 | 第 4 ボタンを標準ボタンにします。 | |
その他 | vbApplicationModal | 0 | アプリケーション モーダルに設定します。メッセージ ボックスに応答するまで、現在選択中のアプリケーションの実行を継続できません。 |
vbSystemModal | 4096 | システム モーダルに設定します。メッセージ ボックスに応答するまで、すべてのアプリケーションが中断されます。 | |
vbMsgBoxHelpButton | 16384 | ヘルプ ボタンを追加します。 | |
VbMsgBoxSetForeground | 65536 | 最前面のウィンドウとして表示します。 | |
vbMsgBoxRight | 524288 | テキストを右寄せで表示します。 | |
vbMsgBoxRtlReading | 1048576 | テキストを、右から左の方向で表示します。 |
MsgBox関数の戻り値の定数
定数 | 値 | 説明 |
vbOK | 1 | [OK] |
vbCancel | 2 | [キャンセル] |
vbAbort | 3 | [中止] |
vbRetry | 4 | [再試行] |
vbIgnore | 5 | [無視] |
vbYes | 6 | [はい] |
vbNo | 7 | [いいえ] |
MsgBox関数の例文
MsgBox "出来ました。"
MsgBox "出来ました。" & vbLf & "よかった"
改行は、VbLfだけで良いです。
MsgBox "出来ました。", vbOKOnly, "タイトル"
Dim rtn As Integer
rtn = MsgBox("出来ましたか?", vbYesNo + vbQuestion +
vbDefaultButton2, "確認")
Select Case rtn '押されたボタンの確認
Case
vbYes
MsgBox "「はい」が押されました。"
Case vbNo
MsgBox
"「いいえ」が押されました。"
End Select
戻り値を取得する為、
変数 = MsgBox(・・・)
とした場合は、引数を()括弧でくくります。
VBAにおける括弧()の使い方
第24回.インプットボックス(InputBox)
InputBox関数の構文
prompt | 必ず指定します。 ダイアログ ボックス内にメッセージとして表示する文字列を示す文字列式を指定します。 名前付き引数 prompt に複数行を指定する場合は、キャリッジ リターン (Chr(13))、ライン フィード (Chr(10))、またはキャリッジ リターンとライン フィードの組み合わせ (Chr(13) & Chr(10)) を改行する位置に挿入し、行を区切ってください。 |
title | 省略可能です。 ダイアログ ボックスのタイトル バーに表示する文字列式を指定します。 名前付き引数 title を省略すると、タイトル バーにはアプリケーション名が表示されます。 |
default | 省略可能です。 ユーザーが何も入力しない場合に、テキスト ボックスに既定値として表示する文字列式を指定します。 名前付き引数 default を省略すると、テキスト ボックスには何も表示されません。 |
xpos | 省略可能です。 画面の左端からダイアログ ボックスの左端までの水平方向の距離を、twip単位で示す数式を指定します。 省略すると、水平方向に対して画面の中央の位置に配置されます。 |
ypos | 省略可能です。 画面の上端からダイアログ ボックスの上端までの垂直方向の距離を、twip単位で示す数式を指定します。 省略すると、ダイアログ ボックスは垂直方向に対して画面の上端から約 1/3 の位置に配置されます。 |
helpfile | 省略可能です。 ダイアログ ボックスに状況依存のヘルプを設定するために、使用するヘルプ ファイルの名前を示す文字列式を指定します。 |
context | 省略可能です。 ヘルプ トピックに指定したコンテキスト番号を表す数式を指定します。 |
InputBox関数の例文
Dim strIn As String
strIn =
InputBox("何か入力して下さい。")
Dim strIn As String
strIn = InputBox("何か入力して下さい。" & vbLf & vbLf & "入力サンプルをここに書きます。")
Dim strIn As String
strIn = InputBox("何か入力して下さい。", "ユーザー入力", "既定文字")
Dim strIn As String
strIn = InputBox("何か入力して下さい。", "ユーザー入力",
"規定文字")
If strIn = "" Then
MsgBox "何も入力されませんでした。"
End If
何も入力されなかったか、「キャンセル」ボタンが押された場合は、空白が返されます。
従って、受け取った変数を、""で判定すれば良いです。
何も入力されなかった場合と「キャンセル」の時を区別したい場合は、以下を参照してください。
第25回.名前付き引数について
名前付き引数について
先頭より、
第1引数, 第2引数, 第3引数, ・・・
それが、
名前付き引数です。
名前付き引数名:=値
このように、:=で値を指定します。
名前付き引数の例文
MsgBox "出来ました。", vbOKOnly, "タイトル"
この引数は順番通りに指定する必要があります。
名前付き引数を使って指定すると、
MsgBox prompt:="出来ました。", Buttons:=vbOKOnly,
Title:="タイトル"
MsgBox Title:="タイトル", Buttons:=vbOKOnly,
prompt:="出来ました。"
名前付き引数を使えば、順番を変更しても問題ありません。
また、名前付き引数を使わない場合は、途中の引数を省略する場合は、
MsgBox "出来ました。", , "タイトル"
このように、, , として、引数の位置は正しく指定する必要があります。
しかし名前付き引数を使えば、
MsgBox prompt:="出来ました。", Title:="タイトル"
名前付き引数を使えば、引数の位置を意識することなく指定できます。
第27回.ブック・シートの選択(Select,Activate)
アクティブ
これらは、今まさに操作対象となっていると言う事です。
それが、アクティブブックのアクティブシートのアクティブセルです。
選択は複数できます。
Ctrlを押しながら選択したり、Shiftを押しながら選択すれば、 複数の選択が可能です。
従って、「選択」は複数ありますが、「アクティブ」は常に1つです。
アクティブシートは、Sheet1になります。
ActiveWorkbook
ActiveSheet
ブックをアクティブにする
Workbooks("ブック名").Activate
ブック名には、拡張子(.xls、.xlsx、.xlsm)も指定する必要があります。
Windows("ブック名").Activate
ブックに対し1つしかウインドウが存在しない場合は、
ウインドウ名 = ブック名
シートの選択、シートのアクティブ
シートの選択
Sheets(インデックス).Select
Worksheets("シート名").Select
Worksheets(インデックス).Select
非表示シートが無ければ、一番左のシートから順に、1,2,3・・・となります。
Sheetsはすべてのシート(ワークシート、グラフシート等)が対象です。
Worksheetsはワークシートだけが対象となります。
シートをアクティブにする
Sheets(インデックス).Activate
Worksheets("シート名").Activate
Worksheets(インデックス).Activate
SelectとActivateの違い
1つしかシートを選択にしない場合は全く同じ事です。
複数シートの選択(作業グループ化)
これで、複数シートが選択されます。
Arrayは配列です。
この状態で、
Sheets("シート名2").Activate
しかし、この状態で、
Sheets("シート名2").Select
とした場合は、作業グループが解除され"シート名2"が選択されアクティブになります。
複数ブックを開いている時のシート選択
これで選択できるのは、アクティブブックのシートだけです。
アクティブブック以外のシートを選択する場合は、
そのブックをアクティブにしてから、シートのSelectメソッドを実行します。
Sheets("Sheet2").Select
Workbooks("Book2.xlsx").Sheets("Sheet2").Activate
これでも、Book2のSheet2を選択状態にできます。
VBAでの色々なシート指定方法
✅シートの名称で指定
✅シートのオブジェクト名で指定
第28回.セル・行・列の選択(Select,ActivateとCurrentRegion)
選択セルとアクティブセル
選択セルは、B2~C6の10個のセルです。
アクティブセルは、B2セルになります。
Ctrlを押しながら選択した場合は、複数の領域が選択できます。
アクティブブックのアクティブシートにのみ存在します。
セルの選択
Cells(行, 列).Select
セルをアクティブにする
Cells(行, 列).Activate
Range("A1:B10,E11:F20").Select
これを実行した状態で、
Range("F18").Activate
とすれば、セルの選択状態は変わらず、アクティブセルのみF18に移動します。
しかし、
Range("F18").Select
とした場合は、
他のセルの選択状態は解除され、F18セルのみ選択されアクティブになります。
行の選択、列の選択
セル領域の選択
現在の選択範囲は、空白の行と空白の列の任意の組み合わせで囲まれた範囲です。
Range("B2").CurrentRegion.Select
上記の"B2"はB2:D6の範囲であればどのセルを指定しても選択されるセル範囲は同じになります。
B4,C3,D5,C6のように部分的な空欄はセル領域として認識されます。
7行目は空行となっているので、8行目以降は範囲に含まれません。
メソッドとはプロパティとは
Activate
メソッドとは方法・方式で、
オブジェクトに対する動作・操作を指定します。
第29回.セル・行・列の削除・挿入(Delete,Insert)
セルの削除
左方向にシフト
上方向にシフト
行全体
EntireRowは、RangeオブジェクトのプロパティでRangeオブジェクトを返します。
列全体
EntireColumnは、RangeオブジェクトのプロパティでRangeオブジェクトを返します。
セルの挿入
右方向にシフト
下方向にシフト
行全体
列全体
セルの削除・挿入時は、Shift:=は必ず指定
セルの挿入削除時には、Shift:=は必ず指定しましょう。
縦長か、横長かによって、自動的に上下左右が決定されます。
行・列の削除・挿入
行の削除
行の挿入
列の削除
列の挿入
行・列の削除/行・列の挿入で、Shift:=は必要か
Selection.Delete Shift:=xlUp
結論としては、不要です。
行・列の挿入・削除では、Shift:=は不要
第31回.セルの書式(表示形式,NumberFormatLocal)
マクロでの表示書式の指定
Range.NumberFormatLocal = "#,###"'カンマ区切りで0サプレス
Range.NumberFormatLocal = "0.00" '小数点2桁固定
Range.NumberFormatLocal = "yyyy/mm/dd" '日付、月・日を2桁
表示書式指定文字
ここで、「ユーザー定義」で指定する、書式指定文字と同じです。
書式指定文字 |
説明 |
G/標準 | 標準の表示形式です。 |
_(アンダーバー) | _(アンダーバー)に続く文字の幅だけ文字間隔を空けることができます。 |
" | 「"」で囲まれた文字列を表示します。 |
@ | 入力値を文字列としてそのまま表示します。 |
# | 小数点のいずれの側でも表示形式の # 記号の数より少ない場合に 0 は表示されません。 |
0 | 数値の桁数が表示形式の 0 の桁数より少ない場合に、表示形式の桁まで 0 が付加されます。 |
? | 有効桁以外の 0 にスペースが挿入されるため、列内で小数点の位置が整列されます。 |
. (ピリオド) | 数値に小数点を表示します。 |
,(カンマ) | 数値に桁区切り記号を表示します。 |
yy | 年を2桁の数値で表示します。 |
yyyy | 年を4桁の数値で表示します。 |
g | 元号のアルファベット1文字が表示されます。M,T,S,Hが表示できます。 |
gg | 元号の1文字が表示されます。明,大,昭,平 |
ggg | 元号が表示できます。明治,大正,昭和,平成 |
e | 年数が1桁で表示されます。 |
m | 月数を表示します。1~12が表示できます。 |
mm | 01~12が表示できます。1~9は01~09と0付で表示されます。 |
mmm | Jan~Dec |
mmmm | January~December |
mmmmm | J~D頭文字が表示されます。 |
d | 日数を表示します。1~31が表示できます。 |
dd | 01~31が表示できます。 |
ddd | Sun~Sat |
dddd | Sunday~Saturday |
aaa | 日~土 |
aaaa | 日曜日~土曜日 |
h | 時を表示します。0~23が表示できます。 |
hh | 00~23が表示できます。 |
m | 分を表示します。0~59が表示できます。 |
mm | 00~59が表示できます。 |
s | 秒を表示します。0~59が表示できます。 |
ss | 00~59が表示できます。 |
[h] | 24時を超える時間を表示します。 |
[m] | 60分を超える分を表示します。 |
[s] | 60秒を超える秒を表示します。 |
表示書式指定文字の調べ方
「ユーザー定義」で表示を確認して使えば良いでしょう。
Range.NumberFormatについて
Localと付くものと付かないものの違いは、PC環境に依存するかどうかです。
Localと付くものはPC環境に依存する設定を有効にする場合に使います。
Range("A1").NumberFormat = "\#,##0"
これでは期待した形式になりません。
"\"は、次に続く特殊文字をそのまま表示する記号として扱われてしまいます。
Range("A1").NumberFormatLocal = "\#,##0"
これであれば、期待通りに表示されます。
第32回.セルの書式(配置,Alignment)
マクロVBAでの配置の指定
プロパティ | プロパティの説明 | 設定値 | 設定値の説明 |
HorizontalAlignment | 横位置 | xlCenter | 中央 |
xlDistributed | 均等割り付け | ||
xlJustify | 両端揃え | ||
xlLeft | 左 | ||
xlRight | 右 | ||
VerticalAlignment | 縦位置 | xlBottom | 下 |
xlCenter | 中央 | ||
xlDistributed | 均等割り付け | ||
xlJustify | 両端揃え | ||
xlTop | 上 | ||
WrapText | 折り返し | True | する |
False | しない | ||
Orientation | 文字の向き | -90 ~ 90 | 角度 (°) |
xlDownward | 下向き | ||
xlHorizontal | 水平方向 | ||
xlUpward | 上向き | ||
xlVertical | 文字列は下向きでセルの中央に配置されます。 | ||
AddIndent | 自動的にインデント | True | する |
False | しない | ||
IndentLevel | インデントのレベル | 0 ~ 15 | |
ShrinkToFit | 自動的に縮小 | True | する |
False | しない | ||
ReadingOrder | 読む順序 | xlRTL | 右から左 |
xlLTR | 左から右 | ||
xlContext | 最初の文字に依存 | ||
MergeCells | セルの結合 | True | する |
False | しない |
マクロVBAでの配置の使用例
Range("セル範囲").HorizontalAlignment =
xlCenter
Range("セル範囲").VerticalAlignment =
xlCenter
Range("セル範囲").MergeCells = True
MergeCellsはRangeのプロパティですが、セルの結合に関しては、メソッドもあります。
Range("セル範囲").Merge
第33回.セルの書式(フォント,Font)
マクロでの指定
プロパティ | プロパティの説明 | プロパティの設定値と説明 |
Name | フォント名 | |
FontStyle | フォント スタイル | 下のBoldとItalicを使用して下さい。 |
Bold | 太字 | True、False |
Italic | 斜体 | True、False |
Size | フォントのサイズ | |
Strikethrough | 水平な取り消し線 | True、False |
Superscript | 上付き文字 | True、False |
Subscript | 下付き文字 | True、False |
OutlineFont | アウトライン フォント | True、False |
Shadow | 影付きフォント | True、False |
Underline | 下線の種類 | xlUnderlineStyleNone |
xlUnderlineStyleSingle | ||
xlUnderlineStyleDouble | ||
xlUnderlineStyleDoubleAccounting | ||
Color | フォントの色 | RGB値を表す長整数、色定数またはRGB関数 |
ColorIndex | フォントの色 | 2003までの56色カラーパレットのインデックス 何色か分かりづらいのでColorを使ったほうが良い |
ThemeColor | 配色のテーマ カラー | 2007以降のみ |
TintAndShade | 色を明るく、または暗く | 2007以降のみ |
ThemeFont | テーマのフォント | 2007以降のみ |
色定数
vbBlack | 黒 |
vbRed | 赤 |
vbGreen | 緑 |
vbYellow | 黄 |
vbBlue | 青 |
vbMagenta | マゼンタ |
vbCyan | シアン |
vbWhite | 白 |
Range("セル範囲").Font.Color = vbRed '赤
Range("セル範囲").Font.Color = vbWhite '白
Range("セル範囲").Font.Color = vbBlack '黒
RGB関数
Range("セル範囲").Font.Color = RGB(255, 0, 0) '赤
Range("セル範囲").Font.Color = RGB(255, 255, 255) '白
Range("セル範囲").Font.Color = RGB(0, 0, 0) '黒
色の指定を解除(自動)
Range("セル範囲").Font.ColorIndex = xlAutomatic
見た目の結果は黒文字になりますが、「自動」と「黒」は違うということを理解しておいてください。
第34回.セルの書式(塗りつぶし,Interior)
マクロVBAでのInterior指定
プロパティ | プロパティの説明 | プロパティの設定値と説明 |
Color | 塗りつぶす色 | RGB値を表す長整数、色定数またはRGB関数 |
ColorIndex | 塗りつぶす色 | 2003までの56色カラーパレットのインデックス 何色か分かりづらいのでColorを使ったほうが良い |
Pattern | 塗りつぶしのパターン | XlPattern 列挙 |
PatternColor | パターンの色 | RGB値を表す長整数※1 |
PatternColorIndex | パターンの色 | 2003までの56色カラーパレットのインデックス 何色か分かりづらいのでColorを使ったほうが良い |
色の指定方法定数
塗りつぶしなし
Range("セル範囲").Interior.ColorIndex = xlNone
見た目の結果は、白の塗りつぶしと同じように見えますが、
「白の塗りつぶし」と「塗りつぶしなし」は違うということを理解しておいてください。
条件付き書式との使い分け
多くの場合、マクロVBAで塗りつぶすより簡単なので良く使われていると思います。
シートが重くなる一因になることがあります。
第35回.セルの書式(罫線,Border)
A1セル~B5セルに格子線を引いた時のマクロの記録
しかし、以下のマクロで済んでしまいます。
Sub Macro2()
Range("A1:B5").Borders.LineStyle = xlContinuous
End
Sub
マクロVBAでの罫線指定
Bordersコレクションは、Borderオブシェクトの集まりです。
Range.Borders(index).プロパティ = 設定値
設定値 | 説明 |
xlDiagonalDown | 範囲内の各セルの左上隅から右下への罫線 |
xlDiagonalUp | 範囲内の各セルの左下隅から右上への罫線 |
xlEdgeBottom | 範囲内の下側の罫線 |
xlEdgeLeft | 範囲内の左端の罫線 |
xlEdgeRight | 範囲内の右端の罫線 |
xlEdgeTop | 範囲内の上側の罫線 |
xlInsideHorizontal | 範囲外の罫線を除く、範囲内のすべてのセルの水平罫線 |
xlInsideVertical | 範囲外の罫線を除く、範囲内のすべてのセルの垂直罫線 |
括弧()を省略して、
Range.Borders.プロパティ
とした場合は、
xlEdgeBottom、xlEdgeLeft、xlEdgeRight、xlEdgeTop、xlInsideHorizontal、xlInsideVertical
これら全てに同一の設定をしたことになります。
Bordersのプロパティ
プロパティ | プロパティの説明 | プロパティの設定値 | 設定値の説明 |
LineStyle | 罫線の種類 | xlNone または xlLineStyleNone | なし |
xlContinuous | 実線 | ||
xlDash | 破線 | ||
xlDashDot | 一点鎖線 | ||
xlDashDotDot | ニ点鎖線 | ||
xlDot | 点線 | ||
xlDouble | 2 本線 | ||
xlLineStyleNone | 線なし | ||
xlSlantDashDot | 斜破線 | ||
Color | 罫線の色 | RGB値を表す長整数 | |
ColorIndex | 罫線の色 | 1~56 | 2003までの56色カラーパレットのインデックス 何色か分かりづらいのでColorを使ったほうが良い |
Weight | 罫線の太さ | xlHairline | 非常に細い線 (最も細い罫線) |
xlMedium | 普通 | ||
xlThick | 太線 (最も太い罫線) | ||
xlThin | 細線 | ||
TintAndShade | 罫線の色色明るく、または暗く | 2007以降 |
規定値
LineStyleは、xlContinuous
Weightは、xlThin
ワークシートの「セルの書式設定」で指定可能な組み合わせしか出来ません。
Range.BorderAroundメソッド
以下は名前付き引数で指定した場合の使用例です。
Range("セル範囲").BorderAround LineStyle:=xlContinuous, Weight:=xlMedium,
Color:=vbRed
セル範囲の外枠に、実線、太さ普通、赤色の罫線を引いています。
マクロVBAでの罫線の注意点
同じ罫線のセル範囲はまとめて罫線を引くようにします。
Range("セル範囲").Borders.LineStyle = xlContinuous
Range("セル範囲").BorderAround Weight:=xlThick
外枠の罫線は2度引いていることになりますが、
一か所ずつ罫線を引くよりマクロVBAの記述も短く簡潔になりますし、処理速度も若干は速くなります。
第37回.ブック・シートの指定
マクロVBAでのブック・シート指定の具体例
シート:Sheet1
セル:A1
このA1セルに"文字"を入れる場合、
Workbooks("Book1.xlsx").Worksheets("Sheet1").Range("A1")
= "文字"
ブック:アクティブブック
シート:Sheet1
セル:A1~B10
ここに、格子線を引く場合、
Worksheets("Sheet1").Range("A1:B10").Borders.LineStyle =
xlContinuous
マクロVBAでのブック・シート指定の必要性
ブック・シートを指定して、操作するようにします。
例えば、RangeのSelectやActivate等は、アクティブブックのアクティブシートのみで有効です。
しかし、ほとんどの(通常必要とされる)処理は、ブック.・シートを指定することで操作可能です。
ブックの指定は省略して良いでしょう。
しかし、
シートの指定は、基本的には省略せずに指定しましょう。
VBAでの色々なシート指定方法
✅シートの名称で指定
✅シートのオブジェクト名で指定
第39回.セルのクリア(Clear,ClearContents)
セル(Rangeオブジェクト)のクリア関係のメソッド(動作を与える)
メソッド | 説明 |
Clear> | 全体(数式・文字・書式・コメント全て)をクリアします。 |
ClearComments | コメントを消去します。 |
ClearContents> | 数式と文字を削除します。 |
ClearFormats | 書式設定を削除します。 |
ClearNotes | コメントを削除します。 |
ClearOutline | アウトラインを消去します。 |
ClearHyperlinks | 2010以降のみ、ハイパーリンクを削除します。 |
Range.Clear
Cells(2, 2).Clear
Range("B2").Clear
Range("B2:C10").Clear
Rows(2).Clear
Columns(2).Clear
Range.ClearContents
定数としての文字・数値、そして計算式(関数)が消去されます。
書式(フォント、背景色、罫線等)は残ります。
Cells(2, 2).ClearContents
Range("B2").ClearContents
Range("B2:C10").ClearContents
Rows(2).ClearContents
Columns(2).ClearContents
第40回.セルのコピー・カット&ペースト(Copy,Cut,Paste)
セルをコピー(複写)する場合
Range("A1").Copy
Range("B1").Select
ActiveSheet.Paste
Range("C1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Range("A1").Copy
これはA1セルをクリップボードにコピーします。
ActiveSheet.Paste
アクティブシートのB1セルに貼り付けます。
ActiveSheet.Paste
アクティブシートのC1セルに貼り付けます。
この記述方法ではアクティブシートのアクティブセル以外には、貼り付けできません。
コピーモード(セルの周りが点々の状態)を解除します。
例."A1:C5"
セルを切り取る(移動する)場合
Range("A1").Cut
Range("B1").Select
ActiveSheet.Paste
Range("A1").Cut
A1セルを切り取りします。
ActiveSheet.Paste
アクティブシートのB1セルに貼り付けます。
A1セルは、クリアされた(初期)状態になります。
つまり、繰り返し貼り付けはできないという事になります。
例."A1:C5"
セル範囲のコピーについて
Range("A1:B10").Copy ・・・ ○
Range("A1,B5").Copy ・・・ ×
Range("A1,B5,C10").Copy ・・・ ×
Range("A1:B10,C11:D20").Copy ・・・ ×
上記の×は実行できません。
複数のセル範囲(離れた場所にあるセル範囲)はCopyはできません。
Range("A1:B10,D1:E10").Copy
しかし、VBAで使う事はほぼありません。
別のシートにコピーする場合
Range("A1").Copy
Sheets("シート名").Select
Range("B1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
シート選択すれば良い事は直ぐに理解できる事と思います。
しかし、アクティブシートにしか貼り付けできないのは不便です。
以下の書き方ならアクティブシート以外にもコピーできます。
アクティブシート以外へのコピー
Sheets("シート名1").Range("セル番地").Copy Destination:=Sheets("シート名2").Range("セル番地")
Destination:=
これは、名前付き引数です。
引数が1つなので、引数名は省略してもよいでしょう。
Copy Destinationの使用例
Sheets("Sheet1").Range("A1").Copy Sheets("Sheet2").Range("A1")
また、.Cutで切り取りも使用できます。
Sheets("Sheet1").Range("A1").Cut Sheets("Sheet2").Range("A1")
従って、マクロVBAではアクティブシート以外へのコピー
Sheets("シート名1").Range("セル番地").Copy Destination:=Sheets("シート名2").Range("セル番地")
これだけを覚えて使用するようにすれば良いでしょう。
第41回.セルのコピー&値の貼り付け(PasteSpecial)
PasteSpecialメソッド
名前 | 指定値 | 説明 |
Paste | xlPasteAll | すべてを貼り付けます。 |
xlPasteAllExceptBorders | 輪郭以外のすべてを貼り付けます。 | |
xlPasteAllMergingConditionalFormats | すべてを貼り付け、条件付き書式をマージします。 | |
xlPasteAllUsingSourceTheme | ソースのテーマを使用してすべてを貼り付けます。 | |
xlPasteColumnWidths | コピーした列の幅を貼り付けます。 | |
xlPasteComments | コメントを貼り付けます。 | |
xlPasteFormats | 書式を貼り付けます。 | |
xlPasteFormulas | 数式を貼り付けます。 | |
xlPasteFormulasAndNumberFormats | 数式と数値の書式を貼り付けます。 | |
xlPasteValidation | 入力規則を貼り付けます。 | |
xlPasteValues | 値を貼り付けます。 | |
xlPasteValuesAndNumberFormats | 値と数値の書式を貼り付けます。 | |
Operation | xlPasteSpecialOperationAdd | コピーしたデータは、対象セルの値に加算されます。 |
xlPasteSpecialOperationDivide | コピーしたデータは、対象セルの値によって割り算されます。 | |
xlPasteSpecialOperationMultiply | コピーしたデータには、対象セルの値に掛け算されます。 | |
xlPasteSpecialOperationSubtract | コピーしたデータは、対象セルの値に引き算されます。 | |
xlPasteSpecialOperationNone | 貼り付け操作で計算は行われません。 | |
SkipBlanks | True / False | クリップボードに含まれる空白のセルを貼り付けの対象にしないようにするには、True を指定します。 既定値は False です。 |
Transpose | True / False | 貼り付けのときにデータの行と列を入れ替えるには、True を指定します。 既定値は False です。 |
「形式を選択して貼り付け」の画面と対応させてみるようにしてください。
値の貼り付け
Worksheets("Sheet1").Range("A1:B10").Copy
Worksheets("Sheet2").Range("A1").PasteSpecial _
Paste:=xlPasteValues, _
Operation:=xlNone, _
SkipBlanks:=False, _
Transpose:=False
前回のPasteとは違い、アクティブシート以外にも貼り付けが可能です。
Paste:=xlPasteAll
これなら、セルの全てがコピーされるので、Pasteと同じ機能で別シートに貼り付け可能になります。
いろいろなコピーのVBAの書き方
Pasteを使って
Sheets("Sheet1").Select
Range("A1:B10").Copy
Sheets("Sheet2").Select
Range("A1").Select
ActiveSheet.Paste
Application.CutCopyMode
= False
Destinationを使って
Sheets("Sheet1").Range("A1:B10").Copy
Destination:=Sheets("Sheet2").Range("A1")
PasteSpecialを使って
Sheets("Sheet1").Range("A1:B10").Copy
Sheets("Sheet2").Range("A1").PasteSpecial Paste:=xlPasteAll
PasteSpecialの使用例
Worksheets("Sheet1").Range("A1:B10").Copy
Worksheets("Sheet2").Range("A1").PasteSpecial Paste:=xlPasteValues, Transpose:=True
Paste:=xlPasteValues ・・・ 値を貼り付け
Transpose:=True ・・・ 行と列を入れ替え
第42回.セルをコピーするとは
セルをコピーするとは
オブジェクトそのものは、コピーできません。
では、何をコピーしているのでしょぅか。
.Copyで.Pasteなら、Rangeの全てのプロパティをコピーしているのです。
値の貼り付けなら、.Valueをコピーしているに過ぎないのです。
これで、値のコピーが出来る事が理解できると思います。
このようにすれば、背景色がコピーされます。
シートを指定すれば、別シート間でも可能です。
上記方法ではコピーできないプロパティ
Range("B2").Borders.Weight
罫線(Borders)には、上下左右斜めを指定する引数があります。
Bordersだけの指定では、どの罫線かが特定できません。
(Bordersは引数を省略して設定すると、上下左右に同じ罫線が設定されます。)
.Valueのセル範囲間のコピー
注意点としては、
このセル範囲の場合は、.Valueを省略できません、省略してしまうと正しくコピーされません。
(正確には右辺のValueが省略できない)
.Value以外の場合は、セル範囲をセル範囲にコピーは出来ません
正確には、正しくコピーされないと言う事です。
これはOKですが、
Sheets("Sheet2").Range("A1:B10").Interior.Color = Sheets("Sheet1").Range("
これですと、全てが同一のColorならコピーされたように見えますが、
セルによってColorが違う場合は、正しくコピーされません。
セルによってColorが違う場合に使えないのでは意味がありませんので、あまり使用する機会は無いと思います。
コピー方法の使い分け
コピー先Range.PasteSpecial Paste:=xlPasteFormats
第44回.VBA関数について
VBA関数の書き方
関数の戻り値を他の変数やセルに入れて使います。
関数の戻り値をIf文等で判定します。
関数をネストして使う事も出来ます。
関数の戻り値を、別の関数の引数として指定しています。
関数の戻り値を使わない場合
このように、戻り値を使用しない事も稀にあります。
名前付き引数
引数自体の数が、そんなに多くないので記述を簡略化して省略する事が多いようです。
オブジェクトのメソッドの場合は引数が多いものがあるので、名前付き引数を使うようにします。
○○○B関数
AscB、ChrB、LeftB、LenB、RightB
○○○$関数
ワークシート関数との関係
従って、同様機能の関数はワークシート関数とVBA関数をセットで覚えるようにすると良いでしょう。
しかし、その引数に違いがあったり、機能の細部が違っていたりするので、ある程度の注意は必要です。
自動メンバ表示
関数名を入力すると、
そして、引数が決められた内容の場合は、そのメンバが自動表示されます。
習得すべき関数
全てを覚えるのは大変ですし、その必要もないでしょう。
日付や文字列操作の関数は、どのような業務においても必須となりますので、必ず習得して下さい。
第45回.VBA関数(Format)
Format関数
Format(expression[,format[,firstdayofweek[,firstweekofyear]]])
Expression | 必須。必ず指定します。 任意の有効な式。 |
||||||||||||||||||||||||
Format | 省略可能。 有効な名前を持つ、またはユーザー定義の書式指定式。 |
||||||||||||||||||||||||
FirstDayOfWeek | 省略可能。 週の最初の曜日を指定する定数です。
|
||||||||||||||||||||||||
FirstWeekOfYear | 省略可能。 年内で、最初の週を指定する定数です。
|
日付/時刻表示書式指定文字
文字 | 内容 |
(:) | 時刻の区切り記号です。 オペレーティングシステムの国別情報の設定によっては、時刻の区切り記号として他の記号が使用されることがあります。 時刻を時間、分、および秒で区切ることができます。 変換後の時刻の区切り記号は、コントロールパネルの設定によって決まります。 |
(/) | 日付の区切り記号です。 オペレーティングシステムの国別情報の設定によっては、他の記号が使用されることがあります。 日付を年、月、および日で区切ることができます。 変換後の区切り記号は、コントロールパネルの設定によって決まります。 |
c | dddddおよびtttttの書式で表した日付と時刻を、日付、時刻の順序で返します。 指定された値に小数部がない場合は日付のみ、整数部がない場合は時刻のみを表す文字列を返します。 |
d | 日付を返します。1桁の場合、先頭に0が付きません(1~31)。 |
dd | 日付を返します。1桁の場合、先頭に0が付きます(01~31)。 |
ddd | 曜日を英語(省略形)で返します(Sun~Sat)。 |
aaa | 曜日を日本語(省略形)で返します(日~土)。 |
dddd | 曜日を英語で返します(Sunday~Saturday)。 |
aaaa | 曜日を日本語で返します(日曜日~土曜日)。 |
ddddd | 年、月、日を含む短い形式(コントロールパネルで設定)で表した日付を返します。 既定の短い日付形式は、m/d/yyです。 |
dddddd | 年、月、日を含む長い形式(コントロールパネルで設定)で表した日付を返します。 既定の長い日付形式はmmmmdd,yyyyです。 |
w | 曜日を表す数値を返します(日曜日が1、土曜日が7となります)。 |
ww | その日が一年のうちで何週目に当たるかを表す数値を返します(1~54)。 |
m | 月を表す数値を返します。1桁の場合、先頭に0が付きません(1~12)。 ただし、hやhhの直後にmを指定した場合、月ではなく分と解釈されます。 |
mm | 月を表す数値を返します。1桁の場合、先頭に0が付きます(01~12)。 ただし、hやhhの直後にmmを指定した場合、月ではなく分と解釈されます。 |
mmm | 月の名前を英語(省略形)の文字列に変換して返します(Jan~Dec)。 |
mmmm | 月の名前を英語で返します(January~December)。 |
oooo | 月の名前を日本語で返します(1月~12月)。 |
q | 1年のうちで何番目の四半期に当たるかを表す数値を返します(1~4)。 |
g | 年号の頭文字を返します(M、T、S、H)。 |
gg | 年号の先頭の1文字を漢字で返します(明、大、昭、平)。 |
ggg | 年号を返します(明治、大正、昭和、平成)。 |
e | 年号に基づく和暦の年を返します。1桁の場合、先頭に0が付きません。 |
ee | 年号に基づく和暦の年を2桁の数値を使って返します。 1桁の場合、先頭に0が付きます。 |
y | 1年のうちで何日目に当たるかを数値で返します(1~366)。 |
yy | 西暦の年を下2桁の数値で返します(00~99)。 |
yyyy | 西暦の年を4桁の数値で返します(100~9999)。 |
h | 時間を返します。1桁の場合、先頭に0が付きません(0~23)。 |
hh | 時間を返します。1桁の場合、先頭に0が付きます(00~23)。 |
n | 分を返します。1桁の場合、先頭に0が付きません(0~59)。 |
nn | 分を返します。1桁の場合、先頭に0が付きます(00~59)。 |
s | 秒を返します。1桁の場合、先頭に0が付きません(0~59)。 |
ss | 秒を返します。1桁の場合、先頭に0が付きます(00~59)。 |
ttttt | コントロールパネルで設定されている形式で時刻を返します。 先頭に0を付けるオプションが選択されていて、時刻が午前または午後10時以前の場合、先頭に0が付きます。 既定の形式は、h:mm:ssです。 |
AM/PM | 時刻が正午以前の場合は大文字でAMを返し、正午~午後11時59分の間は大文字でPMを返します。 |
am/pm | 時刻が正午以前の場合は小文字でamを返し、正午~午後11時59分の間は小文字でpmを返します。 |
A/P | 時刻が正午以前の場合は大文字でAを返し、正午~午後11時59分の間は大文字でPを返します。 |
a/p | 時刻が正午以前の場合は小文字でaを返し、正午~午後11時59分の間は小文字でpを返します。 |
AMPM | 12時間制が選択されていて、時刻が正午以前の場合は午前を表すリテラル文字列を、正午~午後11時59分の間は午後を表すリテラル文字列を返します。 これらの文字列の設定および"12時間制"の選択は、コントロールパネルで行います。 AMPMは大文字、小文字のどちらでも指定できます。 既定の形式は、AM/PMです。 |
数値表示書式指定文字
文字 | 内容 |
なし | 指定した数値をそのまま返します。 |
0 | 桁位置や桁数を指定するときに使います。 引数formatに指定した書式文字列内の表示書式指定文字"0"1つで、数値の1桁を表します。変換対象の数値(式)が、"0"で指定された桁位置を使っている場合は、その桁に該当する値が入ります。 変換対象の数値の桁数が少なく、指定された桁位置に該当する値がない場合は、その桁には0が入ります。 引数expressionに指定した数値の整数部または小数部の桁数が、指定書式内の"0"の桁位置に満たない場合は、その桁位置には0が付加されます。 また、数値の小数部の桁数が小数部に指定した"0"の桁位置を超える場合には、数値の小数部は指定の桁位置に合わせて四捨五入されます。 逆に、整数部の桁数が整数部に指定した"0"の桁位置を超える場合には、整数部は変更されることなく、すべて表示されます。 |
(#) | 桁位置や桁数を指定するときに使います。 引数formatに指定した書式文字列内の表示書式指定文字"#"1つで、数値の1桁を表します。変換対象の数値(expression)が"#"で指定された桁位置を使っている場合は、その桁に該当する値が入ります。 変換対象の数値の桁数が少なく、指定された桁位置に該当する値がない場合は、その桁には何も入りません。 この記号は表示書式指定文字の"0"と同じような働きをしますが、数値の小数部や整数部の桁数が"#"で指定された桁位置に満たない場合に0は挿入されず、その桁には何も入りません。 |
(.) | 表示書式指定文字("0"または"#")と組み合わせて、小数点の位置を指定するときに使います。 表示する桁数を指定するとき、この表示書式指定文字の位置によって、整数部と小数部が区別されます。 指定書式内で"."の左側に"#"だけが指定されている場合は、1未満の数値は小数点記号から始まります。 数値が1未満の場合に小数点記号の左側に常に0が付くようにするには、指定書式内で""の左側に"#"ではなく"0"を指定します。 小数点記号は、オペレーティングシステムの国別情報の設定によって決まります。 |
(%) | 数値を100倍し、パーセント記号(%)を付けるときに指定します。 |
(,) | 1000単位の区切り記号を挿入するときに指定します。 整数部が4桁以上ある数値については、1000単位の区切り記号が付きます。 1000単位の区切り記号は、オペレーティングシステムの国別情報の設定によって決まります。 通常、この表示書式指定文字","の前後に"0"または"#"を指定して使います。 このとき、値は桁位置の指定に応じて丸められます。 たとえば、書式指定文字列として"##0,,"と指定すると、数値100000000(1億)は、100に変換されます。100万未満の数値は0となります。 整数部の右端以外でこの表示書式指定文字","を2つ以上続けて指定した場合は、","を1つ指定したときと同じになります。 |
(:) | 時刻の区切り記号を挿入するときに指定します。 時刻を時間、分、秒で区切ることができます。 時刻の区切り記号は、オペレーティングシステムの国別情報の設定によって決まります。 |
(/) | 日付の区切り記号を挿入するときに指定します。 日付を年、月、日で区切ることができます。 区切り記号は、オペレーティングシステムの国別情報の設定によって決まります。 |
(E-E+e-e+) | 指数表記で表すときに指定します。 "E-"、"E+"、"e-"、"e+"のいずれかの右側に"0"または"#"を1つ以上指定すると、数値は指数表記で表され、整数部と指数部の間にeまたはEが挿入されます。 これらの表示書式指定文字の右側に指定する"0"または"#"の数は、指数部の桁数を示します。 "E-"や"e-"を使うと、指数が負の場合にはマイナス記号が付きます。 "E+"や"e+"の場合は、指数の正負に合わせてプラス記号かマイナス記号が付きます。 |
-+$()スペース | 指定する文字をそのまま挿入します。 これら以外の表示書式指定文字を挿入するには、その前に円記号(\)を付けるか、ダブルクォーテーション("")で囲みます。 |
(\) | すぐ後に続く1文字をそのまま表示します。 書式指定の中で、特別な意味を持っている"#"または"E"などの文字を文字としてそのまま表示するには、その文字の前に円記号(\)を付けます。 この円記号(\)は表示されません。 文字をダブルクォーテーション("")で囲んでも、同じです。円記号(\)を挿入するには、円記号(\)を2つ続けて記述します(\\)。 そのままでは挿入できない文字としては、日付や時刻の表示書式指定文字(a、c、d、h、m、n、p、q、s、t、w、y、/、:)、数値の表示書式指定文字(#、0、%、E、e、カンマ、ピリオド)、文字列の表示書式指定文字(@、&、<、>、!)などがあります。 |
("ABC") | ダブルクォーテーション("")で囲まれた文字列は、そのまま挿入されます。 ダブルクォーテーションの文字コードはChr(34) をです。 |
文字列表示書式指定文字
文字 | 内容 |
@ | 1つの文字またはスペースを表します。 変換対象expressionの中で@(アットマーク)に対応する位置に文字が存在する場合は、その文字が表示されます。 文字がなければスペースが表示されます。 @は、引数formatに指定した書式の中に表示書式指定文字の!(感嘆符)がない限り、右から左の順に埋められます。 |
& | 1つの文字を表します。 変換対象expressionの中で&(アンパサンド)に対応する位置に文字が存在する場合は、その文字が表示されます。 文字がなければ何も表示せず、詰められて表示されます。 &は、引数formatに指定した書式の中に表示書式指定文字の!(感嘆符)がない限り、右から左の順に埋められます。 |
< | 小文字にします。すべての文字は小文字に変換されます。 |
> | 大文字にします。すべての文字は大文字に変換されます。 |
! | 文字を右から左ではなく、左から右の順に埋めていくように指定します。 この文字を指定しない場合は、右から左の順に埋められます。 |
※セルに出力する場合
セルの表示形式が文字列になっていない場合においては、
数値・日付の場合は、これは意味の無い処理となってしまいます。
セルに値を入れた時点で、セルの表示形式になってしまいます。
第46回.VBA関数(日付,DateAdd)
日付時刻に関するVBA関数の一覧
関数 | 説明 | 対応ワークシート関数 |
Date | 現在のシステムの日付の値を返す | ワークシート関数のTODAYと同じ |
Now | 現在の日付と時刻の値を返す | ワークシート関数と同じ |
Time | 現在のシステムの時刻の値を返す | |
Timer | 午前0時から経過した秒数を単精度浮動小数点数型で返す 1/100まで計測する場合に使用します。 |
|
Year | 年の値を返します | ワークシート関数と同じ |
Month | 1 年の何月かを表す 0~12 の範囲の値を返す | ワークシート関数と同じ |
Day | 月の何日かを表す 1~31 の範囲の値を返す | ワークシート関数と同じ |
Hour | 1 日の時刻を表す 0~23 の範囲の値を返す | ワークシート関数と同じ |
Minute | 時刻の分を表す 0~59 の範囲の値を返す | ワークシート関数と同じ |
Second | 時間の秒を表す 0~59 の範囲の値を返ます | ワークシート関数と同じ |
Weekday | 何曜日であるかの値を返す | ワークシート関数と同じ |
WeekdayName | 指定された曜日を表す文字列を返す | |
MonthName | 指定された月を表す文字列を返す | |
DatePart | 日付の指定した部分を含む値を返す | |
DateSerial | 引数に指定した年、月、日に対応する日付の値を返す | ワークシート関数のDATEと同じ |
DateValue | 日付を表す値を返す | ワークシート関数と同じです。 |
TimeSerial | 引数で指定した時、分、秒に対応する時刻の値を返す | ワークシート関数のTIMEと同じ |
TimeValue | 時刻を表す値を返す | ワークシート関数と同じです。 |
DateAdd |
指定された時間間隔を加算した日付の値を返す |
|
DateDiff | 2つの指定した日付の時間間隔の値を返す | ワークシート関数のDATEDIFと似てますが大きな違いがあります。 シートのDATEDIF関数は年齢計算に使用されますが、 VBAのDateDiff関数は直接的に年齢計算を行えません。 |
第47回.VBA関数(文字列操作,Replace,InStr,StrConv)
文字列操作に関するVBA関数の一覧
関数 | 説明 | 対応ワークシート関数 |
Asc,AscB,AscW | 指定した文字列内にある先頭の文字の文字コードを返す変換関数です | ワークシート関数のCODE,UNICODEと同様ですが、文字コードが違います。 |
Chr,ChrB,ChrW | 指定した文字コードに対応する文字を示す文字列型 (String) の値を返します | ワークシート関数のCHAR,UNICHARと同様ですが、文字コードが違います。 |
LCase | アルファベットの大文字を小文字に変換します | ワークシート関数のLOWERと同じ |
UCase | アルファベットの小文字を大文字に変換します | ワークシート関数のUPPERと同じ |
Len,LenB | 指定した文字列の文字数を表す値を返します LenBはバイト数です |
ワークシート関数と同じ |
Left,LeftB | 文字列の左端から指定した文字数分の文字列を返します LeftBはバイト数です |
ワークシート関数と同じ |
Mid,MidB | 文字列から指定した文字数分の文字列を返します MidBはバイト数です |
ワークシート関数と同じ、文字数は省略可能 |
Right,RightB | 文字列の右端から指定した文字数分の文字列を返します RightBはバイト数です |
ワークシート関数と同じ |
Replace | 指定された文字列の一部を、別の文字列で指定された回数分で置換した文字列を返します | ワークシート関数のSUBSTITUTEと同じ機能 |
InStr | ある文字列の中から指定した文字列を検索し、最初に見つかった文字位置を返す | ワークシート関数のFINDと同じ機能 ただし大文字小文字の区別はcompareで指定可能。 |
InStrRev | ある文字列の中から指定された文字列を最後の文字位置から検索を開始し、最初に見つかった文字位置を返す文字列処理関数です | |
Space | 指定した数のスペースからなる文字列を返す文字列処理関数です | |
String | 指定した文字コードの示す文字、または文字列の先頭文字を、指定した文字数だけ並べた文字列を返す文字列処理関数です | ワークシート関数のREPTと似ているが、REPTが文字列(複数文字)を繰り返すのに対し、Stringは先頭1文字のみ繰り返します。また引数の順序が違います。 |
Str | 数式の値を文字列で表した値 (数字) で返す文字列処理関数です | |
StrConv | 指定した変換方式で変換した文字列をバリアント型 (内部処理形式 String の Variant) で返します | |
StrReverse | 指定された文字列の文字の並びを逆にした文字列を返します | |
Trim | 指定した文字列から先頭と末尾の両方のスペースを削除した文字列を表す値を返します | ワークシート関数とほぼ同じだが、中間スペースは削除されない |
LTrim | 指定した文字列から先頭のスペースを削除した文字列を表す値を返します | |
RTrim | 指定した文字列から末尾のスペース (RTrim)を削除した文字列を表す値を返します | |
Val | 指定した文字列に含まれる数値を適切なデータ型に変換して返します | ワークシート関数のVALUEに近いが、先頭の数値部分のみ取り出す |
第48回.VBA関数(その他,Fix,Int,Rnd,Round,IsEmpty)
数学VBA関数の一覧
関数 | 説明 |
Fix | 指定した数値の整数部分を返します。負の場合、その数値以下の最大の値を返します。 |
Int | 指定した数値の整数部分を返します。負の場合、その数値以上の最小の値を返します。 |
Rnd | 単精度浮動小数点数型 (Single) の乱数を返します。 |
Round | 指定された小数点位置で丸めた数値を返します。 |
データ型確認のVBA関数一覧
関数 | 説明 |
IsArray | 変数が配列であるかどうかを調べ、結果をブール型 (Boolean) で返します。 |
IsDate | 式を日付に変換できるかどうかを調べ、結果をブール型 (Boolean) で返します。 |
IsEmpty | 変数が Empty 値かどうかを調べ、結果をブール型 (Boolean) で返します。 |
IsError | 式がエラー値かどうかを調べ、結果をブール型 (Boolean) で返します。 |
IsMissing | プロシージャに省略可能なバリアント型 (Variant) の引数が渡されたかどうかを調べ、結果をブール型 (Boolean) で返します。 |
IsNull | 式に Null 値が含まれているかどうかを調べ、結果をブール型 (Boolean) で返します。 |
IsNumeric | 式が数値として評価できるかどうかを調べ、結果をブール型 (Boolean) で返します。 |
IsObject | 識別子がオブジェクト変数を表しているかどうかを示すブール型 (Boolean) の値を返します。 |
データ型変換のVBA関数一覧
関数 | 説明 |
CBool | ブール型 (Boolean)のデータ型に変換します。 |
CByte | バイト型 (Byte)のデータ型に変換します。 |
CCur | 通貨型 (Currency)のデータ型に変換します |
CDate | 日付型 (Date)のデータ型に変換します。任意の有効な日付 |
CDbl | 倍精度浮動小数点数型 (Double)のデータ型に変換します。 |
CDec | 10進型 (Decimal)のデータ型に変換します |
CInt | 整数型 (Integer)のデータ型に変換します。 |
CLng | 長整数型 (Long)のデータ型に変換します。 |
CLngLng | LongLong型に変換します。 |
CLngPtr | LongPtr型に変換します。 |
CSng | 単精度浮動小数点数型 (Single)のデータ型に変換します。 |
CStr | 文字列型 (String)のデータ型に変換します。 |
CVar | バリアント型 (Variant)のデータ型に変換します。 |
CVerr | 指定した数値(エラー番号)を、バリアント型のエラー値に変換します。 |
第49回.Like演算子とワイルドカード
Like演算子
result | 任意の数値変数を指定します。 |
string | 任意の文字列式を指定します。 |
pattern | パターンマッチング規則に従った任意の文字列式を指定します。 |
文字列式stringと文字列式patternが一致していると、演算結果resultは真(True)になり、
一致していないと、演算結果resultは偽(False)になります。
If string Like pattern Then
真(True)の場合の処理
EndIf
ワイルドカード、文字リスト、文字範囲などを組み合わせて指定できます。
パターン文字列式(ワイルドカード、文字リスト、文字範囲)
文字パターン | 引数stringの中の一致する文字 |
? | 任意の1文字 |
* | 任意の数の文字 |
# | 任意の1文字の数字(0-9) 1バイト(半角)の数字 半角全角どちらの数字にも一致します |
[charlist] | 文字リストcharlistに指定した文字の中の任意の1文字 |
[!charlist] | 文字リストcharlistに指定した文字以外の任意の1文字 |
これらの文字を角かっこで囲み、[*]のように指定します。
たとえば、
[A-Z]では、string内の対応する文字位置にAからZの範囲内の大文字が含まれる場合に一致します。
Like演算子の使用例
データ | 文字列式 | 結果 | 説明 |
aBBBa | a*a | TRUE | aで始まりaで終わる |
F | [A-Z] | TRUE | AからZまでの文字 |
F | [!A-Z] | FALSE | AからZ以外の文字 |
a2a | a#a | TRUE | a 数字1桁 a |
aM5b | a[L-P]#[!c-e] | TRUE | a LからP 数字1桁 cからe |
BAT123khg | B?T* | TRUE | B 任意1文字 T 何でも良い |
CAT123khg | B?T* | FALSE | B 任意1文字 T 何でも良い |
ab | a*b | TRUE | a 何でも良い b |
a*b | a[*]b | TRUE | a *1文字 b |
axxb | a[*]b | FALSE | a *1文字 b |
a[xyz | a[[]* | TRUE | a [1文字 何でも良い |
正規表現について
マクロVBAで正規表現を扱う為には、VBScriptを使う事になります。
VBAで正規表現を利用する(RegExp)
第87回.WorksheetFunction(ワークシート関数を使う)
ワークシート関数の使い方
Range("B1") = WorksheetFunction.CountA(Columns(1))
引数は、ワークシート上での関数入力と同一となります。
WorksheetFunctionで使用できる関数
文字列操作、日付/時刻、これらの関数はほとんど使えません
VBAでは関数ではなく、セル(Rangeオブジェクト)のOffsetプロパティが使えます。
このように、
○○○.△△△
.ピリオドでつながった関数は、
○○○_△△△
このように、.ピリオドが_アンダーバーに変換されています。
WorksheetFunction.
ピリオドまで入力した時に候補表示されます。
個別の関数の使い方
ただし、VBEでは、
引数名が、Arg1, Arg2, ・・・
これだけしか表示されません。
引数が不明の場合は、ワークシートで関数を入力して確認してください。
関数の結果(戻り値)
ただし、
ワークシート関数の場合に、結果が「#N/A」のようなエラー値になる場合は、
マクロの実行がエラーとなりストップしてしまいます。
エラーになる代表的なものとして、Vlookupで検索値が検索範囲に無い場合になります。
WorksheetFunctionの使用例.
変数・セル = WorksheetFunction.Countif(Range("A:A"), "abc")
変数・セル = WorksheetFunction.VLookup(Cells(1, 4), Range("A:C"), 3, 0)
変数・セル = WorksheetFunction.Match(Cells(1, 4), Range("A:A"), 0)
検索系の関数での日付の扱い
変数・セル = WorksheetFunction.VLookup(Cells(1, 4)
このように.Valueを指定した場合、日付としては正しく検索されません。
このように、数値で検索することも可能ですが、.Valueを付けないほうが簡単で確実です。
WorksheetFunctionのエラー対処
マクロが停止しないようにするための対処が必要になります。
On Error Resume Next
変数 = WorksheetFunction.VLookup(Range("D1"), Range("A:B"), 2, 0)
If Err.Number <> 0 Then
変数 = "なし"
Err.Clear
End If
件数 = WorksheetFunction.CountIf(Range("A:B"), Range("D1"))
If 件数 > 0
Then
変数 = WorksheetFunction.VLookup(Range("D1"), Range("A:B"), 2, 0)
Else
変数 = "なし"
End If
変数 = Application.VLookup(Range("D1"), Range("A:B"), 2, 0)
Applicationに続けて関数を指定すると、エラーでVBAが停止することは無くなります。
変数には「エラー 2042」が入ります、セルであれば「#N/A」となります。
第51回.Withステートメント
Withに指定したオブジェクトに対してオブジェクト名を再度記述することなく、プロパティやメソッドを記述することができます。
同じオブジェクトに対して様々な処理を行う時に、Withで1度だけ書いて、その後はオブジェクトを省略して書くことができます。
Withの構文
With object
[statements]
・・・
End With
With~End Withの間では、
ピリオドから書き始めることでオブシェクト名を省略した書き方ができます。
Withを使った時と使わない時の比較
オブジェクト.プロパティ = 値
オブジェクト.メソッド
このように記述するところを、
With オブジェクト
.プロパティ = 値
.メソッド
End With
このようにオブジェクトの記述を省略し、.から書き始めることが出来るということです。
Withの使用例
Worksheets(1).Cells(1, 1) = 1
Worksheets(1).Cells(2, 1) = 2
これを、Withを使って書くと、
With Worksheets(1)
.Cells(1, 1) = 1
.Cells(2, 1) = 2
End With
このようになります。
With~End Withの間では、
.で書き始めれば、.の前のWithのオブジェクトが省略できることになります。
Range("A1").Font.Bold = True
Range("A1").Font.Color = vbRed
Range("A1").Font.Size = 12
これを、Range("A1") をWithに指定して書くと、
With Range("A1")
.Font.Bold = True
.Font.Color = vbRed
.Font.Size = 12
End With
さらに、Range("A1").Font までをWithに指定して書くと、
With Range("A1").Font
.Bold = True
.Color = vbRed
.Size = 12
End With
Withのネスト
With Range("A1")
With .Font
.Bold = True
.Color = vbRed
.Size = 12
End With
End With
Withがネストされている場合に、.の前の省略されているオブジェクトは、
直前(そのステートメントが含まれる最も内側)のWithステートメントに指定したオブジェクトになります。
Withを使ったときに気を付けるべき書き方
Sub sample1()
With Worksheets(1)
Debug.Print .Name
Worksheets.Add Before:=Worksheets(1)
Debug.Print .Name
End With
End Sub
イミディエイト ウインドウには、もともと先頭にあったシートのシート名が2回出力されます。
Withの時点で捕まえたオブジェクトは、Wnd Withまで保持され、Withの中では常に同じワークシートを参照します。
つまり、
WithでWorksheets(1)と書かれていても、必ずしも1番目のシートを参照しているとは限らないという事です。
Withで指定したオブジェクトの位置をずらすようなVBAコードは書いてはいけません。
このようなコードを書いてしまうと、後々判読不能なVBAとなってしまいます。
Withの使いどころ
・・・
End With
第52回.オブジェクト変数とSetステートメント
オブジェクト変数
Object ・・・ オブジェクト型
総称オブジェクト型とも言います。
Worksheet
Range
Font
これは、Fontオブジェクトのデータ型になります。
とりあえず最低限として、Workbook、Worksheet、Range、この3つだけは覚えておいてください。
Objectは、オブジェクトなら何でも入る
個別のオブジェクト型は、そのオブジェクトのみ
Setステートメント
オブジェクトへの参照を変数に代入します。
オブジェクトは単なる値ではなく、プロパティやメソッドを複数含んだ集合体になります。
オブジェクトの実態を変数に入れていたのでは大変です。
そこで、オブジェクトのある場所(アドレス)を変数に入れておくという事です。
アドレスの入った変数を見ればオブジェクトのある場所が分かり、
結果としてオブジェクトにアクセスできるという仕組みです。
Setステートメントの使用例
Dim ws As Worksheet
Set ws = Worksheets("シート名")
ws.Cells(1, 1) =
1
これは、
Worksheets("シート名").Cells(1, 1) = 1
これと同じ事になります。
Set ws = Worksheets("シート名")
これ以降は、
Worksheets("シート名")の別名として、wsという名称を使えると考えてもらって結構です。
Worksheets("シート名").Range("A1").Font.Bold = True
Worksheets("シート名").Range("A1").Font.Color = vbRed
Worksheets("シート名").Range("A1").Font.Size = 12
これは、
Dim MyRange as Range
Set MyRange = Worksheets("シート名").Range("A1")
MyRange.Font.Bold = True
MyRange.Font.Color = vbRed
MyRange.Font.Size =
12
WithとSetの使い分け方
どちらも、記述の簡略化になります、
そして、なにより、処理速度も速くなるのです。
ワークシートは、プロシージャーの先頭でオブジェクト変数に入れてから使う事をお勧めします。
さらに、Withと組み合わせることで、可読性・保守性の高いマクロVBAにすることができます。
Setステートメントの実践的な使い方
Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet
Set ws1 =
Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")
Set ws3 = Worksheets("Sheet3")
With ws1
.Cells(1, 1) = ws2.Cells(1, 1)
・・・
.Cells(1, 2) = ws3.Cells(1, 1)
・・・
End With
上記の考え方は、
扱うワークシートは、とりあえず全てオブジェクト変数に入れる。
主なワークシートは、Withにする。
Is演算子によるオブジェクトの比較
オブジェクト変数(As Object または、As 固有オブジェクト型)の初期値はNothingです。
Dim 変数A As Worksheet
Debug.Print 変数A Is Nothing '→ True
Set 変数A = Worksheets(1)
Dim 変数B As Worksheet
Set 変数B = 変数A
Dim 変数C As Worksheet
Set 変数C = Worksheets(1)
Debug.Print 変数A Is 変数B '→ True
Debug.Print 変数A Is 変数C '→ True
Set 変数C = Worksheets(2)
Debug.Print 変数A Is 変数C '→ False
Rangeブジェクトの場合は注意が必要です。
Dim 変数A As Range
Set 変数A = Range("A1")
Dim 変数B As Range
Set 変数B = 変数A
Dim 変数C As Range
Set 変数C = Range("A1")
Debug.Print 変数A Is 変数B '→ True
Debug.Print 変数A Is 変数C '→ False
Rangeオブジェクトでは、上記VBAの最後がFalse判定になる点に注意してください。
同じセルを参照しているかの判定には、
.Address(External:=True)
この値(文字列)を比較してください。
第53回.Workbookオブジェクト
WorkBookの指定方法
WorkBookのデータ型
Workbook
Dim 変数 As Workbook
気を付けてもらいたいのは、
Workbooks
ではないと言う事です。
データ型のWorkbookは複数形ではないので、最後のsは付きません。
Workbooksコレクションの中から、特定のブックを指定したものが、Workbookオブジェクトになります。
WorkBookのプロパティとメソッド
WorkBookのプロパティ、メソッド、イベントの一覧
プロパティ | Name | 名前 |
Names | 名前定義 | |
Path | 保存パス | |
FullName | 保存パス+名前 | |
Saved | 最後の保存から変更されたかを取得・設定 | |
ReadOnly | 読み取り専用かを取得・設定 | |
Sheets | 全てのシート | |
Worksheets | 全てのワークシート | |
メソッド | ActiVate | アクティブにします |
Close | 閉じる | |
Save | 上書き保存 | |
SaveAs | 名前を付けて保存 | |
SaveCopyAs | コピーを保存 | |
PrintOut | 印刷 | |
PrintPreview | 印刷プレビュー | |
Protect | 保護 | |
Unprotect | 保護を解除 |
Workbookオブジェクトの使用例
Dim wb As Workbook
Set wb = Workbooks("Book1.xlsx")
MsgBox
wb.Name
メッセージボックスには、「Book1.xlsx」と表示されます。
Workbookの集まりWorkbooksコレクションの中から"Book1.xls"を指定することでWorkbookオブジェクトを取得し、
その参照を、オブジェクト変数wbに入れています。
そして、Nameプロパティで名前を取得してメッセージ出力しています。
第54回.Windowオブジェクト
エクセルのリボンでは「新しいウィンドウ」や「ウィンドウ枠」といった言葉で表現されているものです。
スクロールバー、枠線などの多くのワークシート関連の見た目は、実際にはウィンドウのプロパティです。
Windowの指定方法
ウィンドウ名 = ワークブック名
複数ウィンドウが存在している場合は、
ウィンドウ名 = ワークブック名:ウィンドウ番号
Windowオブジェクトデータ型
Windowオブジェクトのプロパティとメソッド
プロパティ | DisplayGridlines | 枠線を表示 |
DisplayHeadings | 行と列の両方の見出しを表示 | |
DisplayHorizontalScrollBar | 水平スクロール バー | |
DisplayVerticalScrollBar | 垂直スクロール バー | |
DisplayWorkbookTabs | シート見出しを表示 | |
FreezePanes | 分割ウィンドウ枠を固定します | |
Zoom | 表示サイズを、パーセント単位 | |
メソッド | Activate | アクティブにする |
Close | 閉じる | |
SmallScroll | 行または列数分だけウィンドウをスクロールします | |
LargeScroll | ページ数分だけウィンドウをスクロールします | |
NewWindow | 新しいウィンドウ、またはウィンドウのコピーを作成 |
Windowオブジェクトの解説
上で紹介した、プロパティ・メソッドは、Windowオブジェクトのメンバーであり、
WorkbookオブジェクトやWorkSheetオブジェクトには存在していません。
Windowオブジェクトに設定するものだということです。
従って、「新しいウィンドウを開く」では、その情報は引き継がれません。
Windowオブジェクトの使用例
Dim wd As Window
Set wd = ActiveWindow
With wd
.DisplayGridlines = False '枠線を非表示
.DisplayHeadings = False '行と列の両方の見出しを非表示
.DisplayHorizontalScrollBar = False '水平スクロールバーを非表示
.DisplayVerticalScrollBar = False '垂直スクロール バーを非表示
.DisplayWorkbookTabs = False 'シート見出しを表示
.FreezePanes = False '分割ウィンドウ枠を固定解除
Range("C3").Select
.FreezePanes = True 'C3セルでウィンドウ枠を固定
.Zoom = 75 '表示サイズを75%
End With
アクティブシート以外のWindowの設定
以下では、シートをアクティブにすることなく表示(Window)に関する設定を行う方法と、設定可能なプロパィを紹介しています。
第55回.Worksheetオブジェクト
WorkSheetオブジェクトの指定方法
※Activesheetは、正確にはワークシートオブジェクトではありません、詳細は後述。
Worksheetオブジェクトデータ型
Worksheets
ではないと言う事です。
Worksheetsは、Worksheetの集まりで、コレクションと言います。
WorkSheetのプロパティとメソッド
プロパティ | Name | 名前 |
Names | 名前定義 | |
Cells | Rangeオブジェクト | |
Range | Rangeオブジェクト | |
Columns | Rangeオブジェクト | |
Rows | Rangeオブジェクト | |
FilterMode | フィルタ モード | |
Hyperlinks | ハイパーリンク | |
PageSetup | ページ設定 | |
ScrollArea | スクロールが可能な領域 | |
Shapes | すべての図形 | |
Visible | 表示するかどうか | |
メソッド | Activate | アクティブ |
Select | 選択 | |
Copy | コピー | |
Move | 移動 | |
Paste | 貼り付け | |
PasteSpecial | 形式を選択して貼り付け | |
AutoFilter | フィルター | |
PivotTables | ピボットテーブル | |
PrintOut | 印刷 | |
PrintPreview | 印刷プレビュー | |
Protect | 保護 | |
Unprotect | 保護解除 |
Worksheetオブジェクトの使用方法
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
MsgBox
ws.Name
メッセージボックスには、「Sheet1」と表示されます。
Worksheetの集まりWorksheetsの中から、"Sheet1"を指定し、
その参照を、オブジェクト変数のwsに入れています。
Activesheet、Sheetsコレクションについて
Sheetsコレクションには、そのブックの全てのシートが入っています。
シートには、ワークシート・グラフ等々の種類がありますので、Activesheetもワークシートとは限りません。
Activesheetも、ワークシート以外のシートの事もあります。
従って、例えばグラフシートが存在するブックでは、
Sheets.CountとWorksheets.Countの数は一致しません。
第56回.Rangeオブジェクト(RangeとCells)
Rangeオブジェクトを参照するためのプロパティ
下表は、Rangeオブジェクトを参照するためのプロパティです。
オブジェクト | プロパティ | 説明 |
Worksheet | Range | セルまたはセル範囲を表す |
Cells | セルを表す | |
Rows | 行を表す | |
Columns | 列を表す | |
Range | Range | セルまたはセル範囲を表す |
Cells | セルを表す | |
Rows | 行を表す | |
Columns | 列を表す | |
EntireRow | セル範囲を含む 1 行または複数の行全体 | |
EntireColumn | セル範囲を含む 1 列または複数の列全体 | |
Offset | オフセットの範囲 | |
Resize | サイズを変更 | |
End | 領域の終端のセル。Ctrl+方向キーに相当 | |
SpecialCells | 指定された条件を満たしているすべてのセル | |
MergeArea | 結合セル範囲を表す | |
Next | 次のセルを表す |
Rangeオブジェクトに、Rangeプロパティがあるあたりが、少し理解しづらいかもしれません。
Rangeオブジェクトを返すRangeプロパティ
これは、WorksheetのRangeプロパティであり、このRangeプロパティを通して、Rangeオブジェクトを参照しています。
そして、Rangeオブジェクトにも、Rangeプロパティがあり、同じくRangeオブジェクトを参照できるのです。
Rangeプロパティを介してRangeオブジェクトを参照しているのだと、まずはそのままに理解してください。
Rangeオブジェクトのデータ型
Dim MyRange As Range
Set MyRange = Worksheets(1).Range("B2:D10")
MyRange.Value =
"文字列"
これは、以下と同じです。
Worksheets(1).Range("B2:D10").Value = "文字列"
全てのセルを表すCells
シートの全セル
WorksheetオブジェクトのCellsは、シートの全セルを参照することになります。
複数セルを含むRangeオブジェクトの全セル
Rangeオブジェクトの使用例
Dim MyRange As Range
Set MyRange = Worksheets(1).Range("B2:D10")
MyRange.Cells(3, 2) = "C4セル"
これは、C3セルに文字が入ることになります。
RangeオブジェクトであるMyRangeの先頭セルはB2セルです。
Cells(...)は、Rangeオブジェクト内の行列の位置を引数に指定します。
MyRange.Cells(3, 2) はB2セルから3行目の2列目
つまりB2セルの2つ下1つ右のC4セルになります。
RangeオブジェクトのCells(...)とItem(...)
これは、
MyRange.Item(3, 2)
このようにItemプロパティを使っても同じ指定になります。
さらに、
MyRange.Item(8)
このようにItemに引数を1つだけ指定する書き方もあります。
2つ指定した場合は行列の指定。
1つだけ指定した場合はセルの順番(列→行)の位置のセルになります。
RangeとCellsの使い分け方
複数セル範囲と名前定義の場合はRangeを使う、それ以外はCellsを使う。
別の言い方をすれば、
変数を使う時はCells、Rows、Columnsを使用すると言う事です。
VBEの自動メンバ表示(インテリセンス)
この自動メンバ表示の事をインテリセンスと呼びます。
range("A1").
と、「.」を打った時点で、メンバが自動表示されます。
Cells(1, 1)
これでは表示されません。
cells.
このように、引数の()を省略するか、
cells().
と、引数を空っぽにするとメンバが自動表示されるようになります。
RowsとColumns
Columnsで取得されるRangeオブジェクトは列の集まりになります。
これらは、単一セルの集まりではなく、行全体や列全体の集まりになります。
Rows(n) → Rows.Item(n)
Columns(n) → Columns.Item(n)
Rangeオブジェクトは難しい
いきなり全てを理解することは困難です。
マクロVBAを書くときは、常にRangeオブジェクトを意識して書くようにして下さい。
そうすることで、少しづつ理解が深まっていきます。
第57回.Applicationのプロパティ(マクロ高速化と警告停止等)
Applicationは、Excel全体をあらわすオブジェクトです。
WorkbooksもApplicationのプロパティですが、
このようなApplicationを省略できるものは省略して書くことが多いので意識せずに使っているものが多くあります。
Applicationオブジェクトに含まれるプロパティ・メソッドは、非常にたくさんあります。
Applicationの主要プロパティ
プロパティ | 説明 |
Calculation | 計算方法のモード、自動・手動の切り替え |
Caller | Visual Basic を呼び出した方法についての情報 |
Cursor | ポインターの形状を設定 |
Dialogs | すべての組み込みダイアログ ボックス |
DisplayAlerts | マクロの実行中に特定の警告やメッセージの表示を制御 |
EnableEvents | 指定されたオブジェクトに対してイベントの発生を制御 |
FileDialog | ファイル ダイアログ |
Interactive | キーボードやマウスからの入力を受け付けるかどうか制御 |
ScreenUpdating | マクロの実行中に画面表示の更新を制御 |
StatusBar | ステータス バーの文字列を設定 |
ScreenUpdating(マクロVBAの高速化)
その画面更新にかかる時間が不要になり、それだけ早く処理が終了します。
Application.ScreenUpdating = True
このように明示的に書いておく方が良いでしょう。
DisplayAlerts(警告停止)
例えば、シート削除するときは、確認メッセージが表示されます。
この応答が出ると、マクロはそこで応答待ちになり、ボタンのクリックが必要になります。
応答が必要なメッセージの表示を止める為に使用します。
マクロが終了すると、自動的に表示する状態になりますが、
マクロの最期で、
Application.DisplayAlerts = True
このように明示的に書いておく方が良いでしょう。
Interactive(ユーザー操作の禁止)
ただし、マクロの終了で、自動的には戻りません。
Application.Interactive = True
として下さい。
忘れると、マクロ終了後もキーボード操作が効かなくなってしまいます。
Calculation(計算方法)
xlCalculationAutomatic | 自動 |
xlCalculationManual | 手動 |
xlCalculationSemiautomatic | データテーブル以外の自動 |
Application.Calculation = xlCalculationManual
この設定は、マクロ終了後も引き続き有効となりますので、
もし、マクロ実行前の状態に戻す必要がある場合は、
事前に変数に退避しておいて、その変数を戻すようにしてください。
Dim appCalc As XlCalculation '型はVariantでも構いません。
appCalc = Application.Calculation
Application.Calculation = xlCalculationManual
'各種処理・・・
Application.Calculation = appCalc
StatusBar
適宜、DoEvents をいれて再描画されるようにしてください。
Application.StatusBar = "実行中"
DoEvents
ステータス バーの文字列を消し既定値に戻すには、
または、
Application.StatusBar = vbNullString
Cursor
マクロVBA実行中にカーソルが頻繁にちらつくような場合は、この設定により処理速度が向上します。
xlDefault | 標準のポインター |
xlIBeam | I 字型ポインター |
xlNorthwestArrow | 矢印型ポインター |
xlWait | 砂時計型ポインター |
Application.Cursor = xlWait ← この時点でウエイトカーソルになります。
Application.Cursor = xlDefault ← 標準のカーソルに戻ります。
その他
Dialogs
第58回.コレクションとは(Collection)
同種のオブジェクトを複数まとめたものを「コレクション」と呼びます、
Worksheetオブジェクトが複数まとまったものは「Worksheetsコレクション」
オブジェクト名が単数形であるのに対し、
コレクション名が複数形であることがポイントです。
多くの場合、○○○オブジェクトに対応する、○○○sコレクションがあります。
コレクションの中から単一オブジェクトを指定する場合
コレクション.Item(オブジェクト名)
コレクション("オブジェクト名")
Worksheets("Sheet1")
Worksheets(1)
セルであるRangeオブジェクトのコレクションは?
少なくとも、
つまり、単一セルを表すオブジェクトが存在していないのです。
Cellsが複数形で、Cellオブジェクトのコレクションのような感じを受けるにもかかわらず、
Cellオブジェクトなんて存在していない事が、余計に混乱を招いているのかもしれません。
Rangeは、オブジェクトでもあり、コレクションでもあります。
コレクションの要素数
コレクション.Count
コレクション(2)
・・・
コレクション(コレクション.Count)
コレクションは、コレクション.Count個のオブジェクトの集まりだという事です。
例えば、「Sheet1」「Sheet2」「Sheet3」の3つのシートがある場合
Worksheets.Count → 3
Worksheets(1) → Sheet1
Worksheets(2) → Sheet2
Worksheets(3) → Sheet3
Collectionオブジェクト
VBAには、独自のコレクションを作成するためのオブジェクトが用意されています。
それがCollectionオブジェクトになります。
Collectionオブジェクを利用すると、互いに関連付けられた複数の要素を 1 つのオブジェクトとして参照できます。
文字列、数値、オブジェクトを要素とした独自のコレクション(オブジェクト)を作成できるという事です。
つまり、データ型の違うデータを1つのコレクションに入れられるという事になります。
Count
コレクション内のオブジェクトの数を含む長整数型 (Long) の値を返します。
値の取得のみ可能です。
Add | Collection オブジェクトにメンバを追加します。 |
Item | 指定した位置または文字列に対応する特定の Collection オブジェクトのメンバを返します。 |
Remove | Collection オブジェクトからメンバを削除します。 |
Addメソッド
object | 必ず指定します。 Collectionオブジェクトを指定します。 |
item | 必ず指定します。 追加するメンバを表す式を指定します。 |
key | 省略可能です。 各メンバの位置を表す数値の代わりに使用できる重複しない文字列を指定します。 |
before | 省略可能です。 コレクションの中の相対的な位置を表す式を指定します。 追加対象のメンバは、このbeforeで指定したメンバの前に追加されます。 |
after | 省略可能です。 コレクションの中の相対的な位置を表す式を指定します。 コレクション内のafterで指定したメンバの後ろに追加されます。 |
引数Keyには重複する値を指定できずエラーとなります。
引数Keyは省略可能ですが、その場合は当然キーによる要素へのアクセスは出来なくなります。
object.Remove index
object | 必ず指定します。 Collectionオブジェクトを指定します。 |
index | 必ず指定します。 削除するメンバの位置を式で指定します。 数式を使って指定する場合、1~Countプロパティの値までの範囲の整数を指定します。 文字列式を使って指定する場合、メンバをコレクションに追加したときに指定したkeyと一致する文字列を指定します。 |
Collectionの使用例
Dim colls As New Collection
'または、以下のように、DimとSetを使う
'Dim colls As Collection
'Set colls = New Collection
With colls
.Add Item:="アイテム1", Key:="key1"
.Add Item:="アイテム2", Key:="key2"
.Add Item:="アイテム3", Key:="key3"
.Remove ("key3")
.Add Item:="アイテム4", Key:="key4"
End With
MsgBox colls.Count '3と表示
MsgBox colls(1) 'アイテム1と表示
MsgBox colls.Item(2) 'アイテム2と表示
MsgBox colls.Item(3) 'アイテム4と表示
MsgBox colls("key4") 'アイテム4と表示
Collectionに対して以下のように処理すると、
後ろの要素に行くにしたがってより処理時間がかかってしまうようになります。
Dim i As Long
For i = 1 To colls.Count
Debug.Print colls(1)
Next
コレクションに対して、インデックス指定してアクセスすると、後ろの要素に行くにしたがってとても遅くなります。
コレクション対して全件処理する場合は、次回説明するFor Eachを使って以下のように処理してください。
Dim v As Variant
For Each v In colls
Debug.Print v
Next
第59回.コレクション処理(ForEach)
For Each は、コレクションの各要素に対して繰り返し処理を実行します。
For Each は、
コレクションの中から、個々のオブジェクトを取り出して処理する場合に使用します。
コレクションの全ての要素に対しての処理が終わるとループは終了します。
For Each の構文
[statements]
[Exit For]
[statements]
Next [element]
element | 必ず指定します。 コレクションの各要素を繰り返す変数を指定します。 引数 element にはバリアント型変数、総称オブジェクト型変数、または固有オブジェクト型のオブジェクト変数を指定できます。 |
group | 必ず指定します。 オブジェクト コレクション名または配列名を指定します。 |
statements | 省略可能です。 引数 group の各メンバに対して実行するステートメントを指定します。 |
elementのデータ型について
Variant(バリアント型) > Object(総称オブジェクト型) > 固有オブジェクト型
コレクション名の最後のsを取れば、多くの場合はそれで固有オブジェクト型になります。
For Each 変数 In ○○○s
・・・
Next 変数
Exit For
For Each 変数 In コレクション
・・・
If 終了すべき条件 Then
Exit
For
End If
・・・
Next
For Each の使用例
Dim ws As Worksheet
For Each ws In
Worksheets
ws.PrintPreview
Next ws
これで、全シートが印刷プレビューされます。
これは、For Eachを使わずに書くと、
Dim i As Integer
For i = 1 To Worksheets.Count
Worksheets(i).PrintPreview
Next
i
.Countは、コレクションの要素数です。
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
Debug.Print ws.Name
Next
マクロの書かれているブックのすべてのワークシートをイミィディエイト ウインドウに出力しています。
RangeオブジェクトのFor Each
Dim MyRange As Range
Dim i As Long
i = 1
For Each MyRange In
Range("A1:B5")
MyRange = i
i = i +
1
Next
A1,B1,A2,B2,・・・
このような順に処理されます。
列→行
この順で取得されます。
第60回.エラー処理(OnError)
マクロVBAのエラー発生例
マクロの記述の中に、実行不能な事が書かれていてエラーが発生し、VBAが停止してしまう事があります。
エラー発生したら、それに対応する為の処理をしたいとか、
そのような事が必要な場合もVBAでは結構あるものです。
エラー処理のステートメント
On Error Resume Next
On Error GoTo 0
On Error GoTo 行ラベル
行ラベルは、On Errorステートメントと同じプロシージャ内にある必要があります。
On Error Resume Next
On Error GoTo 0
On Error GoTo 0 ステートメントを指定していない場合は、プロシージャの終了時に自動的に無効になります。
On Error の有効範囲
On Error Resume Next
これらは、このステートメント以降、
On Error GoTo 0が出てくるか、プロシージャが終了するまでが有効範囲となります。
第61回.「OnError GoTo」と「Exit Sub」
「On Error GoTo 行ラベル」
このステートメントは、実行時エラーが発生した時に制御を指定の行ラベルに移動させるものです。
On Error Go To ステートメントを使用します。
On Error GoTo 行ラベル
これが実行された後にエラーが発生すると、行ラベルの位置に制御が移ります。
・On Error GoTo 0 を実行・・・ 同一プロシージャー内で記述されている場合のみ
・プロシージャーの終了
上記いずれかになるまでOn Errorは有効となります。
Sub Sample
On Error GoTo Label01
'・・・
'ここでエラー発生した場合はLabel01に移動
'・・・
On Error GoTo 0
'・・・
'ここでエラー発生した場合はVBA停止します
'・・・
Exit Sub
Label01:
エラー時の処理
End Sub
行ラベル
これが、行ラベルです。
ラベル名:
このようにラベル名の後ろに:(コロン)を付けて書きます。
行ラベルではなく、行番号(数字)を指定することもできますす。
On Error GoTo 10
'・・・
10:
このように数字の後ろに:(コロン)を付けて書きます。
Exit Sub
先に掲示したVBAコードの場合、Exit Subが無いと常にエラー時の処理が必ず実行されてしまいます。
On Error の有効範囲とその動作について
Sub sample1()
On Error GoTo Label01
Call sample2
Call sample3
Exit Sub
Label01:
MsgBox "Label01"
End Sub
Sub sample2()
On Error GoTo Label02
Dim i As Long
i = "abc"
On Error GoTo 0
Exit Sub
Label02:
MsgBox "Label02"
End Sub
Sub sample3()
Dim i As Long
i = "abc"
Exit Sub
Label03:
MsgBox "Label03"
End Sub
sample02には、On Error GoTo Label02、があるのでエラー発生時はLabel02に移ります。
sample03には、On Error がないので、エラー発生した時点でプロシージャーを抜けます。
「Label02」→「Label01」の順でメッセージ表示されます。
・呼び出し元にOn Error が無い場合はエラー停止します。
・呼び出し元にOn Error がある場合はその時点でプロシージャーを抜けます。
第62回.「OnError Resume Next」とErrオブジェクト
「On Error Resume Next」
このステートメントは、実行時エラーが発生してもマクロVBAを中断せずに、エラーが発生したステートメントの次のステートメントから実行を継続します。
On Error Resume Next
このステートメント以降、On Error GoTo 0 が無い限り、プロシージャーの終わりまで有効となります。
On Errorが実行された時点で、それ以前のエラー情報は消去さます。
Errオブジェクト
Err.Clear | すべてのプロパティの設定値をクリア |
Err.Description | エラーに関する簡単な説明 |
Err.HelpContext | ヘルプ ファイルのトピックに対応するコンテキスト番号 |
Err.HelpFile | ヘルプ ファイルへの絶対バス |
Err.LastDllError | 最後にダイナミック リンク ライブラリ (DLL) を呼び出したときのエラー コード |
Err.Number | エラーを指定する数値。エラーではない場合は0 |
Err.Source | エラーの発生元のオブジェクトまたはアプリケーションの名前 |
Errオブジェクトは、プロジェクト内で一つしか存在しません。
つまり、エラーの情報を複数保持しておくことはできません。
On Error Resume Next の使用例
Dim i As Long
On Error Resume Next
i = "ABC"
If Err.Number <> 0 Then
MsgBox Err.Description
Err.Clear
End If
MsgBox Err.Number
この場合、メッセージボックスには、
「型が一致しません」と表示されます。
そして、Err.Clearの後のメッセージ表示は「0」となります。
Err.Clearを実行すると、Errオブジェクトがクリアされエラー情報は消去されます。
第63回.ブックを開く(Open)
Workbooks.Openメソッド
名前 | 説明 |
FileName | 開くブックのファイル名。 |
UpdateLinks | ファイル内の外部参照 (リンク) の更新方法を指定します。 |
ReadOnly | ブックを読み取り専用モードで開くには、True を指定します。 |
Format | テキスト ファイルを開く場合は、この引数で区切り文字を指定します。 |
Password | パスワード保護されたブックを開くのに必要なパスワードを指定します。 |
WriteResPassword | 書き込み保護されたブックに書き込みをするために必要なパスワードを指定します。 |
IgnoreReadOnlyRecommended | [読み取り専用を推奨する] チェック ボックスをオンにして保存されたブックを開くときでも、読み取り専用を推奨するメッセージを非表示にするには、True を指定します。 |
Origin | 開こうとしているファイルがテキスト ファイルの場合、それがどのような形式のテキスト ファイルかを指定します。 |
Delimiter | 開こうとしているファイルがテキスト ファイルで、引数 Format が 6 の場合は、この引数で区切り文字を使用します。 |
Editable | 開こうとしているファイルが Excel 4.0 のアドインの場合、この引数に True を指定すると、アドインがウィンドウとして表示されます。 |
Notify | ファイルが読み取り/書き込みモードで開けない場合に、ファイルを通知リストに追加するには、True を指定します。 |
Converter | ファイルを開くときに最初に使用するファイル コンバーターのインデックス番号を指定します。 |
AddToMru | 最近使用したファイルの一覧にブックを追加するには、True を指定します。既定値は False です。 |
Local | Excel の言語設定 に合わせてファイルを保存するには、True を指定します。 |
CorruptLoad | 開くモードを、XlCorruptLoad列挙で指定します。 抽出(xlExtractData)、正常(xlnormalload)、修復(xlRepairFile)から指定します。 既定の動作はxlNormalLoadになり、回復は行われません。 |
戻り値
FileName:=Thisworkbook.Path & "\sample.xls"
Thisworkbook.Path、これでブック自身のパスが取得できます。
3 : 外部参照 (リンク) が更新されます。
(1,2の指定もありますが、特に使う事はないでしょう)
これで、リンクが更新されずに、ブックが開かれます。
0はFalseと記す事もできます、VBAではFalse=0です。
ReadOnly
これで、読み取り専用で開かれます。
Password:="読取りパスワード"
WriteResPassword:="書込みパスワード"
このようにすることで、パスワード入力のダイアメグが出なくなります。
エラーのあるエクセルファイルを開くと、
「'○○'の一部の内容に問題が見つかりました。・・・」とメッセージが出ます。
「はい」をクリックすると、
修復されたメッセージが表示され、「閉じる」でブックを開くことができます。
しかし、
このファイルをVBAでOpenすると、マクロがエラー停止してしまいます。
回復して開く場合はCorruptLoadにxlRepairFileを指定します。
Application.DisplayAlerts = False
これも同時に指定してください。
Application.DisplayAlerts = False
Workbooks.Open Filename:=ファイルパス, CorruptLoad:=xlRepairFile
Openメソッドの使用例
Application.DisplayAlerts = False
Workbooks.Open Filename:="C:\Test\sample.xls", UpdateLinks:=0,
ReadOnly:=True, CorruptLoad:=xlRepairFile
・外部参照 (リンク) は更新しない
・読み取り専用
・修復モード
このように、引数が複数になる場合は、名前付き引数を使用した方が良いでしょう。
Openメソッドの戻り値の使い方
Setステートメント
Dim wb As Workbook
Set wb = Workbooks.Open(Filename:="C:\User\sample.xls")
戻り値が、Workbookオブジェクトなので、同時にSetステートメントでオブジェクト変数に入れています。
これは、
Workbooks.Open(Filename:="C:\User\sample.xls")
これと
Set wb = Activeworkbook
または、
Set wb = Workbooks("sample.xls")
これらを1行で指定している事と同じ意味になります。
Withステートメント
With Workbooks.Open(Filename:=str)
'・・・
. Close SaveChanges:=False
End With
このように、Withで戻り値のブックオブジェクトを受け取る事が出来ます。
開いたブックをVBA内で使用する場所が限定されている場合は、簡単になります。
Workbooks.Addメソッド
この引数にXlWBATemplate定数を指定しすると、新しいブックには指定した種類のシートが1つだけ含まれます。
名前 | 値 | 説明 |
xlWBATChart | -4109 | グラフ |
xlWBATExcel4IntlMacroSheet | 4 | Excel バージョン 4 のマクロ |
xlWBATExcel4MacroSheet | 3 | Excel バージョン 4 のインターナショナル マクロ |
xlWBATWorksheet | -4167 | ワークシート |
第64回.ブックを閉じる・保存(Close,Save,SaveAs)
ブックを閉じる
SaveChanges | ブックに変更がない場合、この引数は無視されます。ブックに変更がある場合、この引数で変更を保存するかどうかを指定します。 |
Filename | 変更後のブックのファイル名。 |
RouteWorkbook | ブックの回覧。 |
全ての引数を省略
とだけ指定した場合は、ブックに変更が無ければそのまま閉じられ、
ブックに変更がある場合は、保存確認のメッセージが表示されます。
これが指定されている場合は、確認のメッセージが表示されずに保存もされません。
True:ブックに変更がある場合は保存します。
False:ブックに変更があっても保存せずに閉じます。
ブックを上書き保存
ブックに名前を付けて保存
Filename | 保存するファイルの名前を表す文字列を指定します。 |
FileFormat | ファイルを保存するときのファイル形式を指定します。 |
Password | ファイルを保護するためのパスワードを表す15 文字以内の文字列を指定します。 |
WriteResPassword | ファイルの書き込みパスワードを表す文字列を指定します。 |
ReadOnlyRecommended | 読み取り専用で開くことを推奨するメッセージを表示するには、True を指定します。 |
CreateBackup | バックアップ ファイルを作成するには、True を指定します。 |
AccessMode | ブックのアクセス モードを指定します。 |
ConflictResolution | ブックを保存するときの競合の解決方法を指定します。 |
AddToMru | 最近使用したファイルの一覧にブックを追加するにはTrueを指定。既定値はFalseです。 |
TextCodepage | 使用しない。 |
TextVisualLayout | 使用しない。 |
Local | 通常は使用しない。 ※csv出力時 日付がm/d/yyyyになってしまう場合に、yyyy/m/dにする場合にはTrueを指定 |
全ての引数がオプション(任意の指定)となっていますが、通常は、FileNameは必ず指定します。
パスを指定しない場合は、カレントフォルダーに保存されます。
xlExcel9795 : Excel2003以前のxls
Excel2003以前では、xlExcel8、この定数は使用できません、コンパイルエラーとなります。
ブックのコピーを保存
メモリ上のブック(開かれているブック)に対しては、変更は行われません。
バックアップの作成等で使用します。
ブックを閉じる・保存の実践例
他のブックが開かれていない場合は、Excelを終了する場合。
Sub 保存して終了()
If Workbooks.Count > 1 Then
ThisWorkbook.Close
SaveChanges:=True
Else
ThisWorkbook.Save
Application.Quit
End
If
End Sub
Sub 保存しないで終了()
If Workbooks.Count > 1 Then
ThisWorkbook.Close
SaveChanges:=False
Else
ThisWorkbook.Saved =
True
Application.Quit
End If
End
Sub
Application.Quit
.SavedをTrueにすることで保存後に変更が無い状態にすることが出来ます。
第65回.シートの挿入、名前の変更(Add,Name)
シートの挿入
Worksheets.Add Before, After, Count, Type
Before | 指定したシートの直前に、新しい シートを追加します。 |
After | 指定したシートの直後に、新しいシートを追加します。 |
Count | 追加するシートの数を指定します。 既定値は 1 です。 |
Type | ワークシートの種類を指定します。 既定値は xlWorksheet です。 Worksheets.Addの場合は、xlWorksheet以外は指定できません。 |
戻り値
既定値は選択したシートの数です。
複数シートを同時に追加した場合、戻り値は最後に追加されたシートのオブジェクトになります。
xlChart | グラフ |
xlDialogSheet | ダイアログ シート |
xlExcel4IntlMacroSheet | Excel バージョン 4 International Macro シート |
xlExcel4MacroSheet | Excel バージョン 4 マクロ シート |
xlWorksheet | ワークシート |
既定値は xlWorksheet 、つまりワークシートです。
Worksheets.Addの場合は、xlWorksheet以外を指定するとエラーになります。
アクティブシートの直前にワークシートが追加されます。
シートの最後にワークシートが追加されます。
シートの名前変更
シートのオブジェクト.Nameプロパティ
このプロパティの値を変更します。
シート挿入、名前変更の実践例
Dim ws As Worksheet
Set ws =
Sheets.Add(After:=Sheets(Sheets.Count))
ws.Name =
"新規シート"
With Sheets.Add(After:=Sheets(Sheets.Count))
.Name = "新規シート"
End With
シートの最後に、"新規シート"というワークシートを追加しています。
Sheets.Addの戻り値がオブジェクトなので、
前者は、戻り値をそのままオブジェクト変数に入れて使用しています。
後者は、戻り値をWithで受けとって使用しています。
第66回.シートのコピー・移動・削除Copy,Move,Delete)
シートのコピー・移動
Before | コピーしたシートを特定のシートの直前の位置に挿入するときに、そのシートを指定します。 ただし、引数 After を指定すると、引数 Before を指定することはできません。 |
After | コピーしたシートを特定のシートの直後の位置に挿入するときに、そのシートを指定します。 ただし、引数 Before を指定すると、引数 After を指定することはできません。 |
備考
新規ブックが自動的に作成され、シートはその新規ブック内にコピー・移動されます。
Worksheets(1).Copy
Worksheets(1)だけの、新規ブックが作成されます。
Worksheets(1).Copy After:=Worksheets(Worksheets.Count)
1番目のシートを最後のシートの後ろにコピーしています。
Sheets("シート名").Move After:=Sheets(Sheets.Count)
Sheets("シート名")をシートの最後に移動しています。
シートの削除
Worksheets(1).Delete
先頭のシートが削除されます。
シートを削除すると、メッセージが表示され、マクロが中断します。
Application.DisplayAlerts = False
これを入れる事で、このメッセージは出なくなります。
Application.DisplayAlerts = False
Worksheets(1).Delete
同じテーマ「マクロVBA入門」の記事
マクロVBA入門の簡易目次
【VBA学習のお勧めコース】
VBAの基礎・基本の要約
第1回.マクロとは?VBAとは?VBAでできること
第2回.まずはマクロVBAを使う準備
第3回.マクロの記録
第4回.マクロはどこに書くの(VBEの起動)
第5回.VBEのオプション設定(Option Explicit)
第6回.とにかく書いてみよう(Sub,End Sub)
第7回.マクロを実行するには(F5)
第8回.セルに文字を入れるとは(RangeオブジェクトのValueプロパティ)
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。