Le filtrage de la Colonne en Fonction de la Portée VBA
Je suis actuellement un travail avec des données à partir d'un ordinateur central, pas contrairement aux données présentées ici. Dans ce cas, tout ce que j'ai sont des chaînes de caractères s'apparente à 100 AAA pour mes critères et mon objectif de l'ensemble de données. J'ai cherché une solution similaire, mais je n'ai pas trouvé directe filtre de l'aire de question pour VBA sur DONC.
J'essaie de filtrer un grand jeu de données basé sur un ensemble de critères. A l'origine, j'ai commencé à jouer avec des collections dans des classes séparées ou sous-programmes, mais ensuite j'ai compressé à l'utilisation des plages dans un seul sous-programme, comme suit:
Sub FilterTest1()
Dim RngOne As Range
Dim LastCell As Long
Sheets("Criteria").Activate
Sheets("Criteria").Select
Range("A1").Select
LastCell = Application.WorksheetFunction.CountA(ActiveSheet.Range("A:A"))
Set RngOne = ActiveSheet.Range("A2:A" & LastCell)
Sheets("Sheet 1").Activate
Sheets("Sheet 1").Select
With ActiveSheet
If .FilterMode Then
.ShowAllData
End If
End With
Columns("A:A").Select
Selection.AutoFilter
ActiveSheet.Range("A:A").AutoFilter Field:=1, Criteria1:=RngOne, Operator:=xlOr
End Sub
Malheureusement, ma plage de cellules ne filtre pas les données, même lors de l'utilisation de critères tels que Operator:=xlOr
- il simplement l'affichage de la dernière valeur de la cellule utilisée pour les critères. Le code VBA de ne pas échouer, il a juste ne filtre pas correctement en fonction de la plage.
Je suis certain qu'il existe une solution simple, mais je ne peux pas tout voir.
- Avez-vous pensez à utiliser ADO de sorte que vous pouvez utiliser les commandes SQL pour faire le filtrage (mais toujours à l'aide d'Excel)? Effectuer une jointure interne entre vos critères et de l'ensemble de données peut adapter le projet de loi
- Cette précédente réponse à une question similaire, aide - stackoverflow.com/a/7863452/53614 ? J'utilise ADO sur des machines au travail, où je n'ai pas les droits admin et cela fonctionne bien. YMMV, mais il vaut la peine de donner un coup de feu
- Ok; je vais donner un coup de feu pendant le week-end et de voir comment elle se déploie en début de semaine prochaine. Il peut être bien utile pour utiliser ADO pour certains de mes plus grands ensembles de données, comme quoi en s'appuyant sur SQL est susceptible d'exécuter beaucoup plus rapide que dans le long terme. Si ça fonctionne bien, qui désigne un autre +1 pour ta réponse =)
Vous devez vous connecter pour publier un commentaire.
Votre ligne actuelle:
est d'essayer de filtrer votre premier champ par un
Range
objet, non pas par chaque valeur dans la gamme.J'ai fourni un moyen de le faire ci-dessous, par le chargement de vos valeurs dans un tableau et ensuite passage du tableau à l'critères de filtre.
Quelques points intéressant de noter pour vous aider (et quelqu'un d'autre dans le futur):
Code Ci-Dessous:
.Range("A:A").AutoFilter Field:=1, Criteria1:=Array(strList), Operator:=xlFilterValues
. Faites-vous savez pourquoi cela pourrait être présentes? Le reste du code semble fonctionner correctement.Une chose à noter, c'est que le
Criteria1
nécessite variables de chaîne de caractères comme argument. Vous pouvez affecter une plage à un tableau puis passer lestring
tableau des critères. Une autre remarque est que, pour passer d'un tableau à l'critères, à ma connaissance, il y a à être dans une ligne, pas une colonne par exemple.StringArray(0,3)
au lieu deStringArray(3,0)
. C'est pourquoi vous avez été d'obtenir la dernière valeur dans votre gamme. Utilisez simplementApplication.Transpose(StringArray)
convertir en ligne.De ce petit bout de code qui fonctionne pour moi, et est facilement étendu à de plus grands tableaux.