サーチ…
アプリケーションワークブック
多くの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"と呼ばれるアドイン内のワークシートに格納されたデータを使用します。 ThisWorkbook
がThisWorkbook
代わりに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