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