excel-vba
Arbeitsmappen
Suche…
Anwendungs-Arbeitsmappen
In vielen Excel-Anwendungen führt der VBA-Code Aktionen aus, die auf die Arbeitsmappe gerichtet sind, in der er enthalten ist. Sie speichern diese Arbeitsmappe mit der Erweiterung ".xlsm", und die VBA-Makros konzentrieren sich nur auf die Arbeitsblätter und die darin enthaltenen Daten. In manchen Fällen müssen Sie jedoch Daten aus anderen Arbeitsmappen kombinieren oder zusammenführen oder einige Ihrer Daten in eine separate Arbeitsmappe schreiben. Das Öffnen, Schließen, Speichern, Erstellen und Löschen anderer Arbeitsmappen ist für viele VBA-Anwendungen eine häufige Notwendigkeit.
Im VBA-Editor können Sie jederzeit alle Arbeitsmappen, die derzeit von dieser Instanz von Excel geöffnet werden, mit der Workbooks
Eigenschaft des Application
Objekts anzeigen und darauf zugreifen. Die MSDN-Dokumentation erläutert dies mit Referenzen.
Wann Verwenden von ActiveWorkbook und ThisWorkbook
Es ist eine bewährte Methode für VBA, immer anzugeben, auf welche Arbeitsmappe Ihr VBA-Code verweist. Wenn diese Angabe ausgelassen wird, geht VBA davon aus, dass der Code an die aktuell aktive Arbeitsmappe ( ActiveWorkbook
) gerichtet ist.
'--- the currently active workbook (and worksheet) is implied
Range("A1").value = 3.1415
Cells(1, 1).value = 3.1415
Wenn jedoch mehrere Arbeitsmappen gleichzeitig geöffnet sind, insbesondere wenn VBA-Code von einem Excel-Add-In ActiveWorkbook
können Verweise auf das ActiveWorkbook
verwirrt oder fehlgeleitet werden. Beispielsweise muss ein Add-In mit einer UDF, die die Tageszeit überprüft und mit einem Wert vergleicht, der in einem der Arbeitsblätter des Add-Ins (die normalerweise für den Benutzer nicht sichtbar sind) gespeichert ist, muss explizit angeben, um welche Arbeitsmappe es sich handelt referenziert werden. In unserem Beispiel hat unsere offene (und aktive) Arbeitsmappe eine Formel in der Zelle A1 =EarlyOrLate()
und KEINE VBA, die für diese aktive Arbeitsmappe geschrieben wurde. In unserem Add-In haben wir folgende User Defined Function (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
Der Code für die UDF wird geschrieben und im installierten Excel-Add-In gespeichert. Es verwendet Daten, die in einem Arbeitsblatt im Add-In namens "WatchTime" gespeichert sind. Wenn die UDF ActiveWorkbook
anstelle von ThisWorkbook
, kann sie niemals garantieren, welche Arbeitsmappe vorgesehen ist.
Öffnen einer (neuen) Arbeitsmappe, auch wenn sie bereits geöffnet ist
Wenn Sie auf eine bereits geöffnete Arbeitsmappe zugreifen möchten, ist das Abrufen der Zuweisung aus der Workbooks
Sammlung unkompliziert:
dim myWB as Workbook
Set myWB = Workbooks("UsuallyFullPathnameOfWorkbook.xlsx")
Wenn Sie eine neue Arbeitsmappe erstellen möchten, verwenden Sie dann die Workbooks
Sammlung Objekt Add
einen neuen Eintrag.
Dim myNewWB as Workbook
Set myNewWB = Workbooks.Add
Es kann vorkommen, dass Sie die Arbeitsmappe, die Sie benötigen, nicht bereits geöffnet haben oder nicht (oder nicht) oder nicht oder nicht vorhanden ist. Die Beispielfunktion zeigt, wie immer ein gültiges Arbeitsmappenobjekt zurückgegeben wird.
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
Speichern einer Arbeitsmappe, ohne den Benutzer zu fragen
Beim Speichern neuer Daten in einer vorhandenen Arbeitsmappe mit VBA wird häufig eine Popup-Frage angezeigt, die darauf hinweist, dass die Datei bereits vorhanden ist.
Um diese Popup-Frage zu verhindern, müssen Sie diese Arten von Warnungen unterdrücken.
Application.DisplayAlerts = False 'disable user prompt to overwrite file
myWB.SaveAs FileName:="NewOrExistingFilename.xlsx"
Application.DisplayAlerts = True 're-enable user prompt to overwrite file
Ändern der Standardanzahl von Arbeitsblättern in einer neuen Arbeitsmappe
Die "werkseitige" Anzahl von Arbeitsblättern, die in einer neuen Excel-Arbeitsmappe erstellt werden, ist im Allgemeinen auf drei festgelegt. Ihr VBA-Code kann die Anzahl der Arbeitsblätter in einer neuen Arbeitsmappe explizit festlegen.
'--- 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