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 ...
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.
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.
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.
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.
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...
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...
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
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?
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).
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.