2017-08-09 3 views
0

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:

  1. 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"
  2. 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.
  3. 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.

+0

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

+0

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

+0

Merci pour l'aide. –

Répondre

0

Vous pouvez uniquement utiliser Range.Select lorsque le Range que vous voulez sélectionner se trouve sur la feuille de calcul active.

Dans le code ci-dessous, il existe deux classeurs: TestMaster.xlsm et TestSlave.xlsx et les deux sont ouverts. Les deux macros échouent sur leur deuxième instruction masterRng.Select.

Option Explicit 

Sub testRange_SameBook_DifferentSheets() 
    Dim masterRng As Range 
    Workbooks("TestMaster.xlsm").Worksheets("Sheet1").Activate 
    Set masterRng = Range("A1:B5") 
    masterRng.Select 'Works 
    Worksheets("Sheet2").Activate 
    masterRng.Select 'Fails: Run-time error 1004 
End Sub 

Sub testRange_DifferentBooks() 
    Dim masterRng As Range 
    Workbooks("TestMaster.xlsm").Worksheets("Sheet1").Activate 
    Set masterRng = Range("A1:B5") 
    masterRng.Select 'Works 
    Workbooks("TestSlave.xlsx").Worksheets("Sheet1").Activate 
    masterRng.Select 'Fails: Run-time error 1004 
End Sub 

Dans les deux macros, un objet Range appelé masterRng est défini comme cellules A1:B5 sur la feuille de Sheet1 du classeur TestMaster.xlsm.

Alors que la feuille de calcul Sheet1 de TestMaster.xlsm reste la feuille de calcul active, la (première) masterRng.Select est exécutée avec succès. Cependant, une fois cette condition modifiée, l'appel (deuxième) à la méthode échoue.

Dans la macro testRange_SameBook_DifferentSheets(), la feuille de calcul active est convertie en une autre feuille de calcul dans le même classeur que masterRng. Dans la deuxième macro testRange_DifferentBooks() la feuille de calcul active est dans un classeur différent. Je suppose que la plupart des utilisateurs qui sont relativement nouveaux à VBA trébucher sur des méthodes telles que Activate, Select, etc parce que c'est ce qu'ils obtiennent de l'enregistreur de macro. Généralement, ces méthodes ne sont pas une bonne idée - voir this post.