sironekotoroの日記

Perl で楽をしたい

Excel VBA ベーシック 公式テキスト 9章 ブックとシートの操作

ブックを開く

  • ブックの操作をするときは、「Workbooksコレクション内の任意のブック」と指定する必要がある。
  • Workbooks.Add 空の新規ブックを追加する
    • 挿入されるブックの名前は、「Book2」「Book3」など、Excelが自動的に連番で付ける
    • 挿入されたブックが常にアクティブになる
  • Workbooks.Open.Filename :="C:\Work\Book1.xlsx" ファイルを新規で開く

    • 開くパスはフルパスでの指定が必要。省略するとカレントフォルダのブックと見なされる
    • ファイルを開く際には、ファイルの存在の有無を確認するDir関数等との組み合わせで確認するべき
  • ファイル名とファイルの場所決め打ちパターン

If Dir("C:\fizzbuzz.xlsx") = "" Then
    MsgBox "File Not Found"
Else
    Workbooks.Open Filename:="C:\fizzbuzz.xlsx"
End If
  • Inputboxつかって、ファイル名を入力させるパターン
Dim target As String
target = InputBox("Input File Name")
If target <> "" Then
    If Dir(target) <> "" Then
        Workbooks.Open Filename:=target
    Else
        MsgBox "File Not found"
    End If

Else
    MsgBox "Filname is not input"

End If
  • Application.GetOpenFilename() 「ファイルを開く」ダイアログからファイルを選択させる
Dim Target As String
Target = Application.GetOpenFilename()
Workbooks.Open Target
  • 「ダイアログから開く」はいい方法だが、キャンセルしたかどうかの判断が無く、xlsx以外の拡張子も表示されている。この点を修正する
    • GetOpenFile()でキャンセルボタンが押されると、falseが返る。それをif文で判断する。
    • ファイル選択画面でFileFilterオプションを使って、表示されるファイルの種類を制御する。
Dim Target As String

Target = Application.GetOpenFilename("Excelブック,*.xlsx")

If Target <> False Then
    Workbooks.Open Target
Else
    MsgBox "Canceld"
End If

ブックを保存する

  • ActiveWorkbook.Save 上書き保存
  • ActiveWorkbook.SaveAs 名前をつけて保存
    • On Error Resume Next エラーを無視。「名前をつけて保存」のマクロを2回続けたときにキャンセルボタンを押すと、エラーダイアログが出る。これを回避する。

ブックを閉じる

  • ActiveWorkbook.Close ブックを閉じる
  • ActiveWorkbook.Close SaveChanges:=True 変更を保存して閉じる
  • ActiveWorkbook.Close SaveChanges:=False 変更を保存しないで閉じる

複数ブックの操作

  • Activate 複数のブックを開いているときに、任意のブックを表示する
    • Workbooks.("Book2.xlsx").Activate Book2.xslxを表示する。

ワークシートを挿入する

  • Sheets.Add シートを追加する

シートを開く

  • SelectまたはActivateを使う
  • Worksheets("Sheet1").Activate Sheet1を開く
  • 現在表示されていないブックのワークシートを開く場合にはSelectは利用できない

シートの名前を変える

  • Worksheets("Sheet1").Name = "TEST" Sheet1の名前をTESTに変える
  • しかし、ワークブック内には同一のシート名は存在できないというルールがあり、これを考慮する必要がある。
    • 「変更するシート名」と、「他のシート名」を確認する。
      • Worksheets(シート名) シート名を特定
      • Worksheets.(番号) 開かれているブックのシートを左から数えて何番目に位置しているか
      • Worksheets.Count ワークシートの数を返す
  • 変更しようとするワークシートの名前に重複がないかチェック
Dim i As Long
Dim flag As Long

For i = 1 To Worksheets.Count
    If Worksheets(i).Name = "TEST" Then
    flag = 1
    End If
Next i

If flag = 1 Then
    MsgBox "Already TEST sheet"
Else
    MsgBox "TEST sheet not exist"
End If
  • 設定しようとしているシート名に利用できない文字が入っていた場合のチェック
    • 「:(コロン)」「¥(円)」「/(スラッシュ)」「?(疑問符)」「*(アスタリスク)」「[(左角括弧)」「](右角括弧)」
    • 「:(コロン)」のみチェック
Dim filename As String
filename = InputBox("Input Filename")

If InStr(filename, ":") = 0 Then

    ActiveSheet.Name = filename
Else
    MsgBox "利用できない文字が入っています"
End If
  • しかし、「:(コロン)」以外にも利用できない文字はある。逐一チェックは大変だ。
  • 「ファイル名を変更し、エラーが出たら利用できない文字が入っているのだろう」と考える。
    • On Error Resume Next を利用する。
Dim filename As String
filename = InputBox("Input Filename")

On Error Resume Next

ActiveSheet.Name = filename

If ActiveSheet.Name = filename Then
    MsgBox "シート名を変更しました"
Else
    MsgBox "利用できない文字が入っています"
End If

ワークシートのコピー

  • Worksheets("sheet1").Copy after:=Worksheets("Sheet4") ワークシートを対象の右にコピー
  • Worksheets("sheet1").Copy before:=Worksheets("Sheet4") ワークシートを対象の左にコピー
  • Worksheets("sheet1").Move after:=Worksheets("Sheet4") ワークシートの移動

ワークシートを表示/非表示にする

  • Worksheets("Sheet3").Visible = False 非表示にする
  • Worksheets("Sheet3").Visible = True 表示する
  • もちろん、ブックに無いシートを変更しようとしてもエラーとなる

ワークシートを削除する

  • Worksheets("Sheet7").Delete Sheet7を削除する
  • Application.DisplayAlerts = False 削除確認メッセージを表示させたくないときに利用