Sök…


Användningsböcker

I många Excel-applikationer gör VBA-koden åtgärder riktade mot arbetsboken där den finns. Du sparar den arbetsboken med en ".xlsm" -tillägg och VBA-makronen fokuserar bara på kalkylblad och data inom. Det finns dock ofta tillfällen när du behöver kombinera eller slå samman data från andra arbetsböcker eller skriva en del av dina data till en separat arbetsbok. Öppna, stänga, spara, skapa och ta bort andra arbetsböcker är ett vanligt behov för många VBA-applikationer.

När som helst i VBA-redigeraren kan du visa och komma åt alla arbetsböcker som för närvarande är öppna med den instansen av Excel med hjälp av egenskapen Workbooks för Application . MSDN-dokumentationen förklarar det med referenser.

När du ska använda ActiveWorkbook och ThisWorkbook

Det är en VBA Best Practice att alltid ange vilken arbetsbok din VBA-kod hänvisar till. Om denna specifikation utelämnas antar VBA att koden är riktad mot den för närvarande aktiva arbetsboken ( ActiveWorkbook ).

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

Men när flera arbetsböcker är öppna samtidigt - särskilt och särskilt när VBA-kod körs från ett Excel-tillägg - kan referenser till ActiveWorkbook förväxlas eller felkopplas. Till exempel, ett tillägg med en UDF som kontrollerar tiden på dagen och jämför det med ett värde som lagras på ett av tilläggets kalkylblad (som vanligtvis inte är synliga för användaren) måste uttryckligen identifiera vilken arbetsbok som är hänvisas. I vårt exempel har vår öppna (och aktiva) arbetsbok en formel i cell A1 =EarlyOrLate() och har INTE någon VBA skriven för den aktiva arbetsboken. I vårt tillägg har vi följande användardefinierad funktion (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

Koden för UDF skrivs och lagras i det installerade Excel-tillägget. Den använder data lagrade på ett kalkylblad i tillägget "WatchTime". Om UDF hade använt ActiveWorkbook istället för ThisWorkbook , skulle det aldrig kunna garantera vilken arbetsbok som var avsedd.

Öppna en (ny) arbetsbok, även om den redan är öppen

Om du vill komma åt en arbetsbok som redan är öppen är det enkelt att få uppdraget från Workbooks samlingen:

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

Om du vill skapa en ny arbetsbok använder du samlingsobjektet Workbooks att Add en ny post.

Dim myNewWB as Workbook
Set myNewWB = Workbooks.Add

Det finns tillfällen då du kanske inte eller (eller bryr dig) om den arbetsbok du behöver är öppen redan eller inte, eller om den inte finns. Exempelfunktionen visar hur du alltid returnerar ett giltigt arbetsbokobjekt.

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

Spara en arbetsbok utan att fråga användaren

Att spara ny data i en befintlig arbetsbok med VBA orsakar ofta en popup-fråga som noterar att filen redan finns.

För att förhindra denna popup-fråga måste du undertrycka dessa typer av varningar.

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

Ändra standardantalet av kalkylblad i en ny arbetsbok

Antalet fabriksinställda arbetsblad som skapats i en ny Excel-arbetsbok är vanligtvis inställt på tre. Din VBA-kod kan uttryckligen ställa in antalet kalkylblad i en ny arbetsbok.

'--- 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow