Exporter Cellules d'1 colonne vers une autre colonne si conditions
Bonjour à tous,
J’ai besoin de votre aide pour apporter une solution à un problème que je n’arrives pas à résoudre, voici donc la situation :
J’ai deux feuilles sur lesquelles on va travailler, la feuille "Source" et la feuille "Destination".
La feuille "Source" se compose de 11 colonnes. Les colonnes sur lesquelles nous allons travailler au niveau de cette feuille sont les colonnes : "A" et "K"
La feuille "Destination" se compose de 30 colonnes. La seule colonne sur laquelle nous allons travailler est la colonne "A".
Le but du code (En vba s’il vous plait) est de transférer les valeurs des cellules de la colonne "A" de la feuille "Source" vers la colonne "A" de la feuille "Destination" si les trois conditions suivantes sont réunies :
La 1première condition : la valeur de la cellule de la colonne "A" de la feuille "Source" ne doit pas déjà figurer dans la colonne "A" de la feuille "Destination".
La 2e condition : la valeur de la cellule de la colonne "K" de la feuille "Source" de la même ligne que la cellule de la colonne "A" concernée doit être égale à "X" ou "x".
La 3e condition : la valeur de la cellule en colonne "A" de la feuille "Source" doit absolument se terminer par "M".
Je reste à votre disposition pour d’autres informations supplémentaires.
Sauf erreur de ma part, le résultat souhaité se trouve dans la colonne "A" de la feuille "Destination"
Les données que j’ai mis dans mon fichier joint sont réduites pour les besoins de ma demande, autrement dit, mes données sont plus importantes, d’où, l’utilisation d’un code qui s’exécute rapidement est souhaitable.
Merci pour vos contributions.
Hello,
Une proposition de code
Sub TransfererDonnees()
Dim wsSource As Worksheet, wsDest As Worksheet
Dim dictDest As Object
Dim lastRowSource As Long, lastRowDest As Long
Dim i As Long
Dim valA As String, valK As String
' variables
Set wsSource = ThisWorkbook.Sheets("Source")
Set wsDest = ThisWorkbook.Sheets("Destination")
' dico pour optimiser la vitesse sur gros volumes
Set dictDest = CreateObject("Scripting.Dictionary")
' Dernières lignes utilisées
lastRowSource = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row
lastRowDest = wsDest.Cells(wsDest.Rows.Count, "A").End(xlUp).Row
' trouver les valeurs déjà présentes
For i = 1 To lastRowDest
valA = Trim(wsDest.Cells(i, "A").Value)
If Len(valA) > 0 Then
dictDest(valA) = True
End If
Next i
' Parcours des lignes de la feuille Source
For i = 1 To lastRowSource
valA = Trim(wsSource.Cells(i, "A").Value)
valK = Trim(wsSource.Cells(i, "K").Value)
If Len(valA) > 0 Then
' Condition 1 : n'existe pas dans Destination
If Not dictDest.exists(valA) Then
' Condition 2 : Colonne K = X ou x
If LCase(valK) = "x" Then
' Condition 3 : se termine par "M"
If UCase(Right(valA, 1)) = "M" Then
' Ajouter à la prochaine ligne vide de Destination
lastRowDest = lastRowDest + 1
wsDest.Cells(lastRowDest, "A").Value = valA
dictDest(valA) = True ' éviter doublons futurs
End If
End If
End If
End If
Next
End Sub@+
Bonjour Baroute78,
Merci pour votre retour ainsi que le code proposé.
J’ai testé ce dernier, il répond à mes attentes et me satisfait totalement.
Merci également pour les commentaires à l’intérieur du code qui ne facilitent sa compréhension.
Salutations amicales.
Re,
J'ai voulu dire : Merci également pour les commentaires à l’intérieur du code qui me facilitent sa compréhension.