Cellules vides lors de la copie avec Macro

Bonjour,

J'utilise une macro que j'ai écrite pour faire une copie de certaines données d'un autre classeur Excel.

Ma macro me permet d'ouvrir le classeur cible (j'utilise : Application.Dialogs(xlDialogOpen).Show) et de copier les données voulues dans le classeur de la macro.

Lors de l'utilisation de ma macro par l'IDE d'Excel, elle fonctionne correctement et les données sont bien copiées.

Pour simplifier le lancement de la macro par des personnes n'ayant pas forcément les connaissances pour lancer l'IDE, j'ai rajouté une forme à laquelle j'ai associé la macro. Cependant, lorsque je lance la macro par le clic sur cette forme, les feuilles sont crées mais les cellules récupérant les données sont vides.

J'ai essayé de redémarrer Excel et le PC mais rien n'y fait. J'ai également essayé avec un autre PC mais là non plus, ca ne change rien.

J'ai essayé de remplacer la forme en bouton en mode développeur mais rien n'y fait.

Les fichiers sont chargés de données confidentielles, je ne peux pas les mettre à dispositions ici. Je peux vous mettre des portions du VBA et une idées de la forme des fichiers si nécessaire mais je pense que le problème est externe au contenu des fichiers.

Avez-vous une idée de comment résoudre ce problème ?

Pour info, il y a peu de temps (toujours sur les même fichiers) j'avais eu un problème de ce type où les données étaient copiées uniquement lorsque j'utilisais le mode pas à pas en débogage.

Voici la ligne que j'utilisais pour copier les données :

Workbooks(sFichierCode).Worksheets(sSheetEnCours).Cells(j, i) = Workbooks(sFichierCible).Worksheets("Client").Range(sCol(i, j) & iRowDepart - 1 + iNbAna + iNbIP)

Maintenant, j'utilise ces lignes ci :

If i = 1 Then
    Workbooks(sFichierCode).Worksheets(sSheetEnCours).Range("A" & j) = Workbooks(sFichierCible).Worksheets("Client").Range(sCol(i, j) & iRowDepart - 1 + iNbAna + iNbIP)
ElseIf i = 2 Then
    Workbooks(sFichierCode).Worksheets(sSheetEnCours).Range("B" & j) = Workbooks(sFichierCible).Worksheets("Client").Range(sCol(i, j) & iRowDepart - 1 + iNbAna + iNbIP)
ElseIf i = 3 Then
    Workbooks(sFichierCode).Worksheets(sSheetEnCours).Range("C" & j) = Workbooks(sFichierCible).Worksheets("Client").Range(sCol(i, j) & iRowDepart - 1 + iNbAna + iNbIP)
ElseIf i = 4 Then
    Workbooks(sFichierCode).Worksheets(sSheetEnCours).Range("D" & j) = Workbooks(sFichiercible).Worksheets("Client").Range(sCol(i, j) & iRowDepart - 1 + iNbAna + iNbIP)
ElseIf i = 5 Then
    Workbooks(sFichierCode).Worksheets(sSheetEnCours).Range("E" & j) = Workbooks(sFichierCible).Worksheets("Client").Range(sCol(i, j) & iRowDepart - 1 + iNbAna + iNbIP)
End If

Je pense que le problème venait du fait que j'utilisais Range et Cell sur la même ligne de code.

Aujourd'hui je n'ai plus l'obligation de passer par le mode débogage mais je suis obligé de passer par l'IDE pour que la macro fonctionne.

Je suis preneur de toutes idées :D

Merci d'avance et bonne journée,

Cordialement,

Doltd

Bonjours Doltd,

A tester avec une form cela devrait fonctionner et une boucle c'est mieux que des if a répétition

Sub CopierDonnees()
    Dim i As Integer
    Dim sFichierCode As String
    Dim sSheetEnCours As String
    Dim sFichierCible As String
    Dim sCol() As String
    Dim iRowDepart As Long
    Dim iNbAna As Integer
    Dim iNbIP As Integer
    Dim j As Long

    ' Assignez des valeurs appropriées aux variables
    sFichierCode = "VotreFichierCode.xlsx"
    sSheetEnCours = "FeuilleEnCours"
    sFichierCible = "VotreFichierCible.xlsx"
    ' ... Assignez d'autres valeurs aux autres variables ...

    ' Définissez le tableau sCol avec les lettres de colonne appropriées
    ReDim sCol(1 To 5)
    sCol(1) = "A"
    sCol(2) = "B"
    sCol(3) = "C"
    sCol(4) = "D"
    sCol(5) = "E"

    ' ... Assignez des valeurs aux autres variables ...

    ' Utilisez une boucle pour copier les données de chaque colonne
    For i = 1 To 5
        For j = 1 To VotreNombreDeLignes ' Assurez-vous de définir cette valeur correctement
            Workbooks(sFichierCode).Worksheets(sSheetEnCours).Range(sCol(i) & j) = _
                Workbooks(sFichierCible).Worksheets("Client").Range(sCol(i) & (iRowDepart - 1 + iNbAna + iNbIP))
        Next j
    Next i
