LoginSignup
0
2

More than 5 years have passed since last update.

EXCEL VBA ブック関連 自分用メモ crossfish21

Last updated at Posted at 2018-05-18

開いているブックを全て閉じる (Excelのアプリケーション自体は残る)

    ' 開いているブックを全て閉じる(Excelのアプリケーション自体は残る)
    Workbooks.Close

ブックを閉じる

   ' 1番目に開いたブックを閉じる
    Workbooks(1).Close

    ' ブック名を指定して閉じる
    Workbooks("aaa.xlsx").Close

    ' 保存してからブックを閉じる
    Workbooks("aaa.xlsx").Close SaveChanges:=True


    ' 開いていないブックを閉じようとするとエラーになるので注意

    On Error Resume Next
    Workbooks("開いていない.xlsx").Close
    On Error GoTo 0

リンク1


新規ブックを作成する

    ' 新規ブックを作成する
    Workbooks.Add

ブックを開く

    ' ブックを開く(フルパス指定)
    Workbooks.Open "C:まとめ総合ExcelVBAaaa.xlsx"
    Workbooks.Open Filename:="C:まとめ総合ExcelVBAaaa.xlsx"


    Workbooks.Open Filename:="C:まとめ総合ExcelVBAaaa.xlsx", ReadOnly:=True
    ' 読み取り専用で開く

    Workbooks.Open Filename:="C:まとめ総合ExcelVBAaaa.xlsx", Password:="readPASS", WriteResPassword:="writePASS"
    ' 読み取りパスワードを"readPASS"、書込みパスワードを"writePASS"で開く

    Workbooks.Open Filename:="C:まとめ総合ExcelVBAaaa.xlsx", UpdateLinks:=0, IgnoreReadOnlyRecommended:=True
    ' ブックのリンクを更新しない、「読み取り専用で開くことを推奨」を無視する(書込みできるように開く)


    ' ※データの書き換えをすると問題があるブックは、以下のように読み取り専用で開くのが手堅い
    Workbooks.Open Filename:="C:まとめ総合ExcelVBAaaa.xlsx", UpdateLinks:=0, ReadOnly:=True

    ' ※データの書き換えをする場合は、以下のようにするのが適当かな
    Workbooks.Open Filename:="C:まとめ総合ExcelVBAaaa.xlsx", UpdateLinks:=0, IgnoreReadOnlyRecommended:=True


    ' ファイルが存在しなかった場合はエラーになるので、その簡易対策
    On Error Resume Next
    Workbooks.Open "C:まとめ総合ExcelVBA存在しないブック.xlsx"
    On Error GoTo 0

    ' ファイルの存在を確認してから開く
        If Dir("C:まとめ総合ExcelVBAaaa.xlsx") <> "" Then
        Workbooks.Open "C:まとめ総合ExcelVBAaaa.xlsx"
    Else
        MsgBox "ファイルが存在しません。", vbExclamation
    End If

    ' ファイルを選択するダイアログを開く方法
    ' この方法ですでに開いているブックを二重に開いてもエラーにならないのでいいかも
    Dim OpenFileName As String
    OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
    If OpenFileName <> "False" Then
        Workbooks.Open OpenFileName
    Else
        MsgBox "キャンセルされました"
    End If

    ' すでに開いているブックを開こうとするとエラーになるので、事前に調べる
    Dim wb As Workbook
    For Each wb In Workbooks
        If wb.Name = "aaa.xlsx" Then
            MsgBox "aaa.xlsxは、すでに開いています"
            Exit Sub
        End If
    Next wb
    Workbooks.Open "C:まとめ総合ExcelVBAaaa.xlsx"


    ' 一番手堅いと思われるブックの開き方
    Dim buf As String
    Dim wb As Workbook
    Const Target As String = "C:まとめ総合ExcelVBAaaa.xlsx"

    ''ファイルの存在チェック
    buf = Dir(Target)
    If buf = "" Then
        MsgBox Target & vbCrLf & "は存在しません", vbExclamation
        Exit Sub
    End If
    ''同名ブックのチェック
    For Each wb In Workbooks
        If wb.Name = buf Then
            MsgBox buf & vbCrLf & "はすでに開いています", vbExclamation
            Exit Sub
        End If
    Next wb
    ''ここでブックを開く
    Workbooks.Open Target

