Exelmacro openen vanuit Access

Status
Niet open voor verdere reacties.

so10070

Gebruiker
Lid geworden
4 feb 2014
Berichten
419
Ik tracht een werkbook te openen vanuit Access maar krijg de volgende foutmelding (nr 1004): "Het bestand 2590056.xlsx kan niet worden geopend omdat de bestandsindeling of de bestandsextensie niet geldig is". Heb dit gecontroleerd en is een excelbestand met de juiste extentie (xlsx). Hierbij de code
Code:
              Dim XL As Object
                        Dim OpenWerkboek As Object
                        
                        Set XL = CreateObject("Excel.Application")
                        txtOpenWerkboekPad = "C:\IGEANToets_FE\TeVersturenExcels\" & txtStamboeknummerVersturen & ".xlsx"
                        
                        With XL
                            .Visible = False
                            .DisplayAlerts = False
                            .Workbooks.Open (txtOpenWerkboekPad)
                            
                            With .OpenWerkboek
                                .Range("A2").Select
    '                            .Range("A2", Selection.End(xlDown)).Select
                            
                            End With
                            OpenWerkboek.SaveAs "C:\IGEANToets_FE\TeVersturenExcels\" & txtStamboeknummerVersturen & ".xlsx"
                        End With
                        
                        OpenWerkboek.Close
                        XL.Close
                        
                        Set OpenWerkboek = Nothing
                        Set XL = Nothing
Ik wil ook in Access een Excelmacro te laten lopen. Is dat mogelijk? Ik krijg hier een foutmelding op .Range("A2",Selection.End(xlDown)).Select
 
Wat gebeurd er als je dat werkboek direct met Excel opent?
En wat is XL.OpenWerkboek?
Dat is niet een bij Excel bekende Methode.
 
Excelfile was wel degelijk corrupt. Dat probleem is opgelost. Bedankt! :eek:
Blijft mijn tweede vraag bestaan: kan ik een macro aanmaken in mijn applicatie met Excelfuncties, zoals
Code:
Range("L2").Select
Range(Selection, Selection.End(xlDown)).Select
Code:
With Selection.Validation
        .Delete
        .Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, _
        Operator:=xlBetween, Formula1:="0", Formula2:="3"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = "Foute ingave"
        .InputMessage = ""
        .ErrorMessage = "Geef juiste waarde in!"
        .ShowInput = True
        .ShowError = True
End With
Code:
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
ActiveWorkbook.Save
 
Uiteraard kan je die aanmaken, maar ze zullen alleen werken in de context van een Excel object.
 
Ik heb reeds op verschillende manieren geprobeert. Maar hoe moet ik bijvoorbeeld deze code op de plaats in mijn procedure krijgen (zie gekleurd gedeelte). Het Excelobject is geopend, dacht ik toch. Hoe zou deze code hier geplaatst moeten worden?
Code:
    Range("M2:M26,O2,O2:O26,Q2,Q2:Q26").Select
    Range("Q2").Activate
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, _
        Operator:=xlBetween, Formula1:="0", Formula2:="3"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = "Foute ingave"
        .InputMessage = ""
        .ErrorMessage = "Geef juiste waarde in!"
        .ShowInput = True
        .ShowError = True
    End With