End Sub

re,

on peut mélanger l'utilisation de "range" et "cells", cela ne cause pas de problèmes.

Si la macro fonctionne en mode "DEBUG", alors après l'ouverture de l'autre fichier, j'ajouterai une ligne avec un ou plusieurs "Doevents", je pense que le fichier n'est pas encore disponible au moment au vous commencez à copier&coller des valeurs. Donc ajoutez cette ligne

DoEvents: DoEvents: DoEvents

If i = 1 Then
    Workbooks(sFichierCode).Worksheets(sSheetEnCours).Range("A" & j) = Workbooks(sFichierCible).Worksheets("Client").Range(sCol(i, j) & iRowDepart - 1 + iNbAna + iNbIP)
ElseIf i = 2 Then
.....

Bonjour,

Merci pour les réponses rapides.

BsAlv, c'est également la première chose à laquelle j'ai pensé. Cependant (j'avais oublié de le préciser), le problème est le même quand le fichier cible est déjà ouvert en amont.

J'ai quand même essayé ta solution mais ça ne change rien malheureusement.

Stepaustras, je ne comprends pas ce que tu veux veux dire par "tester avec une form", tu veux dire de tester en lançant la macro par un useform ?

Si c'est ta proposition, c'est ce que je fais actuellement, car j'ai le choix entre 2 possibilités (réaliser la macro ou supprimer les feuilles) et c'est l'utilisateur qui doit choisir.

Sinon, je n'ai pas compris ce que tu voulais dire par la.

En ce qui concerne le remplacement des If par une boucle, j'y avais réfléchi et n'avait pas vraiment de solutions. J'ai adapté ton code mais ça n'a pas changé le problème. (en même temps tu n'avais pas dit que ce changement le règlerais :D)

Workbooks(sFichierCode).Worksheets(sSheetEnCours).Range(sCol2(i) & j) = Workbooks(sFichierCible).Worksheets("Client").Range(sCol(i, j) & iRowDepart - 1 + iNbAna + iNbIP)

Pour plus d'infos, le sCol(i, j) que j'utilise me permet de récupérer le nom de colonne de la donnée dans le fichier cible.

A la limite, il faut que je crée une deuxième variable, genre sCol2.

Je précise quand même que je m'arrête à la colonne E dans le fichier du code.

(Pour info, je met mon sub de copie de données)

Sub CopieDonnees()
    'Initialisation des variables

    ' Définissez le tableau sCol avec les lettres de colonne appropriées
    ReDim sCol2(1 To 5)
    sCol2(1) = "A"
    sCol2(2) = "B"
    sCol2(3) = "C"
    sCol2(4) = "D"
    sCol2(5) = "E"

    For i = 1 To 5
        For j = 1 To 50
            If sCol(i, j) = "" Then
                'si nom de collone vide, ne rein faire
            Else
                'Ecriture cellule
                If IsError(Workbooks(sFichierCible).Worksheets("Client").Range(sCol(i, j) & iRowDepart - 1 + iNbAna + iNbIP)) Then
                    'si erreur, rien faire
                Else 'sinon copie donnée
                    Workbooks(sFichierCode).Worksheets(sSheetEnCours).Range(sCol2(i) & j) = Workbooks(sFichierCible).Worksheets("Client").Range(sCol(i, j) & iRowDepart - 1 + iNbAna + iNbIP)
                End If
            End If
        Next j
    Next i
End Sub

Stepaustras, Si tu peux m'éclairer sur ta proposition de tester avec un form, et si d'autres idées viennent à vous, n'hésitez pas à me les partager ! :)

Merci d'avance,

Doltd

Je parlais d'un bouton form dans la feuille. J'ai pas tout bien compris tu veux dans une feuille ou un userform?

A tester

Sub CopieDonnees()
    ' Initialisation des variables

    ' Définissez le tableau sCol avec les lettres de colonne appropriées
    ReDim sCol2(1 To 5)
    sCol2(1) = "A"
    sCol2(2) = "B"
    sCol2(3) = "C"
    sCol2(4) = "D"
    sCol2(5) = "E"

    For i = 1 To 5
        For j = 1 To 50
            If sCol(i, j) = "" Then
                ' Si nom de colonne vide, ne rien faire
            Else
                ' Ecriture cellule
                If IsError(Workbooks(sFichierCible).Worksheets("Client").Range(sCol(i, j) & iRowDepart - 1 + iNbAna + iNbIP)) Then
                    ' Si erreur, ne rien faire
                Else ' Sinon copier donnée
                    Dim colDest As String
                    colDest = sCol2(i) ' Colonne de destination
                    ' Copier la donnée dans la cellule de destination
                    Workbooks(sFichierCode).Worksheets(sSheetEnCours).Range(colDest & j) = Workbooks(sFichierCible).Worksheets("Client").Range(sCol(i, j) & iRowDepart - 1 + iNbAna + iNbIP)
                End If
            End If
        Next j
    Next i
End Sub

Bonjour,

Désolé du délai de ma réponse,

stepaustra, j'ai essayé ta proposition mais le problème reste le même.

En ce qui concerne le bouton form, j'ai tenté avec le bouton formulaire et le bouton activeX mais le problème est toujours présent.

Je détaille un peu le déroulement en espérant être plus clair sur le fonctionnement :

- Appui sur le bouton pour lancer la macro

- Lancement d'un userform avec 2 choix (copie données ou suppression de feuilles)

- Choix de la copie donnée

- Création d'une feuille pour chaque équipement

- Copie des données de l'équipement (ne fonctionne pas en utilisant les boutons mais fonctionne en le lançant de l'IDE d'Excel)

- Création d'un lien hypertexte

Boucle sur les 3 derniers points pour tous les équipements.

Es espérant que ça puisse aider

Bonne journée

Doltd

Est-ce possible de créer un fichier anonymisé avec 10-20 lignes de données et expliquer quelles données vous voulez copier&coller dans chaque boucle ?

Bonjour,

Je sais que j'arrive assez tard, j'ai pas eu beaucoup de temps pour m'y pencher dessus.

J'ai anonymiser les fichiers (en tout cas ce que j'ai vu à faire :D).

Il y a 2 fichiers :

- "Fiches cameras vpourtest" est celui avec les macros. Il y a 3 feuilles de bases:

- Recap : Feuille avec les boutons pour lancer les macros et la liste des liens hypertextes une fois que les données seront présentes

- BaseMiseEnPage : Comporte la mise en page de base et les colonnes correspondantes du fichier "Inventaire genetec smi copie" (Exemple, en cellule B6, il y a "Q". Cela indique que la donnée doit provenir du classeur "Inventaire genetec smi copie" colonne Q)

- Ex3202 : qui est une feuille d'exemple avec quelques données, avec l'anonymisation, je ne sais pas si ca aura le meme format mais on ne devrait pas etre loin. De toute facon, pour l'instant les données ne sont pas présentes.

- "Inventaire genetec smi copie" est celui avec les données. Je n'ai laissé que la feuille "Client" qui est celle concernée.

J'ai laissé le code tel quel, sans modifications de nom ou autre.

je précise que la partie "CopieImages" n'est pas active et n'a encore jamais été testé, mais ce n'est pas le sujet.

Je pense avoir fait le tour.

Bon courage, merci d'avance et bonne année à tou.te.s

Doltd

Bonjour,

Je viens de trouver le problème :

Le fait est que quand je lançais la macro par l'IDE, j'étais sur la feuille "BaseMiseEnPage". Cependant, le bouton pour lancer la macro est dans la feuille "Recap".

Il se trouve que la récupération des noms de colonnes était réalisé au tout début avant d'activer une feuille en particulier. Les noms des colonnes étaient donc vides. Cependant, je ne comprends pas pourquoi Excel ne m'a pas dit qu'il ne pouvait pas faire de Range sans la lettre de la cellule, mais c'est une autre histoire.

J'ai juste rajouté une activation de la feuille "BaseMiseEnPage" au début du Sub General et cela fonctionne. Tout simplement mais dur à trouver :D

'Initialisation des variables
    iPasDeCam = 0
    iNbCamAna = 0
    iNbCamIP = 0
    iNbErrAnaIP = 4
    iRowDepart = 18
    sSheetRecap = Sheets(1).Name
    sSheetMEP = Sheets(2).Name
    sSheetMEP2 = sSheetMEP & "2"
    sSheetClient = "Client"
    sFichierCam = ThisWorkbook.Name

    Sheets(sSheetMEP).Activate

    For i = 1 To 5
        For j = 1 To 50
            If Len(Cells(j, i)) > 3 Or Cells(j, i) = "" Then
                sCol(i, j) = ""
            Else
                Cells(j, i).Select
                sCol(i, j) = Cells(j, i)
            End If
        Next j
    Next i

Merci pour votre aide !

PS : Je ne trouve pas comment résoudre le post, vu que c'est ma propre réponse qui résout le problème.

Bonne journée,
Doltd

Bonjour Doltd.

Bonjour,

Comme précisé dans mon précédent message, je ne peux pas cocher mon propre message pour indiquer le message de la résolution !

Bonne journée,

Doltd

Re tu coches le chat perché cela n'a pas d'importance cela met le sujet en résolu.

Rechercher des sujets similaires à "vides lors copie macro"