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 IfJe 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 Subre,
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 SubStepaustras, 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 SubBonjour,
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 iMerci 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,
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.