J'ai essayé de créer du code pour comparer des entrées d'une liste d'un classeur à deux listes d'un autre classeur (une liste principale). L'objectif final est d'avoir une macro qui s'exécuterait et marquerait si une entrée de la liste se trouvait dans l'une des deux listes principales, appelées "Statistiques" et "Non-statistiques" (feuilles 1 et 2 respectivement) et ensuite étiquetées en conséquence . Pour ce faire, j'ai besoin de définir les deux plages du classeur de la liste principale en tant que variables à utiliser dans la méthode Range.Find, ou toute autre méthode qui fonctionnerait.Définition de plusieurs plages de classeurs externes en tant que variables pour le classeur actuel Range.Find macro
Les listes sont mis en place en tant que telle:
- Dans la liste initiale qui est d'avoir une piste de vérification par rapport à elle (et aussi où le code réside), il y a une sortie généralement environ 150 entrées, filtrées (par des critères prédéterminés) de telle sorte que seulement 100 peuvent être visibles, avec le nombre changeant pour chaque jour de sortie sur une feuille étiquetée "Changes"
- Le classeur "Master Statistical List" est mis en place avec deux feuilles que j'ai une autre macro remplissant et ajoutant des entrées à. Sheet1 est nommé "statistique" et contient toutes les entrées jugées "statistiques" et Sheet2 est nommé "non statistique" et contient toutes les entrées considérées comme non statistiques. Les listes sont dans les milliers de lignes, donc j'essaie d'éviter d'utiliser la fonction .Select.
- Les deux listes principales sont toutes deux stockées dans la colonne A à partir de A1, tandis que la liste "Changes" en cours de vérification commence à partir de A2 (en raison d'un en-tête).
Voici ce que j'ai jusqu'à présent pour juste le code de référence de la gamme:
'Establish the list references
Dim MSL As Workbook 'Master Statistical List
Dim SP As Worksheet 'Statistical Properties
Dim NSP As Worksheet 'Non-statistical Properties
Dim TWS As Workbook 'This Worksheet - the original one in which this code resides
Set MSL = Workbooks.Open(Filename:="Filepath\Master Statistical List.xlsm")
Set SP = MSL.Worksheets("Statistical") 'Alternatively .Worksheets(1)
Set NSP = MSL.Worksheets("Non-statistical") 'Alternatively .Worksheets(2)
Set TWS = ThisWorkbook
'Establish the Range references
'Statistical Properties List
SP.Activate
Dim rngStat As Range
Set rngStat = Range("A1", .Range("A1").End(xlDown))
'check if it actually worked
rngStat.Select 'it seems to work
Range("B1").Select 'select random cell so we know if selecting it again actually works (I run through this line-by-line to debug)
TWS.Activate 'Lets go back to the current workbook and then see if it still works!
rngStat.Select 'Here be errors
Je courrais similaires combos Dim-jeu pour les deux la gamme des « changements » et la non-statistique un.
J'ai essayé plusieurs solutions différentes, y compris au moyen d'un paramètre avec en tant que tel:
With SP
Set rngStat = Range("A1", SP.Range("A1").End(xlDown))
End With
Ou mettre SP en face de la fonction .Range comme indiqué ci-dessus, mais rien ne marche une fois la feuille active est modifiée . Y at-il un moyen de définir rngStat comme faisant référence universellement à la liste des entrées de A1 de sa feuille jusqu'à l'entrée finale de telle sorte qu'elle puisse être utilisée dans les boucles ou fonctions ultérieures dans la macro ? Il est important que la plage ne soit pas à une cellule définie, mais plutôt à la dernière entrée dans la colonne A, car le nombre d'entrées change toujours sur la feuille source et augmente dans la liste principale.
Je ne sais pas si c'est une faute de frappe ici, mais dans 'With SP' vous devriez ajouter le" anchor "à la' Range(), 'ie' .Range (...) 'Aussi dans le code principal, vous ancre le '.Range (" A1 "). End (xlDown)' à ... quoi? Il n'y a pas de déclaration "With" montrant. – BruceWayne
Il semble que vous ayez besoin de commencer à référencer explicitement chaque plage, y compris sa feuille. Cela fonctionnera quelle que soit la feuille active. Dans cet exemple, j'inclue également une référence au classeur de code. Vous pouvez le supprimer si ce n'est pas pertinent, mais je le laisse dans le cas où le classeur doit également être référencé explicitement: 'Set rng = Workbooks (ThisWorkbook.Name) .Sheets (" Sheet2 "). Range (" A1 ", Workbooks (ThisWorkbook.Name) .Sheets ("Sheet2"). Range ("A1"). End (xlDown)) ' – David
Merci pour l'aide. –