VBA :: Excel VBA and Macro
Excel 専用 VBA & Macro
※個人的メモ(内容非保証)
VBAの基本的な概念:オブジェクト、コンテナ、コレクション、プロパティ、メソッドの理解
エクセル独自のコマンド、プロパティなど。
Visual Basic for Applications でほぼ共通と思われる機能については割愛。
▲上へ [ 編集 ]
ブックの操作
閉じる | Closeメソッド |
開く / 新規作成 / アクティブ | Open、Add、Activateメソッド |
保存 | Close、Save、SaveAs メソッド |
■ブックの名前を取得する
Range("A1").Value = ThisWorkbook.Name Range("A1").Value = ActiveWorkbook.Name■ブックの作成
Workbooks.Add ' 新規 book の作成■ブックを開く
※事前にブックが存在することが前提
Workbooks.Open Filename:="C:\Book1.xls" Workbooks.Open Filename:="C:\Book1.xls", _ Password:="pass1234" ' 動作未確認 Workbooks.Open Filename:="D:\Book1.xls", _ WriteResPassword:="pass1234" ' 動作未確認 Workbooks.Open Filename:="D:\Book1.xls", _ ReadOnly:=True ' 読み込み専用で開く '「ファイルを開く」ダイアログ表示 Application.Dialogs(xlDialogOpen).Show■ブックを閉じる
Workbooks("Book1.xls").Close ' 「変更を保存しますか?」ダイアログ有 Workbooks("Book1.xls").Close SaveChanges:=True ' 上書き保存 Workbooks("Book1.xls").Close SaveChanges:=False ' 変更があっても保存せずに終了 '名前を指定名称に変更し保存する。 '保存先ディレクトリ指定が無いとマイドキュメントに保存される様である。 '(注)Book1 の変更が有っても Book1 への変更は反映せず閉じられる。 Workbooks("Book1.xls").Close SaveChanges:=True, _ ' 実質 Book1 の copy を作る Filename:="Book2" 'Excel もいっしょに終了する場合 Application.Quit■ブックの保存
ThisWorkbook.Save ' 上書き保存 ThisWorkbook.SaveAs Filename:="test1" ' "test1" と名前を付けて保存 '名前を変えて保存 ActiveBook が Book2 になることに注意。 '既に 同名の Book が存在する場合、上書き確認のダイアログが表示される。 Workbooks("Book1.xls").SaveAs Filename:="Book2.xls" Workbooks("Book1.xls").SaveAs Filename:="csv_file.csv", _ FileFormat:=xlCSV ' CSV 形式で保存 Workbooks("Book1.xls").SaveAs Filename:="Book3.xls", _ Password:="pass1234" ' パスワード付きで保存※HTML 形式で保存する場合:xlHTML を指定する。
※読み取り Password 設定の他、書き込み WriteResPassword パスワード設定も可
※保存の実行に伴い、ActiveBook が保存したBook に切り替わるので注意が必要。
■ブックのイベントプロシージャ
Workbook_Open ' ブックを開く時に発生 Workbook_Activate ' ブックがアクティブになった時発生 Workbook_WindowActivate ' ブックのウィンドウがアクティブになった時発生 Workbook_BeforeClose ' ブックを閉じる直前に発生 Workbook_Deactivate ' 開いてるブックが非アクティブになったとき発生 Workbook_BeforeSave ' 開いてるブックを保存する前に発生
▲上へ [ 編集 ]
シートの操作
オブジェクトとコレクション | Worksheets、Charts、Sheetsコレクション |
選択 | Activate、Selectメソッド |
追加 / 移動 / コピー | Add、Move、Copyメソッド |
非表示 | Visibleプロパティ |
■シートの追加
Add メソッドに対し、Before, After, Count などの引数を指定可能。
Worksheets.Add ' sheet が一つ追加される Worksheets.Add _ Before:=Worksheets("Sheet3") ' sheet3 の前に一つ追加 Worksheets.Add _ After:=Worksheets("Sheet2") ' sheet2 の後ろに一つ追加 Worksheets.Add Count:=2 ' Count で指定した数の sheet を追加 Worksheets.Add _ After:=Worksheets("Sheet3"), _ Count:=2 ' 指定数 指定位置以降に sheet を追加■シート名を変更する
ActiveSheet.Name = "シート1" ' Active Sheet の名前変更 Worksheets("Sheet2").Name = "シート2" ' 指定 Sheet の名前変更■シート名を取得する
Range("A3").Value = ActiveSheet.Name Range("A4").Value = Worksheets(2).Name ' (1) 2番目のワークシート名を取得 Range("A5").Value = Sheets(2).Name ' (2) (1) との相違が良く判らない?■シートの数を取得する
Range("A1").Value = ThisWorkbook.Worksheets.Count■シートの移動
ActiveSheet.Move _ After:=Worksheets("Sheet2") ' Active Sheet を指定シート後へ移動 ActiveSheet.Move _ Before:=Worksheets("Sheet3") ' Active Sheet を指定シート前へ移動 Worksheets("Sheet2").Move _ After:=Worksheets("Sheet3") ' 指定 Sheet を 指定 Sheet 後へ移動 Worksheets("Sheet3").Move _ Before:=Worksheets("Sheet1") ' 指定 Sheet を 指定 Sheet 前へ移動■シートのコピー
ActiveSheet.Copy _ After:=Worksheets("Sheet2") ' Active Sheet を指定シート後へ copy ActiveSheet.Copy _ Before:=Worksheets("Sheet2") ' Active Sheet を指定シート前へ copy Worksheets("Sheet2").Copy _ After:=Worksheets("Sheet2") ' 指定 Sheet を 指定 Sheet 後へ copy Worksheets("Sheet2").Copy Before:=Worksheets("Sheet3") ' 指定 Sheet を 指定 Sheet 前へ copy■シートの削除
ActiveSheet.Delete ' Active Sheet 削除(確認ダイアログ有) Worksheets("Sheet3").Delete ' 指定 Sheet 削除(確認ダイアログ有) '※ 確認ダイアログの抑制と表示 Application.DisplayAlerts = False ' 確認ダイアログ表示を抑制する Application.DisplayAlerts = True ' 確認ダイアログを表示■シートのイベントプロシージャ
Worksheet_Activate ' アクティブになった時発生 Worksheet_BeforeDoubleClick ' ダブルクリック直前に発生 Worksheet_BeforeRightClick ' 右クリック直前に発生 Worksheet_Calculate ' 計算処理後に発生 Worksheet_Change ' 内容変更時に発生 Worksheet_Deactivate ' 非アクティブ化で発生 Worksheet_FollowHyperlink ' ハイパーリンクのクリックで発生 Worksheet_SelectionChange ' 選択範囲、選択セル変更時に発生
シート操作の基本
Cells の操作をする場合、通常操作対象 Worksheet を何らかの形で指定する必要がある。
Sheet1 上の CommandButton を押して、Sheet2 を選択する例。
Private Sub CommandButton1_Click() Worksheets("Sheet2").Activate End Sub・・・以降、Sheet2 以外にフォーカス移動(もしくは意図的な指定)しなければ、操作対象 cell は、Sheet2 上のセルとなる。
シート名とシート数の取得
Sub get_sheet_cnt_name() Dim i, cnt_sheet As Integer i = 1 'シート名を取得 For Each n_sheet In Worksheets Cells(i, 1).Value = i Cells(i, 2).Value = n_sheet.Name cnt_sheet = i i = i + 1 Next 'シート数を取得 Cells(i, 1).Value = "シート数" Cells(i, 2).Value = cnt_sheet End Sub※next の後で i = i - 1 とすれば、以降シート数として利用ることが出来る。この例では、別途 cnt_sheet を設けシート数を保持している。
--- Cells 使い方 memo ---
Cells(x,y) :: Cells(row_no,column_no) :: Cells(row_pos,column_pos) など x 軸、y軸の変数を決めて置くと判りやすい。 --- for each *1 in *2 〜 next の memo ---
繰り返し操作で便利。*1 は、任意の変数として定義され、*2 は対象のオブジェクトを指定する(・・・ようである・・・)。
※便利なのは知っていたが、vb2005 では使わずに済ましていた・・・。
シート専用コマンド・プロパティ
Sheets.Count 選択book 内のシート数をカウントする・・・らしい。
▲上へ [ 編集 ]
セルの操作
単一セル選択 | Cellsプロパティ、Activate、Selectメソッド |
複数セル選択 | Rangeプロパティ、Activate、Selectメソッド |
値 / 数式 / 表示形式 | Value、Formula、FormulaR1C1プロパティ |
切取 / コピー / 貼付 / 挿入 | Cut、Copy、Paste、PasteSpecial、Insertメソッド |
クリア | Clear、ClearFormats、ClearContents、ClearCommentsメソッド |
行 / 列 | Rows、Columns、EntireRow、EntireColumn、Count、Hiddenプロパティ |
データベース | CurrentRegion、Offset、EndプロパティやResizeメソッド |
セルのプロパティ
Range 及び Cells には、各種用途の異なるプロパティを持つ。.Value はセルの内容を指定する他、セルの色、高さ、幅、その他、各種プロパティが存在する。
※原則、Cells と Range はほぼ同様に使える(・・・と思う・・・)ので、Range でのみ記載。
■書式設定関連
Range("A1").Interior.Color = RGB(255, 0, 0) ' セル背景色を RGB関数で設定 Range("A2").Interior.ColorIndex = 10 ' セルの背景色を 色番号で指定 Range("A3").Font.Bold = True ' セル内文字を太字に設定 Range("A3").Font.Italic = True ' セル内文字を斜体に設定 Range("A3").Font.Underline = _ xlUnderlineStyleSingle ' セル内文字へ下線を設定 Range("A3").Font.Color = RGB(255,255,255) ' セル内文字の色を設定■クリア、範囲選択、その他
Range("A1").ClearContents ' セル内容(文字列など)クリア Range("A2").Clear ' セル内容(書式も含め)クリア Range("C3").Select ' セル選択 Range("E5:I7").Select ' (1).セル範囲選択 Range(Cells(5, 5), Cells(10, 10)).Select ' (2).Cells を使用した範囲選択■セル・選択範囲への名前付け
左上「名前ボックス」での操作性向上、VBA での操作などの改善が見込める?
Range("A1").Name = "Fast_Cell_1_1" ' セルに名前をつける Range("B2:D5").Name = _ "Range_of_Selection_B2_D5" ^ セル範囲へ名前を付ける■値の取得
MsgBox Range("A2").Value ' (1).セルの値を取得する str_val = Range("A3").Value ' (2).変数を使用した例 MsgBox str_val Range("B5").Value = Range("A2").Value ' セル間での転記■セルの挿入と削除
Range("B12").Insert Shift:=xlDown ' 標準で下方向へシフトする Range("B12").Delete Shift:=xlUp ' 標準で上方向へシフトする■コピーと貼り付け
Range("B7:C18").Copy _ Destination:=Range("E8") ' B7:C18 -> E8 へ copy & past■切り取りと貼り付け
Range("B7:C18").Cut Destination:=Range("E8") ' B7:C18 -> E8 へ cut & past
▲上へ [ 編集 ]
セル操作の基本
sheet1 へ CommandButton1 を配置しコードを設定するとして・・・
Private Sub CommandButton1_Click() Range("A1").Value = "(1).Range(""A1"").Value 指定:Hello VBA!!" Cells(2, 1).Value = "(2).Cells(2, 1).Value 指定:Hello VBA!!" End Sub・・・のように記述し実行すると、セル A1 へ (1) が、セル A2 へ (2) が代入される。
基本は Range("A1").Value となるが、VBA でプログラムを組む場合、Cells(x,y).Value とし WorkSheets の Cells を配列のように利用するのが一般的である。
▲上へ [ 編集 ]
With ~ End With ステートメント
同一オブジェクトに対して複数のプロパティを設定する場合に便利。
多分、Excel 専用ではなかったと思う・・・。
Private Sub CommandButton1_Click() With Range("A5") .Value = "Hello VBA !!" .Interior.Color = RGB(255, 0, 0) .Font.Bold = True .Font.Color = RGB(255, 255, 255) End With End Sub
Range や Cells 以外にも WorkSheets でもよく利用される。
▲上へ [ 編集 ]
リンク
初めてでも分かるVBAの本
内部リンク
- VBA(VisualBasic for Applications)
- VB2005リファレンス(覚え書き)
外部リンク
- まだありません
▲上へ [ 編集 ]
2009年02月11日(水) 10:56:13 Modified by cafeboy1