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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow