Problème sélection fichier API

Bonjours,

 

J'ai crée un macro a parti de solidworks qui me lance un fichier excel pour extraire des données, mon problème c'est que de temps en temps mon programme bug.

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"

 

Le problème arrive sur la ligne  :  Sheets.Add.Name = "Tableau importation"

A mon avis il n'a pas bien défini l'application ou le fichier de la création. Depuis plusieurs jours je cherche la solution mais impossible a trouver sur les différents forum.

 

Quand cette ligne passe je n'ai plus aucun problème mais ça me prend le chou ...

Bonjour,

Le bug n'arriverai-t-il sur des fichiers qui ont déjà une feuille nommée " Tableau importation " ?

Attention, Excel n'accepte pas d'avoir plusieurs feuilles ayant le même nom, il va peut-être te falloir intégrer une vérification sur le nom des feuilles existantes dans le fichier avant de créer ta feuille.

Cordialement,

1 « J'aime »

C'est effectivement une possibilité mais c'est pas le problème.

 

Parfois j'ai le bug, je relance 4-5 fois et ça fini par passer, je me retrouve juste avec 4-5 fois le programme excel lancer, avec le même nom juste le 'lecture seul' qui change.

ça sent la ressource Excel qui n'est pas libérée !!!

A la fin de ta macro, est-ce que tu libères bien la mémoire et fermes Excel proprement ?

Cordialement,

Non je ne ferme pas excel et ne libère pas la mémoire, je suis encore sur la finalisation de ma macro, alors je me sert du tableau d'importation comme moyen de vérification.

Savoir si elle importe bien les données et elle les transforment comme je le désire.

Je viens de penser qu'il y aurai un autres moyen pour vérifier mes donner c'est d'enregistré le feuille dans un dossier pour controler les cas perfectible.

 

 

J'arrive a un point ou ma parti excel es fini, enfin la parti traitement après je n'ai qu'a finalisé ma prise d'information.

 

J'ai encore quelque soucis sur ma macro coté Solidworks (enregistrement de mes assemblages) mais ça fera parti d'un autre poste si je ne trouve pas la solution d'ici quelques jours.

Tu peux essayer ça si tu veux :

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

 

Attention, j'ai ajouté "oWB" au début de la ligne "Sheets.Add.Name = "Tableau importation""

Cordialement,

Si aucun excel n'ai lancer effectivement il tourne sans soucis, j'ai donc rajouter une instance :

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

 

Mais il me reste toujours un processus d'excel en cours. J'ai aussi peur qu'il me ferme les autres fichier excel.

Résultat des courses, il ne me ferme pas mes autres instance d'excel mais a chaque lancement de macro, a la fin il me fait ma sauvegarde, ferme excel (visuellement) mais j'ai toujours un processus en cours, mon 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

 

Au deuxième lancement, si je ne supprime pas le processus il crée ma page mais but plus loin, sur la désignation des feuilles.

 

Plus j'avance, moins j'ai de cheveux ...

As-tu bien modifié ta ligne :

Sheets.Add.Name = "Tableau importation"

comme suit :

oWB.Sheets.Add.Name = "Tableau importation"

Sur les tests que je fais, il me libère les ressources plus facilement et rapidement ...

Cordialement,

Oui j'ai bien rajouter le oWB en début de ligne ca me corrige le problème dans ce module.

 

Maintenant mon problème c'est que j'ai crée un autre module pour gagner en lisibilité et là il me lache.

Mon code après modification :

 

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

autre module :     

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

Sub Plateau()

    Set FT = Sheets("FT")

et là il me plante "Erreur d'exécution '1004'   erreur définie par l'appli ou par l'objet. Mais seulement au deuxième lancement quand je ne nettoie pas mes processus.

 

Au passage avant je n'était pas obliger de préciser oWb.Sheets dans mon 'FabTab' j'écrivais sheets(FT). J'imagine que ca va me faire gagner en ressource.

 

Désolé si ce sont des questions de débutant mais là me reste plus beaucoup de cheveux ...

 

Merci de ton aide et de ta patiente !

Cordialement,

Même chose, dans le "Sub Plateau()", il faut mettre "Set FT = oWB.Sheets("FT")" au lieu de "Set FT = Sheets("FT")" et, si tu veux que ton processus Excel se ferme, il faut aussi penser à libérer la ressource de l'objet FT avant de lancer la fermeture de Excel. Dans l'exemple qui suit, c'est ce que fait la ligne "Set FT = Nothing" présente dans le "Sub RecupExcelDeux(ByVal nameSheet As String)", sans elle, le processus Excel ne se ferme pas malgré l'appel de la procédure "FermetureExcel" présente à la fin du "Sub main()" ce qui est logique car l'objet FT est lié à Excel puisque c'est une copie d'un objet lié à 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

 

Cordialement,

D'accords merci pour ces informations. Désolé du temps de réponse weekend prolonger ...

 

Comment je peu lier ma variable 'FT' a excel dans un autre module ? A chaque fois il me sort l'erreur Variable objet ou variable bloc non définie.

 

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

 

Je pourrais tous accoler au même module mais ça perdrais en lisibilité :(

 

C'est quoi la différence entre Workbook et Worksheet ?

 

Cordialement,

Bonjour,

Là on rentre dans le fonctionnement de la POO (programmation orientée objet), notion qu'il peut être utile de connaitre un peu avant de se lancer dans la création de macros...

En premier lieu :
Si tu créer une référence vers un objet interne à un objet Excel.Application sans la libérer alors cela empêchera la fermeture de Excel.

Les objets de la classe Workbook représentent des classeurs Excel, ils sont membres de la collection Workbooks.
Les objets de la classe Worksheet représentent des feuilles de calcul, ils sont membres de la collection Worksheets de l’objet Workbook.

Dim oWB As Workbook ==> Set oWB = oXL.Workbooks.Open(....) ==> tu défini oWB comme étant un objet Workbook (C'est donc un objet contenu dans le modèle objet Excel).
Dim FT As Object ==> Set FT = oWB.Sheets(....) ==> tu défini FT comme étant un objet dans lequel tu assignes un objet Workbook (C'est donc un objet contenu dans le modèle objet Excel).

Pour les objets Excel :
Voir : Ici

Pour la programmation orientée objet :
Voir : Ici

Cordialement,

Merci de ta patiente et de ta réponse. Je vais me renseigner sur ces différente piste.

 

Vue qu'on s'éloigne de plus en plus du sujet je met la réponse avec le "Set FT = nothing" pour libérer les ressources comme étant la meilleur. J'avais pas donner toutes les informations au début j'en suis navré.

 

Cordialement,