0
votes

Comment utiliser VBA pour rechercher une correspondance avec 2 colonnes avec 2 autres colonnes?

J'essaie de comparer les rangées dans les colonnes A et B contre les colonnes D et E. Pour être plus précis, les lignes des colonnes A et B seront copiées et collées dans une autre feuille si elle correspond à l'une des lignes des colonnes D et e.

J'ai essayé de combiner la correspondance, l'index, les formules de Vlookup, mais je n'ai eu jusqu'à présent que possible de détecter des doublons et de ne pas correspondre exactement aux lignes.

Voici un exemple de mes données:

 Entrez la description de l'image ici

Les rangées de la colonne A et B seront copiées et collées dans une autre feuille si elle correspond à l'une des lignes de la colonne D et E.


0 commentaires

3 Réponses :


-1
votes

Essayez d'utiliser "si" conditionner la colonne A et B


0 commentaires

0
votes

J'ai assemblé cela avec quelques commentaires pour vous aider à comprendre l'approche.

Ceci utilise Un tableau qui n'est pas vu sur la feuille. Ceci est similaire à une "colonne d'assistance" si vous deviez mettre dans colonne F code> pour concaténer vos valeurs. Vous pouvez voir comment modifier quoi / où la macro met à jour les mises à jour dans les premières lignes (il est maintenant basé sur votre tir d'écran). P>

Vous pouvez Téléchargez le workbook que j'ai utilisé comme exemple et que l'option de travail. P>

Sub TryingToclear2500Points()

Const theFirstColoumns As String = "A:B"
Const theSecondColumns As String = "D:E"
Const theDestinantionComun As String = "A:B"
Dim ws As Worksheet: Set ws = Sheet1 'Worksheet you want to analyse the columns
Dim psheet As Worksheet: Set psheet = Sheet2 'worksheet to paste data to
Dim checkRNG As Range, i As Long


'establishes destination column
     Dim dCOlumn As Long
     dCOlumn = Range(theDestinantionComun).Cells(1, 1).Column


'this is similiar to a helper column in that it makes an 1 dimensional array 
'of the columns concatenated together
    Set checkRNG = Intersect(ws.UsedRange, ws.Range(theSecondColumns))
    With checkRNG
    
    'builds an array to hold the data
    ReDim Makealist(1 To checkRNG.Rows.Count) As String
    For i = 1 To .Rows.Count
    
        'if using excel 2016 or higher TextJoin might be good for more dynamic
        'Makealist(i) = Application.WorksheetFunction.TextJoin("", False, Range(.Cells(i, 1), .Cells(i, .Columns.Count)))
        
        'this will always work if just two columns
        Makealist(i) = .Cells(i, 1).Value2 & .Cells(i, 2).Value2
    
    Next i
    
    End With
    
'now loop through columns A and b and check for a match in the array MakeAList)
                
    Set checkRNG = Intersect(ws.UsedRange, ws.Range(theFirstColoumns))
    
        With checkRNG
        
        For i = 1 To .Rows.Count
        
        
            'check if match
            If Not IsError(Application.Match(.Cells(i, 1).Value2 & .Cells(i, 2).Value2, Makealist, 0)) Then
                'found a match
                
                'using copy paste
                'Range(.Cells(i, 1), .Cells(i, 2)).Copy _
                    psheet.Cells(Rows.Count, dCOlumn).End(xlUp).Offset(1, 0)
    
                'If you just want values, below is a better method that just sends values
                psheet.Cells(Rows.Count, dCOlumn).End(xlUp).Offset(1, 0).Resize(1, 2).Value = _
                    Range(.Cells(i, 1), .Cells(i, 2)).Value2
                
            End If
        Next i

     End With
End Sub


6 commentaires

Salut là-bas, désolé pour la réponse tardive était juste à la maison. Quoi qu'il en soit essayé d'exécuter le code et que je reçois une erreur qui disent que le type inadéquation sur cette ligne particulière du code: Makealist (i) = .Cells (I, 1) .value2 & .Cells (i, 2) .value2 est là quand même à résoudre ceci? Désolé comme je suis assez nouveau à VBA.


En supposant que vous travaillez directement avec cette capture d'écran, c'est probablement parce que vous avez des erreurs dans la colonne B. Découvrez un moyen de se débarrasser de ceux-ci et vous devriez être bon. Déterminez également quelle ligne il s'agit en identifiant la valeur de i lorsque l'erreur frappe. Probablement confrri que c'est lié au n / a


OK, j'ai compris! On dirait que je dois supprimer tous les # n / a des données avant de pouvoir exécuter la macro. Merci!


Salut là-bas, j'essaye maintenant ceci sur le fichier principal que je travaille sur et avoir une erreur sur cette ligne de code: sinon IsError (application.match (.Cells (I, 1) .value2 & .Cells (i, 2) .value2, Makealist, 0)) Ensuite, je reçois une nouvelle fois l'erreur de décalage de type et je ne suis pas très sûr de ce que cette ligne de code fait, apprécierait si vous pouviez expliquer et aider. Merci!


Également sur le fichier principal, je travaille sur, les données des colonnes A et B et des colonnes D et E ne sont pas les mêmes que cela peut être la cause? Si oui, est là quand même pour résoudre ce problème. Merci!


Mise à jour, cela fonctionne lorsque le nombre de lignes est la même. Cependant, j'en ai besoin pour travailler même lorsque le nombre de lignes est différente. De toute façon pour éditer au code? Merci



0
votes

Ce n'était donc pas clair pour moi si vous voulez faire cela à l'aide du code (dans lequel la réponse de PGCODERider est excellente) ou sur une base manuelle.

S'il est manuel, vous pouvez simplement mettre cette déclaration dans la colonne C et Copiez-le vers le bas: xxx

Ceci ajoutera le mot "correspondance" si la colonne A et B combinée sont identiques à la colonne D et E combinées (et laissez la cellule vide si elles ne correspond pas). Vous pouvez ensuite filtrer ou trier la colonne C pour "Match" et copier les lignes.

Si vous le vouliez afin que la colonne A ou la colonne B correspond à D et E respectivement, changez la formule à

= si (ou (A2 = D2, B2 = E2), "correspond" "," ")

Ceci suppose que vous n'aurez pas d'entrées vides dans les colonnes (si oui vous Besoin d'étendre la formule pour ignorer les cellules vides à l'aide de la fonction et de la fonction).


0 commentaires