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 Sub

Pouvez-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 Sub

J'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).Column

te 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 :)

Rechercher des sujets similaires à "boucle offset erreur 1004"