リンク1


ブックを保存する

    ' 上書き保存
    ActiveWorkbook.Save

    ' 名前を付けて保存
    ActiveWorkbook.SaveAs Filename:="C:まとめ総合ExcelVBAbb.xlsx"

リンク1


ブック関連のイベント

Private Sub Workbook_NewSheet(ByVal Sh As Object)
' 新しいシートを作成した時。引数の"Sh"は、新しく作成したシートになる

    Sh.Move After:=Worksheets(Sheets.Count)
    ' 新規作成したシートを、最後尾に移動する

End Sub


Private Sub Workbook_BeforeClose(Cancel As Boolean)
' ブックを閉じる前のイベント。引数の"Cancel"をTrueにすると、ブックを閉じる処理がキャンセルされる

    Dim answer As Long

    answer = MsgBox("ブックを閉じます。よろしいですか?", vbYesNo)
    If answer = vbNo Then
        Cancel = True   ' 閉じる処理をキャンセル
        MsgBox "ブックを閉じる処理は中止します"
    End If

End Sub


Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
' ブックを保存する前のイベント。引数の"Cancel"をTrueにすると、ブックを閉じる処理がキャンセルされる

    If IsNumeric(Cells(1, 1).Value) = False Then  ' セルA1の値が数値に評価できない場合
        Cancel = True
        MsgBox "セルA1の値を数値にしてから、ブックを保存してください"
    End If

End Sub


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
' ブック内のいずれかのシートの、セルの値が変更された時に発生する
' 引数の"Sh"は値の変更されたセルのあるシート、引数の"Target"は値の変更されたセル
' アクティブシートが変わった時のイベントではない

    MsgBox Sh.Name
    MsgBox Target.Address

End Sub


Private Sub Workbook_Activate()  ' ブックがアクティブになった時
End Sub

Private Sub Workbook_AfterSave(ByVal Success As Boolean)   ' ブックを保存した後
End Sub

Private Sub Workbook_Open()   ' ブックを開いた時
End Sub


※※ 他にも種類あり

リンク1
リンク2


他のブックのコードを実行する

Sub aaa()

    Application.Run "bbb.xlsm!OtherBookSub"
    ' bbb.xlsm の OtherBookSub() を実行する。PrivateプロシージャでもOK
    ' ※ただし、bbb.xlsmを開いていない場合、開いてから実行されるのがどうも

End Sub



' bbb.xlsm の標準モジュール内にあるコード
Private Sub OtherBookSub()

    MsgBox "bbb.xlsm の OtherBookSub() が呼ばれました"

End Sub

リンク1


ブックを開かずに、セルの値を取得する

 MsgBox ExecuteExcel4Macro("'C:まとめ総合ExcelVBA[bbb.xlsx]シート1'!R1C1")
    ' C:まとめ総合ExcelVBAbb.xlsx 「シート1」シート セルA1の値を、ブックを開かずに取得
    ' セル番地はR1C1形式でしか指定できないので、使いにくい
    ' セルが空白だった場合、「0」が返るみたい。なお使いにくいな・・・

    Dim cellR1C1 As String
    Dim i As Long
    Dim j As Long

    ' bbb.xlsx 「シート1」 の Range(Cells(1,1),Cells(5,5)) の値を取得
    For i = 1 To 5
        For j = 1 To 5
            cellR1C1 = "R" & i & "C" & j
            Debug.Print ExecuteExcel4Macro("'C:まとめ総合ExcelVBA[bbb.xlsx]シート1'!" & cellR1C1)
        Next j
    Next i


    ' ※面倒なわりに制約も多いから、あまり使えないかな

リンク1


VBEのショートカットメニューに、項目を追加する

リンク1

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2