Excel file sluiten indien nog open

Status
Niet open voor verdere reacties.

jhdw

Gebruiker
Lid geworden
15 dec 2012
Berichten
166
Goedenavond,

Ik hoop dat de Access experts mij kunnen helpen.
De code hieronder maakt een Excel bestand dat wordt opgeslagen op de PC/Laptop van de gebruiker.
Het gaat prima zolang de gebruiker er maar voor zorgt dat er geen Excel met dezelfde naam open staat.
Als het bestand nog open staat dan krijg ik Error 70, het bestand kan dan niet meer verwijderd worden (kenmerk - alleen lezen)

Nu zou ik graag een code willen toevoegen die controleert of een bestand met dezelfde naam open staat. Dat bestand moet dan gesloten worden.
Excel mag niet gesloten worden omdat de gebruiker(s) vaak nog andere Excel bestanden open hebben staan.

Code:
        strSQL = "SELECT tbl_selectie.Onderdeel, Left([Omschrijving],30) AS Omschr, Left([Extra_info],30) AS ExtraInfo, tbl_selectie.Magazijn, tbl_selectie.Locatie "
        strSQL = strSQL & "FROM tbl_selectie;"
   
            DoCmd.Hourglass (True)
            Set rs1 = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
                If rs1.RecordCount = 0 Then
                    MsgBox "Geen gegevens beschikbaar om te exporteren", vbInformation + vbOKOnly, "No data exported"
                        GoTo SubExit
                End If

        'Early Binding
            Set xlApp = Excel.Application
            xlApp.Visible = True
            Set xlBook = xlApp.Workbooks.Add
            Set xlSheet = xlBook.Worksheets(1)
                       
            With xlSheet
                .Name = "Kopieerlijst"
                .Cells.Font.Name = "Arial"
                .Cells.Font.Size = 11
                .Cells.NumberFormat = "@"
                   
        'Set column widths
                .Columns("A").ColumnWidth = 18
                .Columns("B").ColumnWidth = 30
                .Columns("C").ColumnWidth = 30
                .Columns("D").ColumnWidth = 17
                .Columns("E").ColumnWidth = 15
                
        'Format colums
'                .Columns("D").NumberFormat = "#,##0.00"
        
        'build report heading
                .Range("A1", "E1").Cells.Font.Bold = True

        'build column headings
                .Range("A1").Value = "Onderdeel"
                .Range("B1").Value = "Omschrijving"
                .Range("C1").Value = "Extra_info"
                .Range("D1").Value = "Magazijn"
                .Range("E1").Value = "Locatie"

        'Format Column Headings
                .Range("A1:E1").HorizontalAlignment = xlCenter
'                .Range("A5:E5").Cells.Font.Bold = True
                .Range("A1:E1").AutoFilter
                
        'provide initial value to row counter
                i = 2
        'Loop through recordset and copy data from recordset to sheet
                                             
                Do While Not rs1.EOF
                    .Range("A" & i).Value = Nz(rs1!Onderdeel, "")
                    .Range("B" & i).Value = Nz(rs1!Omschr, "")
                    .Range("C" & i).Value = Nz(rs1!ExtraInfo, "")
                    .Range("D" & i).Value = Nz(rs1!Magazijn, "")
                    .Range("E" & i).Value = Nz(rs1!Locatie, "")
                  
                    i = i + 1
                    rs1.MoveNext
                Loop
                          
                sMap = "C:\Access"
                    If Dir(sMap, vbDirectory) = "" Then MkDir sMap
                        sMap = sMap & "\" & "Excel"
                            If Dir(sMap, vbDirectory) = "" Then MkDir sMap
                                ChDir sMap
                                    sMap = sMap & "\" & "Kopieerlijst" & ".xlsx"
                                        If Len(Dir(sMap, vbDirectory)) > 0 Then Kill sMap
                                            ActiveWorkbook.SaveAs FileName:=sMap, _
                                            FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
            End With
        CurrentDb.Execute "DELETE tbl_selectie.* FROM tbl_selectie;", dbFailOnError

SubExit:
On Error Resume Next
 
        DoCmd.Hourglass False
        rs1.Close
        Set rs1 = Nothing
        Set dB = Nothing

Alvast bedankt voor de hulp.

Gr. Jan
 
Sluiten kan met:
xlBook.Close True

True betekent dat het werkboek met wijzigingen wordt opgeslagen.
Als dat niet nodig is gebruik je False.
 
Laatst bewerkt:
Goedenavond Edmoor,

Het Excel bestand gebruiken ze om labels te kunnen printen met een Dymo printer. De layout hebben ze allemaal in Excel geregeld. Ik kan niet rechtstreeks vanuit Access de Dymo printer aansturen.

Het Excel bestand gebruiken ze alleen om één of meerdere labels te printen en wordt niet bewaard.

Waar zet ik xlBook.Close True of xlBook.Close False neer?
Hieronder kan niet volgens mij want de naam van het bestand wordt verderop (sMap = sMap & "" & "Kopieerlijst" & ".xlsx") aangemaakt

Code:
 Set xlApp = Excel.Application
            xlApp.Visible = True
            Set xlBook = xlApp.Workbooks.Add
            Set xlSheet = xlBook.Worksheets(1)

Er zou ergens een code moeten komen waarin gecontroleerd wordt of sMap geopend is.
Ik heb alleen geen idee hoe en waar.

Ik kan ook het gedeelte sMap laten vervallen. Dan krijg je bijv. de naam Map1. Als de gebruiker de Excel wil sluiten dan krijg je steeds de vraag of het bestand opgeslagen moet worden. Dat is ook niet praktisch.

Alvast bedankt

Gr. Jan
 
Die sMap is een folder, niet een document.
Het sluiten van een document doe je uiteraard daar waar hij gesloten mag worden wegens niet meer nodig.

Waar open je het werkboek?
 
Ik vergiste me.
Hij hoeft niet Public te zijn zolang hij in een Module staat.
In plaats van Application.Run "SubNaam" kan je gewoon dit doen: SubNaam
 
@ Octafish
Laat ik het anders zeggen, ik heb zelf geen Dymo label printer. De gebruikers hebben altijd met Excel gewerkt om de labels te printen.
Ik heb meer mogelijkheden in het programma zitten om een Excel bestand te genereren.

Nu heb ik een voorbeeld gemaakt zodat jullie kunnen zien hoe het werkbook geopend wordt.
Het is dus de bedoeling dat het Access programma de Excel file (kopieerlijst.xlsx) sluit als de gebruiker het zelf niet gedaan heeft, dus nadat hij op de Excel knop gedrukt moet de controle plaats vinden.

Ik hoop dat het nu wat duidelijker is.

Gr. Jan
 

Bijlagen

  • Test_Excel_open.zip
    39,4 KB · Weergaven: 28
Voeg een paar regels toe:
Code:
SubExit:
On Error Resume Next
    DoCmd.Hourglass False
    rs1.Close
    Set rs1 = Nothing
    Set dB = Nothing
    On Error GoTo 0
[B][COLOR="#0000FF"]    xlBook.Close
    xlApp.Quit
[/COLOR][/B]   Exit Sub
 
Als ik deze 2 regels toevoeg dan wordt het bestand direct weer gesloten en dat is niet de bedoeling.
De gebruiker wil er natuurlijk wel iets mee doen.

HTML:
Het is dus de bedoeling dat het Access programma de Excel file (kopieerlijst.xlsx) sluit als de gebruiker het zelf niet gedaan heeft, dus nadat hij op de Excel knop gedrukt moet de controle plaats vinden.

Gr. Jan
 
Na lang zoeken op het internet deze functie gevonden:

Code:
Public Function IsWorkbookOpen(ByVal strWorkBookName As String) As Boolean
Dim objExcel As Object
Dim varWorkbook As Variant

On Error GoTo ExitFunction
    Set objExcel = GetObject(, "Excel.Application")
    For Each varWorkbook In objExcel.Workbooks
        If varWorkbook.Name = strWorkBookName Then
            IsWorkbookOpen = True
            Exit For
        End If
    Next
ExitFunction:
    Set objExcel = Nothing
End Function

Onder de knop cmd_excel onderstaande code geplaatst.
Het opgegeven bestand wordt gesloten en Excel blijft open staan. Precies zoals ik wilde:D

Code:
 If IsWorkbookOpen("Kopieerlijst.xlsx") = True Then
    MsgBox "Je hebt nog Excel bestand met de naam Kopieerlijst open staan!" & vbCrLf _
        & "" & vbCrLf _
        & "Deze wordt nu gesloten.", vbOKOnly Or vbExclamation, Application.Name
        Workbooks("Kopieerlijst.XLSX").Close False
    Exit Sub
 End If

Gr. Jan
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan