Problem z wyborem pliku API

Witam

 

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ę...

Witam

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.

Pozdrowienia

1 polubienie

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.

pachnie jak zasób Excela, który nie jest zwolniony !!

Czy na końcu makra zwalniasz pamięć i poprawnie zamykasz program Excel?

Pozdrowienia

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.

Możesz tego spróbować, jeśli chcesz:

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ę""

Pozdrowienia

Jeśli żaden excel nie został uruchomiony, działa bez problemów, więc dodałem instancję:

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

 

Ale nadal mam proces Excela w toku. Obawiam się też, że zamknie to inne pliki Excela.

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.

 

Im dalej idę, tym mam mniej włosów...

Czy zmieniłeś swoją linię?

Sheets.Add.Name = "Importuj tabelę"

Następujący sposób:

oWB.Sheets.Add.Name = "Importuj tabelę"

W testach, które wykonuję, łatwiej i szybciej uwalnia moje zasoby...

Pozdrowienia

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

 

Dziękujemy za pomoc i cierpliwość!

Pozdrowienia

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

 

Pozdrowienia

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?

 

Pozdrowienia

Witam

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

Dla obiektów programu Excel:
Odesłanie: Tutaj

Dla programowania obiektowego:
Odesłanie: Tutaj

Pozdrowienia

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.

 

Pozdrowienia