Boucle avec des offset en erreur 1004
Bonjour,
J'essaie de finir une VBA pour réorganiser des données de 2 feuilles que j'ai nommé PBI et ExporttoMail.
En gros j'ai une liste d'email sur la colonne P (avec plusieurs fois les même mail dans ma colonne) de PBI et dans ExporttoMail j'ai les mail en colonne A mais avec une suppression des doublons.
Je cherche à utiliser les email comme clé pour transférer les informations de PBI des colonne E,F,G,C,O sur la même ligne que les emails dans ExporttoMail (en démarrant de ma colonne I).
Le soucis c'est que comme j'ai plusieurs fois le même mail en PBI et un mail unique en ExporttoMail il faut que je puisse me décaler quand je copie plusieurs fois sur la ligne d'un mail.
Pour répondre à ce problème j'ai mis des offset dans ma boucle mais il génère une erreur 1004 que je n'arrive pas à gérer.
voici le code que j'ai fais :
Sub RéorganiserDonnéesPB()
Dim wsPBI As Worksheet
Dim wsExportToMail As Worksheet
Dim lastRowPBI As Long
Dim lastRowExportToMail As Long
Dim i As Long, j As Long
Dim email As String
Dim nextEmptyCell As Range
' Définir les feuilles de travail
Set wsPBI = ThisWorkbook.Sheets("PBI")
Set wsExportToMail = ThisWorkbook.Sheets("Export to Mail")
' Trouver la dernière ligne de chaque feuille
lastRowPBI = wsPBI.Cells(wsPBI.Rows.Count, "P").End(xlUp).Row
lastRowExportToMail = wsExportToMail.Cells(wsExportToMail.Rows.Count, "A").End(xlUp).Row
' Parcourir chaque ligne de Export to Mail
For j = 2 To lastRowExportToMail ' Commence à la ligne 2 pour éviter les en-têtes
' Récupérer l'adresse e-mail de la ligne actuelle dans la colonne A de Export to Mail
email = wsExportToMail.Cells(j, 1).value
' Réinitialiser la description
Set nextEmptyCell = wsExportToMail.Cells(j, 9).End(xlToRight).Offset(0, 1) ' Trouver la prochaine cellule vide à partir de la colonne I
' Recherche de l'e-mail dans PBI
For i = 2 To lastRowPBI
If wsPBI.Cells(i, 16).value = email Then ' Si l'e-mail correspond
' Copier les données des colonnes E,F,G,C et O dans Export to Mail
nextEmptyCell.Offset(0, 1).value = wsPBI.Cells(i, 5).value ' Colonne E de PBI copiée sur la colonne J de Export to Mail
nextEmptyCell.Offset(0, 2).value = wsPBI.Cells(i, 6).value ' Colonne F de PBI copiée sur la colonne K de Export to Mail
nextEmptyCell.Offset(0, 3).value = wsPBI.Cells(i, 7).value ' Colonne G de PBI copiée sur la colonne L de Export to Mail
nextEmptyCell.Offset(0, 4).value = wsPBI.Cells(i, 3).value ' Colonne C de PBI copiée sur la colonne M de Export to Mail
nextEmptyCell.Offset(0, 5).value = wsPBI.Cells(i, 15).value ' Colonne O de PBI copiée sur la colonne N de Export to Mail
Set nextEmptyCell = nextEmptyCell.Offset(0, 6) ' Déplacer la référence à la prochaine cellule vide
End If
Next i
Next j
End SubPouvez-vous m'aider s'il vous plait ?
bonjour,
adapte cette partie du code avec ceci
' Réinitialiser la description
dercol = wsExportToMail.Cells(j, 9).End(xlToRight).Column
If dercol = wsExportToMail.Columns.Count Then dercol = 9
Set nextEmptyCell = wsExportToMail.Cells(j, dercol + 1)ça marche merci beaucoup !
Pour info voici comment je l'ai intégré :
Sub RéorganiserDonnées()
Dim wsPBI As Worksheet
Dim wsExportToMail As Worksheet
Dim lastRowPBI As Long
Dim lastRowExportToMail As Long
Dim i As Long, j As Long
Dim email As String
Dim nextEmptyCell As Range
Dim dercol As Long ' Variable pour stocker la dernière colonne remplie
' Définir les feuilles de travail
Set wsPBI = ThisWorkbook.Sheets("PBI")
Set wsExportToMail = ThisWorkbook.Sheets("Export to Mail")
' Trouver la dernière ligne de chaque feuille
lastRowPBI = wsPBI.Cells(wsPBI.Rows.Count, "P").End(xlUp).Row
lastRowExportToMail = wsExportToMail.Cells(wsExportToMail.Rows.Count, "A").End(xlUp).Row
' Parcourir chaque ligne de Export to Mail
For j = 2 To lastRowExportToMail ' Commence à la ligne 2 pour éviter les en-têtes
' Récupérer l'adresse e-mail de la ligne actuelle dans la colonne A de Export to Mail
email = wsExportToMail.Cells(j, 1).value
' Réinitialiser la description
dercol = wsExportToMail.Cells(j, 7).End(xlToRight).Column ' Trouver la dernière colonne remplie dans la ligne
If dercol = wsExportToMail.Columns.Count Then dercol = 7 ' Si la ligne est pleine, démarrer à partir de la colonne 9
' Trouver la prochaine cellule vide à partir de la colonne déterminée
Set nextEmptyCell = wsExportToMail.Cells(j, dercol + 1)
' Recherche de l'e-mail dans PBI
For i = 2 To lastRowPBI
If wsPBI.Cells(i, 16).value = email Then ' Si l'e-mail correspond
' Copier les données des colonnes E,F,G,C et O de PBI dans Export to Mail
nextEmptyCell.Offset(0, 1).value = wsPBI.Cells(i, 5).value ' Colonne E de PBI copiée sur la colonne J de Export to Mail
nextEmptyCell.Offset(0, 2).value = wsPBI.Cells(i, 6).value ' Colonne F de PBI copiée sur la colonne K de Export to Mail
nextEmptyCell.Offset(0, 3).value = wsPBI.Cells(i, 7).value ' Colonne G de PBI copiée sur la colonne L de Export to Mail
nextEmptyCell.Offset(0, 4).value = wsPBI.Cells(i, 3).value ' Colonne C de PBI copiée sur la colonne M de Export to Mail
nextEmptyCell.Offset(0, 5).value = wsPBI.Cells(i, 15).value ' Colonne O de PBI copiée sur la colonne N de Export to Mail
Set nextEmptyCell = nextEmptyCell.Offset(0, 6) ' Déplacer la référence à la prochaine cellule vide
End If
Next i
Next j
End SubJ'ai juste remplacé 9 par 7 car ça m'envoyais dans la colonne K, je pense que vu que j'ai 2 colonnes rempli en A et en B ça me décalais de 2 colonnes
Encore merci !
re-bonjour,
en fait cette instruction
wsExportToMail.Cells(j, 7).End(xlToRight).Columnte renvoie le numéro de colonne de la dernière colonne non vide. S'il ne trouve pas de colonne ayant un contenu, l'instruction renvoie le numéro de la dernière colonne possible pour ta feuille (ce numéro dépend de ta version excel). En faisant
wsExportToMail.Cells(j, 9).End(xlToRight).offset(0,1)tu demandes d'accéder à la dernière colonne +1, ce qui n'est pas possible donc erreur 1004.
Merci pour l'info :)