サーチ…


アプリケーションワークブック

多くのExcelアプリケーションでは、VBAコードに含まれているブックに向けられた処理が行われます。そのブックを ".xlsm"拡張子で保存し、VBAマクロはワークシート内のワークシートとデータのみにフォーカスします。ただし、他のワークブックのデータを結合またはマージする必要がある場合や、別のワークブックにデータの一部を書き込む必要がある場合があります。多くのVBAアプリケーションでは、他のブックを開いたり閉じたり、保存したり、作成したり、削除したりすることが一般的な必要条件です。

VBAエディタでいつでも、 ApplicationオブジェクトのWorkbooksプロパティを使用して、Excelのそのインスタンスで現在開いているすべてのワークブックを表示およびアクセスできます。 MSDNのドキュメントでは、リファレンスについて説明しています。

ActiveWorkbookとThisWorkbookを使用するタイミング

VBAコードが参照するワークブックを常に指定するためのVBAベストプラクティスです。この指定を省略すると、VBAはコードが現在アクティブなブック( ActiveWorkbook )に向けられているとActiveWorkbookます。

'--- the currently active workbook (and worksheet) is implied
Range("A1").value = 3.1415
Cells(1, 1).value = 3.1415

ただし、特に複数のワークブックが同時に開いている場合、特にVBAコードがExcelアドインから実行されている場合は、 ActiveWorkbookへの参照が混乱したり間違ったりする可能性があります。たとえば、時刻をチェックし、アドインのワークシートの1つに保存されている値と比較するUDFを持つアドイン(通常はユーザーが容易には見えない)は、どのブックがあるかを明示的に識別する必要があります参照されています。この例では、開いた(アクティブな)ワークブックにA1 =EarlyOrLate()セルの式があり、そのアクティブブックに書き込まれたVBAはありません。アドインには、以下のユーザー定義関数(UDF)があります。

Public Function EarlyOrLate() As String
    If Hour(Now) > ThisWorkbook.Sheets("WatchTime").Range("A1") Then
        EarlyOrLate = "It's Late!"
    Else
        EarlyOrLate = "It's Early!"
    End If
End Function

UDFのコードは、インストールされたExcelアドインに書き込まれ、格納されます。これは、 "WatchTime"と呼ばれるアドイン内のワークシートに格納されたデータを使用します。 ThisWorkbookThisWorkbook代わりにActiveWorkbookを使用していた場合、どのワークブックが意図されているかを保証することはできません。

既に開かれている場合でもA(新)ワークブックを開く

既に開いているワークブックにアクセスする場合は、 Workbooksコレクションから割り当てを取得するのは簡単です。

dim myWB as Workbook
Set myWB = Workbooks("UsuallyFullPathnameOfWorkbook.xlsx")

新しいブックを作成する場合は、 Workbooksコレクションオブジェクトを使用して新しいエントリをAddします。

Dim myNewWB as Workbook
Set myNewWB = Workbooks.Add

あなたが必要とするワークブックが既に開いているかどうか、または存在しない可能性がある場合や、(または気にしない)時があります。このサンプル関数は、有効なブックオブジェクトを常に返す方法を示しています。

Option Explicit
Function GetWorkbook(ByVal wbFilename As String) As Workbook
    '--- returns a workbook object for the given filename, including checks
    '    for when the workbook is already open, exists but not open, or
    '    does not yet exist (and must be created)
    '    ***  wbFilename must be a fully specified pathname
    Dim folderFile As String
    Dim returnedWB As Workbook
    
    '--- check if the file exists in the directory location
    folderFile = File(wbFilename)
    If folderFile = "" Then
        '--- the workbook doesn't exist, so create it
        Dim pos1 As Integer
        Dim fileExt As String
        Dim fileFormatNum As Long
        '--- in order to save the workbook correctly, we need to infer which workbook
        '    type the user intended from the file extension
        pos1 = InStrRev(sFullName, ".", , vbTextCompare)
        fileExt = Right(sFullName, Len(sFullName) - pos1)
        Select Case fileExt
            Case "xlsx"
                fileFormatNum = 51
            Case "xlsm"
                fileFormatNum = 52
            Case "xls"
                fileFormatNum = 56
            Case "xlsb"
                fileFormatNum = 50
            Case Else
                Err.Raise vbObjectError + 1000, "GetWorkbook function", _
                         "The file type you've requested (file extension) is not recognized. " & _
                         "Please use a known extension: xlsx, xlsm, xls, or xlsb."
        End Select
        Set returnedWB = Workbooks.Add
        Application.DisplayAlerts = False
        returnedWB.SaveAs filename:=wbFilename, FileFormat:=fileFormatNum
        Application.DisplayAlerts = True
        Set GetWorkbook = returnedWB
    Else
        '--- the workbook exists in the directory, so check to see if
        '    it's already open or not
        On Error Resume Next
        Set returnedWB = Workbooks(sFile)
        If returnedWB Is Nothing Then
            Set returnedWB = Workbooks.Open(sFullName)
        End If
    End If
End Function

ユーザーに質問せずにワークブックを保存する

多くの場合、VBAを使用して既存のブックに新しいデータを保存すると、ファイルが既に存在することを示すポップアップ質問が表示されます。

このポップアップ質問を防止するには、これらの種類のアラートを抑制する必要があります。

Application.DisplayAlerts = False        'disable user prompt to overwrite file
myWB.SaveAs FileName:="NewOrExistingFilename.xlsx"
Application.DisplayAlerts = True         're-enable user prompt to overwrite file

新しいワークブックでのワークシートのデフォルト数の変更

新しいExcelワークブックで作成されるワークシートの「工場出荷時のデフォルト」数は、通常3に設定されます。あなたのVBAコードは、新しいワークブック内のワークシートの数を明示的に設定できます。

'--- save the current Excel global setting
With Application
    Dim oldSheetsCount As Integer
    oldSheetsCount = .SheetsInNewWorkbook
    Dim myNewWB As Workbook
    .SheetsInNewWorkbook = 1
    Set myNewWB = .Workbooks.Add
    '--- restore the previous setting
    .SheetsInNewWorkbook = oldsheetcount
End With


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow