XL 2016 Le "Coller" de ma macro plante 1 fois sur 2 !

TooFatBoy

XLDnaute Barbatruc
Bonjour,

J'ai tenté de créer une macro qui copie des cellules d'un classeur et essaye de coller uniquement les données dans le classeur qui contient la macro en question.

Au 1er lancement ça fonctionne.
Au 2e lancement ça plante au moment de coller les données.
Donc j'arrête le déroulement de la macro, je lance une 3e fois la macro, et... elle fonctionne bien.
Si je lance une 4e fois la macro, elle plante.
etc.

Sauriez-vous m'expliquer pourquoi ça plante une fois sur deux ?
Merci par avance.

VB:
Option Explicit

Sub MacroPourrie()
'
Dim ClasseurSource As Workbook
Dim ClasseurCible As Workbook
Dim CheminDossierActuel As String
Dim NomDriveActuel As String
Dim NomFichierSource As String, NomFichierCible As String

    CheminDossierActuel = ThisWorkbook.Path                 ' drive + chemin du dossier
    NomDriveActuel = Left(ThisWorkbook.Path, 3)             ' drive

    ChDrive NomDriveActuel
    ChDir CheminDossierActuel
    NomFichierSource = Application.GetOpenFilename("Fichiers .csv (*.csv), *.csv")
    If NomFichierSource = "Faux" Then Exit Sub

    Set ClasseurCible = ThisWorkbook
    Set ClasseurSource = Workbooks.Open(NomFichierSource)

    ClasseurSource.ActiveSheet.Range("A1:A" & Range("A1").End(xlDown).Row).Copy
    ClasseurCible.Activate
    If Not Range("Tablo_Donnees").ListObject.DataBodyRange Is Nothing Then
        Range("Tablo_Donnees").ClearContents
        Range("Tablo_Donnees").Delete
    End If

' Ca plante ligne suivante
    Range("Tablo_Donnees[Mes Données]").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Range("Tablo_Donnees[[#Headers],[Mes Données]]").Select

    ClasseurSource.Close False
    Set ClasseurSource = Nothing
    Set ClasseurCible = Nothing

End Sub
 
Solution
Il y avait d'autres imperfections, voici le code revu et simplifié :
VB:
Sub Copier_CSV()
Dim NomFichierSource As Variant, ClasseurSource As Workbook

    ChDir ThisWorkbook.Path
    NomFichierSource = Application.GetOpenFilename("Fichiers .csv (*.csv), *.csv")
    If NomFichierSource = False Then Exit Sub
    
    Application.ScreenUpdating = False
    Set ClasseurSource = Workbooks.Open(NomFichierSource)
    ThisWorkbook.Activate
    With [Tablo_Donnees]
        If .Rows.Count = 1 Then .ClearContents Else .Delete 'RAZ
        With ClasseurSource.ActiveSheet
            .Range("A1:A" & .Range("A1").End(xlDown).Row).Copy 'copier
        End With
        .Cells(1).PasteSpecial xlPasteValues 'coller
        ClasseurSource.Close False
        .Cells(0...

cp4

XLDnaute Barbatruc
Bonjour,

Sans fichiers pour tester pas évident. Un essai, remplace par ces lignes, celles de ton code.
VB:
If Not Range("Tablo_Donnees").ListObject.DataBodyRange Is Nothing Then
        Range("Tablo_Donnees").Delete
    End If

    ' Ca plante ligne suivante
    Dim NewRow As ListRow
    Set NewRow = ListObjects("Tablo_Donnees").ListRows.Add
    NewRow.Range(1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Range("Tablo_Donnees[[#Headers],[Mes Données]]").Select
Bonne journée.
 

TooFatBoy

XLDnaute Barbatruc
@cp4 : merci pour ta réponse. Je sais que pour les gros soucis en particulier et pour toute question en général, il est fortement souhaité de fournir un fichier, mais là ma question est plus de savoir si la syntaxe et l'adressage des données sont corrects car ce sont mes débuts avec les tableaux structurés en VBA... alors je voudrais savoir si je procède correctement ou pas du tout.

Je n'ai trouvé aucun tuto qui soit clair pour moi concernant l'utilisation des tableaux structurés en VBA. 😔😫

Je vais regarder ton code. 👍
 

TooFatBoy

XLDnaute Barbatruc
@cp4 : j'avais essayé de copier vers ...Range(1) mais vu que je commence par supprimer toutes lignes de données du tableau, Range(1) n'existe pas si j'ai bien compris.

Du coup j'avais en ajoutant une ligne avant de coller dans le Range(1), mais ça n'avait pas non plus marché.
Peut-être un problème de syntaxe... Je comprends rien à la façon d'utiliser ces tableaux... 😭

Je vais essayer avec ton code.
 

job75

XLDnaute Barbatruc
Il y avait d'autres imperfections, voici le code revu et simplifié :
VB:
Sub Copier_CSV()
Dim NomFichierSource As Variant, ClasseurSource As Workbook

    ChDir ThisWorkbook.Path
    NomFichierSource = Application.GetOpenFilename("Fichiers .csv (*.csv), *.csv")
    If NomFichierSource = False Then Exit Sub
    
    Application.ScreenUpdating = False
    Set ClasseurSource = Workbooks.Open(NomFichierSource)
    ThisWorkbook.Activate
    With [Tablo_Donnees]
        If .Rows.Count = 1 Then .ClearContents Else .Delete 'RAZ
        With ClasseurSource.ActiveSheet
            .Range("A1:A" & .Range("A1").End(xlDown).Row).Copy 'copier
        End With
        .Cells(1).PasteSpecial xlPasteValues 'coller
        ClasseurSource.Close False
        .Cells(0, 1).Select
    End With

End Sub
 

TooFatBoy

XLDnaute Barbatruc
@job75 : j'avais aussi essayé d'intervertir l'ordre du .copy et du .delete, mais c'était encore pire... je n'arrivais même plus à copier les données.

Merci infiniment, ça me donne les bonnes syntaxes ! 🤩🤩🤩
Je testerais ça dans la journée.


J'avais commencé avec le ChDir ThisWorkbook.Path tout seul, mais ça ne marchait pas parce que les deux classeurs sont dans des partitions différentes.
Il faut d'abord changer de partition, puis changer de dossier.
Du moins c'est ce que j'ai cru constater. 😉
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
J'ai encore dit une bêtise d'ailleurs... les deux classeurs sont bien dans le même dossier, mais la boîte de dialogue s'ouvre sur le dossier par défaut qui, lui, est sur une autre partition, donc le ChDir ThisWorkbook.Path n'a aucun effet (autant ne pas le mettre :D).

Je préférerais que ça s'ouvre directement sur le bon dossier, mais il est vrai qu'on peut naviguer dans toute l'arborescence avec la fenêtre de dialogue. ;)
 

TooFatBoy

XLDnaute Barbatruc
Une petite question : est-ce que le fait de ne pas utiliser Set ClasseurSource = Nothing ne risque pas de saturer la mémoire ?

Je demande ça parce que j'avais eu un tel problème : j'avais une macro qui faisait beaucoup de copier/coller (plus de 20 000), et après quelques lancement de ladite macro ça plantait. il fallait que je ferme Excel et ça refonctionnait.
En ajoutant le "Set xx=Nothing" je n'avais plus ce problème.
Y avait-il vraiment un rapport de cause à effet, ou était-ce le hasard ?
 

job75

XLDnaute Barbatruc
Une petite question : est-ce que le fait de ne pas utiliser Set ClasseurSource = Nothing ne risque pas de saturer la mémoire ?
Non car à la fin de toute macro les variables non globales sont toutes réinitialisées.

La variable ClasseurSource est donc réinitialisée à Nothing automatiquement.

Bien sûr si cette variable était déclarée Public sont contenu serait mémorisé.
 

Discussions similaires

Réponses
2
Affichages
129

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof