Problem bei der Auswahl der API-Datei

Hallo

 

Ich habe ein Makro von SOLIDWORKS erstellt, das eine Excel-Datei startet, um Daten zu extrahieren, mein Problem ist, dass mein Programm von Zeit zu Zeit Fehler macht.

Option Explicit

Dim oXL As Excel.Application
Dim oWB As Workbook

Const DEBUGFLY = 1

Sub initialiseExcel(ByVal strReference As String)

        'Start excel and get application
        Set oXL = CreateObject("Excel.application")
        oXL.Visible = (DEBUGFLY = 1)

    Set oWB = oXL.Workbooks.Open("K:\" & strReference & ".xlsm")
    
    Sheets.Add.Name = "Tableau importation"

 

Das Problem tritt in der ganzen Zeile auf:  Sheets.Add.Name = "Tabelle importieren"

Meiner Meinung nach hat es die Anwendung oder die Datei der Erstellung nicht gut definiert. Seit mehreren Tagen suche ich nach einer Lösung, die in den verschiedenen Foren nicht zu finden ist.

 

Wenn diese Linie vorbeigeht, habe ich kein Problem mehr, aber sie nimmt mir den Kohl ...

Hallo

Würde der Fehler nicht bei Dateien auftreten, die bereits ein Blatt mit dem Namen "Tabelle importieren" haben?

Seien Sie vorsichtig, Excel akzeptiert es nicht, mehrere Blätter mit demselben Namen zu haben, Sie müssen möglicherweise eine Überprüfung des Namens der vorhandenen Blätter in die Datei integrieren, bevor Sie Ihr Blatt erstellen.

Herzliche Grüße

1 „Gefällt mir“

Es ist in der Tat eine Möglichkeit, aber es ist nicht das Problem.

 

Manchmal habe ich den Fehler, ich starte 4-5 Mal neu und es geht vorbei, ich habe nur 4-5 Mal den Excel-Programmstart, mit dem gleichen Namen, nur das "Nur Lesen", das sich ändert.

es riecht nach der Excel-Ressource, die nicht freigegeben wird !!

Geben Sie am Ende Ihres Makros den Speicher frei und schließen Sie Excel ordnungsgemäß?

Herzliche Grüße

Nein, ich schließe Excel nicht und gebe den Speicher nicht frei, ich bin noch dabei, mein Makro fertigzustellen, also verwende ich die Importtabelle als Mittel zur Überprüfung.

Zu wissen, ob es die Daten importiert und sie so transformiert, wie ich es möchte.

Ich dachte gerade, dass es eine andere Möglichkeit geben wird, meine Daten zu überprüfen, nämlich das Blatt in einem Ordner zu speichern, um die perfektionierbaren Fälle zu kontrollieren .

 

 

Ich komme an einen Punkt, an dem mein Excel-Teil fertig ist, also der Verarbeitungsteil, nachdem ich gerade meine Informationen fertiggestellt habe.

 

Ich habe immer noch einige Probleme mit meinem Makro auf der Solidworks-Seite (Speichern meiner Baugruppen), aber es wird Teil eines anderen Beitrags sein, wenn ich die Lösung in ein paar Tagen nicht finde.

Sie können dies versuchen, wenn Sie möchten:

Option Explicit

Dim oXL As Excel.Application
Dim oWB As Workbook
Dim oSH As Worksheet

Sub main()
    
'Démarrage de Excel en mode visible
Set oXL = CreateObject("Excel.application")
oXL.Visible = True

'Ouverture du classeur
Set oWB = oXL.Workbooks.Open("C:\Users\XXX\Desktop\Test.xlsx") 'Attention, il faut Changer le chemin et nom du fichier
    
'Ajout de la feuille
oWB.Sheets.Add.Name = "Tableau importation"

'Pause de 2 secondes
Dim newHour As Date
Dim newMinute As Date
Dim newSecond As Date
Dim waitTime As Date
newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 2
waitTime = TimeSerial(newHour, newMinute, newSecond)
oXL.Wait waitTime

'Fermeture du classeur et de Excel
oXL.DisplayAlerts = False
oXL.Workbooks.Close
oXL.Quit
oXL.DisplayAlerts = True

'Désallocation de la mémoire
Set oSH = Nothing
Set oWB = Nothing
Set oXL = Nothing
    
End Sub

 

Seien Sie vorsichtig, ich habe "oWB" am Anfang der Zeile "Sheets.Add.Name = "Import table"" hinzugefügt.

Herzliche Grüße

Wenn noch kein Excel gestartet wurde, läuft es ohne Probleme, daher habe ich eine Instanz hinzugefügt:

Sub BackUpExcel(ByVal strReference As String)

        oXL.DisplayAlerts = False
    ActiveWorkbook.SaveAs FileName:="T:\F\" & strReference & "\" & strReference & "-TabImp.xlsm", CreateBackup:=False
    oWB.Close (False)
    Set oWB = Nothing
    oXL.Quit
    Set oXL = Nothing
End Sub

 

Aber ich habe immer noch einen Excel-Prozess in Arbeit. Ich befürchte auch, dass die anderen Excel-Dateien geschlossen werden.

Infolgedessen werden meine anderen Instanzen von Excel nicht geschlossen, aber jedes Mal, wenn ich ein Makro starte, erstellt es am Ende mein Backup, schließt Excel (visuell), aber ich habe immer noch einen Prozess im Gange, meinen Code:

 

Sub BackUpExcel(ByVal strReference As String)

        oXL.DisplayAlerts = False
    ActiveWorkbook.SaveAs FileName:=_
"T:\petit chemin\" & "-TabImp.xlsm", CreateBackup:=False
    
    oXL.DisplayAlerts = False
    oXL.Workbooks.Close
    oXL.Quit
    
    Set oWB = Nothing
    Set oXL = Nothing
End Sub

 

Beim zweiten Durchlauf, wenn ich den Prozess nicht lösche, erstellt er meine Seite, zielt aber weiter auf die Bezeichnung der Blätter ab.

 

Je weiter ich komme, desto weniger Haare habe ich...

Haben Sie Ihre Linie geändert?

Sheets.Add.Name = "Tabelle importieren"

folgendermaßen:

oWB.Sheets.Add.Name = "Tabelle importieren"

Bei den Tests, die ich mache, werden meine Ressourcen leichter und schneller freigesetzt...

Herzliche Grüße

Ja, ich habe den oWB am Anfang der Zeile hinzugefügt, er korrigiert das Problem in diesem Modul.

 

Jetzt ist mein Problem, dass ich ein weiteres Modul erstellt habe, um die Lesbarkeit zu verbessern, und jetzt lässt es mich im Stich.

Mein Code nach der Änderung:

 

Option Explicit

Dim oXL As Excel.Application
Dim oWB As Workbook

Sub initialiseExcel(ByVal strReference As String)

        'Start excel and get application
        Set oXL = CreateObject("Excel.application")
        oXL.Visible = True

    Set oWB = oXL.Workbooks.Open("K:\" & strReference & ".xlsm")
    
    oWB.Sheets.Add.Name = "Tableau importation"

End Sub

Sub BackUpExcel(ByVal strReference As String)

        oXL.DisplayAlerts = False
    ActiveWorkbook.SaveAs FileName:="chemin" & "-TabImp.xlsm", CreateBackup:=False
    
    oXL.DisplayAlerts = False
    oXL.Workbooks.Close
    oXL.Quit
    
    Set oWB = Nothing
    Set oXL = Nothing
End Sub

Sub FabTab(d, b, c)
Dim i As Integer

Dim FT As Object
Dim SLD As Object
Dim RSG As Object

    Set FT = oWB.Sheets("FT")                            
    Set SLD = oWB.Sheets("Tableau importation")
    Set RSG = oWB.Sheets("RSG")

    If d = 17 Then
        Call Plateau

Sonstiges Modul:     

Dim FT As Object
Dim SLD As Object
Dim RSG As Object

Sub Plateau()

    Set FT = Sheets("FT")

und dann stürzt es ab "Laufzeitfehler '1004'   Fehler, der von der App oder vom Objekt definiert wird. Aber erst beim zweiten Start, wenn ich meine Prozesse nicht aufräume.

 

Übrigens, bevor ich oWb.Sheets nicht in meinem 'FabTab' angeben musste, habe ich sheets(FT) geschrieben. Ich stelle mir vor, dass ich dadurch an Ressourcen gewinnen werde.

 

Tut mir leid, wenn das Anfängerfragen sind, aber ich habe nicht mehr viele Haare übrig...

 

Vielen Dank für Ihre Hilfe und Ihre Geduld!

Herzliche Grüße

Das Gleiche gilt, dass Sie im "Sub Plateau()" "Set FT = oWB.Sheets("FT")" anstelle von "Set FT = Sheets("FT")" eingeben müssen, und wenn Sie möchten, dass Ihr Excel-Prozess geschlossen wird, müssen Sie auch darüber nachdenken, die Ressource des FT-Objekts freizugeben, bevor Sie mit dem Schließen von Excel beginnen. Im folgenden Beispiel ist dies das, was die Zeile "Set FT = Nothing" in der Zeile "Sub RecupExcelDeux(ByVal nameSheet As String)" tut, ohne sie wird der Excel-Prozess nicht geschlossen, obwohl die Prozedur "CloseExcel" am Ende von "Sub main()" aufgerufen wird, was logisch ist, da das FT-Objekt mit Excel verknüpft ist, da es Eine Kopie eines Excel-bezogenen Objekts:

Option Explicit

Dim oXL As Excel.Application
Dim oWB As Workbook
Dim oSH As Worksheet

Dim FT As Object

Dim newHour As Date
Dim newMinute As Date
Dim newSecond As Date
Dim waitTime As Date

Sub main()
    InitialiseExcel ("C:\Users\DRO\Desktop\Test.xlsx")

    PauseExcel (2)

    RecupExcel ("Tableau importation")

    FermetureExcel
End Sub

Sub InitialiseExcel(ByVal strReference As String)
    'Start excel and get application
    Set oXL = CreateObject("Excel.application")
    oXL.Visible = True
    'Ouverture du classeur
    Set oWB = oXL.Workbooks.Open(strReference)
    'Ajout de la feuille
    oWB.Sheets.Add.Name = "Tableau importation"
End Sub

Sub FermetureExcel()
    'Fermeture du classeur et de Excel
    oXL.DisplayAlerts = False
    oXL.Workbooks.Close
    oXL.Quit
    oXL.DisplayAlerts = True
    'Désallocation de la mémoire
    Set oSH = Nothing
    Set oWB = Nothing
    Set oXL = Nothing
End Sub

Sub PauseExcel(ByVal duree As Integer)
    'Pause de 2 secondes
    newHour = Hour(Now())
    newMinute = Minute(Now())
    newSecond = Second(Now()) + duree
    waitTime = TimeSerial(newHour, newMinute, newSecond)
    oXL.Wait waitTime
End Sub

Sub RecupExcel(ByVal nameSheet As String)
    Set FT = oWB.Sheets(nameSheet)
    PauseExcel (2)
    Set FT = Nothing
    RecupExcelDeux (nameSheet)
End Sub

Sub RecupExcelDeux(ByVal nameSheet As String)
    Set FT = oWB.Sheets(nameSheet)
    PauseExcel (2)
    Set FT = Nothing
End Sub

 

Herzliche Grüße

Okay, danke für diese Information. Entschuldigung für die verlängerte Reaktionszeit am Wochenende...

 

Wie kann ich meine Variable 'FT' mit Excel in einem anderen Modul verknüpfen? Jedes Mal erhalte ich den Fehler Objektvariable oder Blockvariable nicht definiert.

 

Option Explicit

Dim FT As Object
Dim SLD As Object
'Dim RSG As Object

Dim oWB As Excel.Workbook

Sub Plateau()

    Set FT = oWB.Sheets("FT")
    Set SLD = oWB.Sheets("Tableau importation")
    'Set RSG = oWB.Sheets("RSG")

 

Ich könnte alle zum selben Modul hinzufügen, aber es würde die Lesbarkeit verlieren:(

 

Was ist der Unterschied zwischen Arbeitsmappe und Arbeitsblatt?

 

Herzliche Grüße

Hallo

So funktioniert OOP (objektorientierte Programmierung), eine Vorstellung, die man ein wenig kennen sollte, bevor man mit der Erstellung von Makros beginnt...

Erstens:
Wenn Sie einen Verweis auf ein internes Objekt eines Excel.Application-Objekts erstellen, ohne es freizugeben, wird verhindert, dass Excel geschlossen wird.

Die Objekte in der Workbook-Klasse stellen Excel-Arbeitsmappen dar und sind Mitglieder der Workbooks-Auflistung.
Objekte in der Worksheet-Klasse stellen Arbeitsblätter dar und sind Member der Worksheet-Auflistung des Workbook-Objekts.

oWB als Arbeitsmappe dimmen ==> Setze oWB = oXL.Workbooks.Open(....) ==> definierst du oWB als Arbeitsmappenobjekt (es ist also ein Objekt, das im Excel-Objektmodell enthalten ist).
FT als Objekt dimmen ==> FT = oWB.Sheets(....) ==> Sie FT als ein Objekt definieren, dem Sie ein Arbeitsmappenobjekt zuweisen (es handelt sich also um ein Objekt, das im Excel-Objektmodell enthalten ist).

Für Excel-Objekte:
Siehe: Hier

Für die objektorientierte Programmierung:
Siehe: Hier

Herzliche Grüße

Vielen Dank für Ihre Geduld und Ihre Antwort. Ich werde mich über diese verschiedenen Strecken informieren.

 

Je weiter wir uns vom Thema entfernen, desto mehr setze ich die Antwort mit dem "Set FT = nichts", um die Ressourcen am besten freizusetzen. Ich habe am Anfang nicht alle Informationen gegeben, tut mir leid.

 

Herzliche Grüße