Code:
                        Dim XL As Excel.Application
                        Dim OpenWerkboek As Excel.Workbook
                        
                        Set XL = CreateObject("Excel.Application")
                        Set OpenWerkboek = XL.Workbooks.Open("C:\IGEANToets_FE\TeVersturenExcels\" & txtStamboeknummerVersturen & ".xlsx")
                        
                        With XL
                            .Visible = False
                            .DisplayAlerts = False
                            
                            With OpenWerkboek
                                'vanaf hier Excel formatting
                                'opletten op iAantalDomeinen!
                                'eerst aantal Down tellen
                                .[COLOR="#000080"]EN HIER MACRO CODE?[/COLOR]                                

                            End With
                        End With
                        
                        OpenWerkboek.Close
                        XL.Close
                        
                        Set OpenWerkboek = Nothing
                        Set XL = Nothing
 
Net zoals je het in Excel zou doen.
Je moet er nog wel een bladnaam voor zetten.

Daarnaast heeft dit niets met Access van doen.
 
De code is prima aan de praat te krijgen.
Code:
Sub testExcel()
Dim XL As Excel.Application
Dim OpenWerkboek As Excel.Workbook
Dim rng As Excel.Range
    Set XL = CreateObject("Excel.Application")
    Set OpenWerkboek = XL.Workbooks.Open("C:\IGEANToets_FE\TeVersturenExcels\" & txtStamboeknummerVersturen & ".xlsx")
    With XL
        .Visible = True
        .DisplayAlerts = False
        
        With OpenWerkboek
            Set rng = Union(Range("H2:H26"), Range("M2:M26"), Range("O2:O26"))
            With rng.Validation
                .Delete
                .Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="0", Formula2:="3"
                .IgnoreBlank = True
                .InCellDropdown = True
                .InputTitle = "Testje"
                .ErrorTitle = "Foute ingave"
                .InputMessage = "Niet fout doen!"
                .ErrorMessage = "Geef juiste waarde in!"
                .ShowInput = True
                .ShowError = True
            End With
        End With
    End With
    
''    OpenWerkboek.Close
''    XL.Quit
    
End Sub
 
Bedankt, het werkt! :thumb:. Ik wil de Range variabel maken volgens de invoer van de gebruiker, maar krijg een foutmelding: "Typen komen niet overeen" ->> Set rng = txtRanges. Ik weet niet hoe ik het type van de string moet aanpassen? Graag wat hulp!

Code:
                        Dim iRijen As Long
                        Dim XL As Excel.Application
                        Dim OpenWerkboek As Excel.Workbook
                        Dim rng As Excel.Range
                        Dim txtRanges As String
                        Dim txtNaamKolom As Strings
                        
                        Set XL = CreateObject("Excel.Application")
                        Set OpenWerkboek = XL.Workbooks.Open("C:\IGEANToets_FE\TeVersturenExcels\" & txtStamboeknummerVersturen & ".xlsx")
                        
                        txtRanges = ""
                        txtNaamKolom = "MOQSUWY" 'Let op slechts 7 domeinen maximaal toe te kennen
                        
                        With XL
                            .Visible = False 'waarom False?
                            .DisplayAlerts = False
                            
                            With OpenWerkboek
                                'vanaf hier Excel formatting
                                'opletten op iAantalDomeinen!
                                'Bepaal het aantal Ranges volgens het aantal iAantalDomeinen
                                'Opnieuw de integer "i" gebruiken
                                For i = 1 To iAantalDomeinen
                                    txtRanges = txtRanges + "Range(""" & Mid(txtNaamKolom, i, 1) & ";" & iAantalLeerlingen & """),"
                                Next i
                                txtRanges = "Union(" & Mid(txtRanges, 1, Len(txtRanges) - 1) & ")"
                                
                                [COLOR="#000080"][B][U]Set rng = txtRanges[/U][/B][/COLOR]
                                
                                With rng.Validation
                                    .Delete
                                    .Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="0", Formula2:="3"
                                    .IgnoreBlank = True
                                    .InCellDropdown = True
                                    .InputTitle = "Punten ingeven"
                                    .ErrorTitle = "Foute ingave"
                                    .InputMessage = "Geef hier je punten in."
                                    .ErrorMessage = "Geef juiste waarde in!"
                                    .ShowInput = True
                                    .ShowError = True
                                End With

                            End With
                            OpenWerkboek.SaveAs "C:\IGEANToets_FE\TeVersturenExcels\" & txtStamboeknummerVersturen & ".xlsx"
                        End With
                        
                        OpenWerkboek.Close
                        XL.Close
                        
                        Set OpenWerkboek = Nothing
                        Set XL = Nothing
 
Je maakt de fout dat je commando's vervangt door tekst. Dat kan natuurlijk nooit.
Code:
Sub testje()
Dim txtNaamKolom As String, arr() As Variant
Dim rng As Range

    txtNaamKolom = "MOQSUWY" 'Let op slechts 7 domeinen maximaal toe te kennen
    For i = 0 To Len(txtNaamKolom) - 1
        ReDim Preserve arr(i)
        arr(i) = Mid(txtNaamKolom, i + 1, 1)
    Next i
    For i = LBound(arr) To UBound(arr)
        If i = LBound(arr) Then
            Set rng = Range("" & arr(i) & ":" & arr(i) & "")
        Else
            Set rng = Union(rng, Range("" & arr(i) & ":" & arr(i) & ""))
        End If
        MsgBox rng.Address
    Next i

End Sub
 
Geweldig! Bedankt! :thumb::thumb:. Heb de Option Base op 1 gezet anders krijgt de LBound(arr) de laagste waarde 0. Toch nog wat theoretische kennis nodig. Msg rng.Address geeft "$M:$M,$O:$O,$Q:$Q". Hoe weet Excel dat dat hier bijvoorbeeld verwezen wordt naar Range("M2:M25")?
 
In Excel wordt de opdracht .ErrorTitle, .ErrorMessage niet uitgevoerd ofschoon .ShowError = True.
 
Msg rng.Address geeft "$M:$M,$O:$O,$Q:$Q". Hoe weet Excel dat dat hier bijvoorbeeld verwezen wordt naar Range("M2:M25")?
Dat weet Excel uiteraard niet; ik heb jouw voorbeeldcode aangepast. Daarbij ben ik uitgegaan van txtNaamKolom = "MOQSUWY" Dus daar heb ik de ranges op gebaseerd, en dan krijg je complete kolommen. Ik ging er eigenlijk vanuit dat je daar zelf wel a.d.h.v. het voorbeeld de juiste ranges van kan maken :).
Code:
Sub testExcel()
Dim XL As Excel.Application
Dim OpenWerkboek As Excel.Workbook
Dim rng As Excel.Range
Dim arr() As Variant, iR As Integer
Const txtNaamKolom As String = "MOQSUWY"    'Let op slechts 7 domeinen maximaal toe te kennen
    
    iR = InputBox("Typ het aantal rijen:", "Aantal rijen", 25)
    If Not IsNumeric(iR) Then Exit Sub
    
    Set XL = CreateObject("Excel.Application")
    Set OpenWerkboek = XL.Workbooks.Open("H:\Mijn documenten\Downloads\HelpMij\Test\XLS\aantallen.als.xlsx")
    With XL
        .Visible = True
        .DisplayAlerts = False
        
        With OpenWerkboek
            For i = 0 To Len(txtNaamKolom) - 1
                ReDim Preserve arr(i)
                arr(i) = Mid(txtNaamKolom, i + 1, 1)
            Next i
            For i = LBound(arr) To UBound(arr)
                If i = LBound(arr) Then
                    Set rng = Range("" & arr(i) & "2:" & arr(i) & iR & "")
                Else
                    Set rng = Union(rng, Range("" & arr(i) & "2:" & arr(i) & iR & ""))
                End If
                MsgBox rng.Address
            Next i
            With rng.Validation
                .Delete
                .Add type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="0", Formula2:="3"
                .IgnoreBlank = True
                .InCellDropdown = True
                .InputTitle = "Testje"
                .ErrorTitle = "Foute ingave"
                .InputMessage = "Niet fout doen!"
                .ErrorMessage = "Geef juiste waarde in!"
                .ShowInput = True
                .ShowError = True
            End With
        End With
    End With
End Sub

Wat betreft je laatste opmerking: die krijg ik ook niet aan de praat als ik handmatig een foutmelding maak op getallen. Toch heeft de functie wel gewerkt...
 
De Error-opmerkingen worden nu wel getoond.
De code zelf moet ik nog aanpassen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan