Stworzyłem makro z solidworks, które uruchamia plik Excela w celu wyodrębnienia danych, mój problem polega na tym, że od czasu do czasu mój program zawiera błędy.
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"
Problem pojawia się w dalszej kolejności : Sheets.Add.Name = "Importuj tabelę"
Moim zdaniem nie zdefiniował on dobrze aplikacji ani pliku kreacji. Od kilku dni szukam rozwiązania, ale nie można go znaleźć na różnych forach.
Kiedy ta linia mija, nie mam już problemu, ale zabiera mi kapustę...
Czy błąd nie wystąpi w plikach, które mają już arkusz o nazwie "Importuj tabelę"?
Bądź ostrożny, Excel nie akceptuje posiadania kilku arkuszy o tej samej nazwie, może być konieczne zintegrowanie sprawdzania nazw istniejących arkuszy w pliku przed utworzeniem arkusza.
To rzeczywiście jest możliwe, ale to nie jest problem.
Czasami mam błąd, uruchamiam ponownie 4-5 razy i kończy się to przejściem, po prostu kończę z 4-5 razy uruchomieniem programu Excel, z tą samą nazwą, tylko "tylko do odczytu", która się zmienia.
Nie, nie zamykam programu Excel i nie zwalniam pamięci, nadal kończę makro, więc używam tabeli importu jako środka weryfikacji.
Aby wiedzieć, czy importuje dane i przekształca je w sposób, w jaki chcę.
Po prostu pomyślałem, że będzie inny sposób na sprawdzenie moich danych, który polega na zapisaniu arkusza w folderze, aby kontrolować idealne przypadki.
Dochodzę do punktu, w którym moja część Excela jest skończona, a właściwie część przetwarzania po tym, jak właśnie sfinalizowałem moje informacje.
Nadal mam pewne problemy z moim makrem po stronie Solidworks (zapisywanie moich złożeń), ale będzie to część innego postu, jeśli nie znajdę rozwiązania w ciągu kilku dni.
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
Bądź ostrożny, dodałem "oWB" na początku wiersza "Sheets.Add.Name = "Importuj tabelę""
W rezultacie nie zamyka moich innych instancji Excela, ale za każdym razem, gdy uruchamiam makro, na końcu tworzy moją kopię zapasową, zamyka Excela (wizualnie), ale nadal mam proces w toku, mój kod:
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
Przy drugim uruchomieniu, jeśli nie usunę procesu, tworzy moją stronę, ale dąży dalej, do wyznaczenia liści.
Tak, dodałem oWB na początku linii, rozwiązuje to problem w tym module.
Teraz mój problem polega na tym, że stworzyłem kolejny moduł, aby zyskać czytelność i teraz mnie zawodzi.
Mój kod po modyfikacji:
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
Pozostały moduł:
Dim FT As Object
Dim SLD As Object
Dim RSG As Object
Sub Plateau()
Set FT = Sheets("FT")
a następnie ulega awarii "Błąd wykonania "1004" błąd zdefiniowany przez aplikację lub obiekt. Ale tylko przy drugim uruchomieniu, kiedy nie czyszczę swoich procesów.
Nawiasem mówiąc, zanim nie musiałem określać oWb.Sheets w moim 'FabTab', napisałem arkusze (FT). Wyobrażam sobie, że dzięki temu zyskam na zasobach.
Przepraszam, jeśli to pytania dla początkujących, ale nie zostało mi dużo włosów...
To samo, w "Sub Plateau()" musisz umieścić "Set FT = oWB.Sheets("FT")" zamiast "Set FT = Sheets("FT")" i jeśli chcesz, aby proces Excela został zamknięty, musisz również pomyśleć o zwolnieniu zasobu obiektu FT przed rozpoczęciem zamykania Excela. W poniższym przykładzie to właśnie robi wiersz "Set FT = Nothing" obecny w "Sub RecupExcelDeux(ByVal nameSheet As String)", bez niego proces programu Excel nie zamyka się pomimo wywołania procedury "CloseExcel" obecnej na końcu "Sub main()", co jest logiczne, ponieważ obiekt FT jest połączony z Excelem, ponieważ jest Kopia obiektu związanego z programem Excel:
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
Okej, dziękuję za tę informację. Przepraszamy za przedłużony czas odpowiedzi w weekend...
Jak mogę połączyć moją zmienną "FT" z Excelem w innym module? Za każdym razem pojawia się błąd Zmienna obiektu lub zmienna blokowa nie zdefiniowana.
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")
Mógłbym wszyscy dodać do tego samego modułu, ale straciłby on czytelność:(
Jaka jest różnica między skoroszytem a arkuszem roboczym?
Tak właśnie działa OOP (programowanie obiektowe), pojęcie, które może być przydatne przed rozpoczęciem tworzenia makr...
Po pierwsze: Jeśli utworzysz odwołanie do obiektu wewnętrznego obiektu Excel.Application bez jego zwolnienia, uniemożliwi to zamknięcie programu Excel.
Obiekty w klasie Workbook reprezentują skoroszyty programu Excel, są elementami członkowskimi kolekcji Workbooks. Obiekty w klasie Worksheet reprezentują arkusze, są elementami członkowskimi kolekcji Worksheet obiektu Workbook.
Dim oWB As Workbook ==> Set oWB = oXL.Workbooks.Open(....) ==> definiujesz oWB jako obiekt Workbook (Więc jest to obiekt zawarty w modelu obiektowym Excel). Dim FT As Object ==> Set FT = oWB.Sheets(....) ==> definiujesz FT jako obiekt, do którego przypisujesz obiekt Workbook (Więc jest to obiekt zawarty w modelu obiektowym Excel).
Dziękuję za cierpliwość i odpowiedź. Dowiem się o tych różnych utworach.
W miarę jak coraz bardziej oddalamy się od tematu, umieszczam odpowiedź z "Ustaw FT = nic", aby zwolnić zasoby jak najlepiej. Na początku nie podałem wszystkich informacji, przepraszam.