Probleem met het selecteren van API-bestand

Hallo

 

Ik heb een macro gemaakt van solidworks die een Excel-bestand start om gegevens te extraheren, mijn probleem is dat mijn programma van tijd tot tijd bugs vertoont.

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"

 

Het probleem komt langs de lijn :  Sheets.Add.Name = "Tabel importeren"

Naar mijn mening definieerde het de applicatie of het bestand van de creatie niet goed. Sinds enkele dagen ben ik op zoek naar de oplossing, maar onmogelijk te vinden op de verschillende forums.

 

Als deze lijn passeert, heb ik geen probleem meer, maar het kost me de kool ...

Hallo

Zou de bug niet optreden op bestanden die al een blad hebben met de naam "Import Table"?

Wees voorzichtig, Excel accepteert niet dat er meerdere bladen met dezelfde naam zijn, het kan zijn dat u een controle op de naam van de bestaande bladen in het bestand moet integreren voordat u uw blad maakt.

Vriendelijke groeten

1 like

Het is inderdaad een mogelijkheid, maar het is niet het probleem.

 

Soms heb ik de bug, ik start 4-5 keer opnieuw op en het gaat voorbij, ik eindig gewoon met 4-5 keer de lancering van het Excel-programma, met dezelfde naam alleen de 'alleen-lezen' die verandert.

het ruikt naar de Excel-bron die niet is vrijgegeven !!

Maak je aan het einde van je macro het geheugen vrij en sluit je Excel goed af?

Vriendelijke groeten

Nee, ik sluit Excel niet af en maak geen geheugen vrij, ik ben nog steeds bezig met het afronden van mijn macro, dus ik gebruik de importtabel als verificatiemiddel.

Om te weten of het de gegevens importeert en het transformeert op de manier die ik wil.

Ik dacht alleen dat er een andere manier zal zijn om mijn gegevens te controleren, namelijk door het blad in een map op te slaan om de perfectioneerbare gevallen te controleren .

 

 

Ik kom op een punt waar mijn Excel-gedeelte klaar is, nou ja, het verwerkingsgedeelte nadat ik net mijn informatie heb afgerond.

 

Ik heb nog steeds wat problemen met mijn macro aan de Solidworks-kant (het opslaan van mijn assemblages), maar het zal deel uitmaken van een andere post als ik de oplossing niet binnen een paar dagen vind.

Je kunt dit proberen als je wilt:

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

 

Wees voorzichtig, ik heb "oWB" toegevoegd aan het begin van de regel "Sheets.Add.Name = "Tabel importeren""

Vriendelijke groeten

Als er geen Excel daadwerkelijk is gestart, draait het zonder problemen, dus heb ik een instantie toegevoegd:

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

 

Maar ik heb nog een Excel-proces aan de gang. Ik ben ook bang dat het de andere Excel-bestanden zal sluiten.

Als gevolg hiervan sluit het mijn andere exemplaren van Excel niet, maar elke keer dat ik een macro start, maakt het aan het einde mijn back-up, sluit Excel (visueel), maar ik heb nog steeds een proces aan de gang, mijn 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

 

Bij de tweede run, als ik het proces niet verwijder, wordt mijn pagina aangemaakt, maar richt het zich verder, op de aanduiding van de bladeren.

 

Hoe verder ik kom, hoe minder haar ik heb...

Heb je je lijn veranderd?

Sheets.Add.Name = "Tabel importeren"

als volgt:

oWB.Sheets.Add.Name = "Tabel importeren"

Bij de tests die ik doe, maakt het mijn middelen gemakkelijker en sneller vrij...

Vriendelijke groeten

Ja, ik heb de oWB aan het begin van de regel toegevoegd, het corrigeert het probleem in deze module.

 

Nu is mijn probleem dat ik een andere module heb gemaakt om leesbaarheid te krijgen en nu laat het me in de steek.

Mijn code na wijziging:

 

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

Andere module:     

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

Sub Plateau()

    Set FT = Sheets("FT")

en dan crasht het "Runtime-fout '1004'   -fout gedefinieerd door de app of door het object. Maar alleen bij de tweede lancering als ik mijn processen niet opruim.

 

Trouwens, voordat ik oWb.Sheets niet hoefde op te geven in mijn 'FabTab', schreef ik sheets(FT). Ik stel me voor dat het me aan middelen zal doen winnen.

 

Sorry als dit beginnersvragen zijn, maar ik heb niet veel haar meer over...

 

Bedankt voor je hulp en je geduld!

Vriendelijke groeten

Hetzelfde, in het "Sub Plateau()", moet je "Set FT = oWB.Sheets("FT")" zetten in plaats van "Set FT = Sheets("FT")" en, als je wilt dat je Excel-proces wordt afgesloten, moet je ook nadenken over het vrijmaken van de bron van het FT-object voordat je begint met het sluiten van Excel. In het volgende voorbeeld is dit wat de regel "Set FT = Nothing" aanwezig in de "Sub RecupExcelDeux(ByVal nameSheet As String)" doet, zonder deze sluit het Excel-proces niet ondanks het aanroepen van de "CloseExcel"-procedure die aanwezig is aan het einde van de "Sub main()", wat logisch is omdat het FT-object is gekoppeld aan Excel omdat het is Een kopie van een Excel-gerelateerd object:

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

 

Vriendelijke groeten

Oké, bedankt voor deze informatie. Sorry voor de verlengde reactietijd in het weekend...

 

Hoe kan ik mijn variabele 'FT' koppelen om uit te blinken in een andere module? Elke keer krijg ik de foutmelding Objectvariabele of blokvariabele niet gedefinieerd.

 

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

 

Ik zou allemaal aan dezelfde module kunnen toevoegen, maar het zou de leesbaarheid verliezen:(

 

Wat is het verschil tussen een werkmap en een werkblad?

 

Vriendelijke groeten

Hallo

Dit is hoe OOP (objectgeoriënteerd programmeren) werkt, een idee dat het handig kan zijn om een beetje te weten voordat je begint met het maken van macro's...

Ten eerste:
Als u een verwijzing maakt naar een intern object van een Excel.Application-object zonder het vrij te geven, voorkomt dit dat Excel wordt gesloten.

De objecten in de klasse Werkmap vertegenwoordigen Excel-werkmappen en zijn lid van de verzameling Werkmappen.
Objecten in de klasse Werkblad vertegenwoordigen werkbladen, ze zijn lid van de Werkbladverzameling van het Werkmapobject.

Dim oWB As Workbook ==> Set oWB = oXL.Workbooks.Open(....) ==> u oWB definieert als een werkmapobject (het is dus een object in het Excel-objectmodel).
FT dimmen als object ==> FT = oWB.Sheets(....) instellen ==> u FT definieert als een object waarin u een werkmapobject toewijst (het is dus een object in het Excel-objectmodel).

Voor Excel-objecten:
Zie: Hier

Voor objectgeoriënteerd programmeren:
Zie: Hier

Vriendelijke groeten

Dank u voor uw geduld en uw antwoord. Ik zal meer te weten komen over deze verschillende tracks.

 

Naarmate we steeds verder van het onderwerp verwijderd raken, stel ik het antwoord in met de "Stel FT = niets" in om de middelen als de beste vrij te maken. Ik heb in het begin niet alle informatie gegeven, het spijt me.

 

Vriendelijke groeten