Macro Excel sélectionne deux plages et compare

C'est une question qui m'a été posée lors d'une interview. J'ai une list excel. Il est copié dans un autre location et, par erreur, une ligne dans le nouvel location est supprimée.

Maintenant, j'ai besoin d'écrire une macro pour comparer les anciennes et les nouvelles gammes, puis fournir datatables manquantes en conséquence.

Je peux peut-être effectuer la partie de comparaison. Mais le problème est que je ne sais pas comment get la gamme sélectionnée comme input dans une macro.

Par exemple, dès que je sélectionne une gamme, elle doit être envoyée en tant que saisie à la macro, alors la macro devrait attendre une autre sélection. Dès que je sélectionne la nouvelle gamme, la macro devrait comparer et find les lignes manquantes dans une nouvelle gamme.

En ce qui concerne la sélection par clic de souris, vous pouvez regarder le lien que j'ai envoyé dans les commentaires de l'autre réponse . Selection_Change est un événement déclenché lorsque vous modifiez la sélection d'une feuille de calcul (non seulement mouseclick mais aussi les touches de déplacement). La cible à venir est la cellule que vous avez sélectionnée. Vous pouvez passer cela comme une scope sur une fonction.

     Private Sub Worksheet_SelectionChange (ByVal Target As Range)
         ShowMsg Target
     End Sub

     Fonction privée showMsg (r As Range)
         MsgBox r.Address
     Fonction de fin

Vous pouvez également utiliser un autre événement comme BeforeDoubleClick ou BeforeRightClick. Découvrez les events d'Excel et choisissez celui que vous ressentez le mieux.

Si vous souhaitez que la fonction soit activée pour une certaine plage, vous pouvez la filterr.

If target.column <> 1 then exit function

Si vous ne souhaitez pas que l'événement triggers votre fonction chaque fois que vous modifiez une sélection, vous pouvez choisir une cellule pour être le commutateur déclenché par le même événement.

If target.address = "$A$1" Then Call toggleSearch()

avec la fonction de basculement.

C'est un diff classique (et un simple à cela), vous ne devez pas choisir à la main ou à rien. Il suffit de sortinger les deux lists d'une manière identique, puis d'exécuter un Sub qui boucle le nombre de lignes dans la feuille source en comparant chaque ligne avec la même ligne dans la feuille cible. Le premier décalage que vous obtenez est la ligne manquante.

Cet exemple suppose que les deux feuilles sont dans le même classur mais vous pouvez facilement l'adapter

 Public Sub diffThem ()

     Dim src comme feuille de calcul, trg en tant que feuille de calcul
     Dim r comme Range, i en entier
     Définir src = ThisWorkbook.Sheets ("Source")
     Définir trg = ThisWorkbook.Sheets ("Destination")

     Définir r = src.Range ("A1")
     Pour i = 1 à ThisWorkbook.Sheets ("Source"). UsedRange.Rows.Count

         Si r.EntireRow <> trg.Range ("A" & r.Row) .EntireRow Then 
             MsgBox ("La ligne manquante est" & r.Row)
             Exit Sub
         Fin si

     Définir r = r.Offset (1,0)
     Ensuite je

 End Sub

Si EntireRow ne peut pas être exécuté en raison de différentes mises en page ou quoi que ce soit, reliez les colonnes à ce moment-là.