VBA - Ensemble de la Gamme Entre les Deux Dates à l'Aide de la Fonction Recherche
J'essaie d'obtenir mon code VBA à la recherche à travers une colonne pour un utilisateur de saisie de la valeur (dans un formulaire) et de définir une plage sur la base des valeurs.
J'ai besoin du code pour balayer vers le BAS de la colonne jusqu'à ce qu'il trouve la valeur (qui est une date), puis de numériser à travers la colonne pour obtenir la deuxième partie de la gamme. J'ai besoin d'elle pour être comme cela, car il peut y avoir plusieurs instances de la même date et qu'ils doivent être pris en compte.
J'ai essayé ceci:
StartRange = ws.Cells.Find(What:=StartDate, SearchOrder:=xlRows, _
SearchDirection:=xlNext, LookIn:=xlValues)
EndRange = ws.Cells.Find(What:=EndDate, SearchOrder:=xlRows, _
SearchDirection:=xlPrevious, LookIn:=xlValues)
Mais il ne fonctionne pas de la façon dont j'avais prévu, et est erroring. (Edit: le WS a été défini, donc je sais que ce n'est pas la question). Je ne sais même pas si je vais sur ce la bonne manière
Je me sens vaincu 🙁
Toute aide serait appréciée, Merci d'avance!
Edit:
Je n'ai pas encore essayer l'une des suggestions que je suis loin de mon projet pour le moment, mais je sens que j'ai besoin de clarifier un peu les choses.
-
Les dates seront toujours dans l'ordre chronologique, j'ai un script qui les organise sur la feuille d'activation
-
J'ai besoin d'être en mesure d'erreur gérer les dates qui ne figurent pas dans la base de données, j'ai aussi besoin du script pour etre capable de "sauter" des dates qui n'existent pas. C'est à dire, 1er 1er 1er, 3e, 3e, 5e. Si mon début et de fin dates ont été le 1er et le 5, l'ensemble de la gamme.
Merci pour votre aide pour l'instant les gars, si, je l'apprécie!
EDIT2:
J'ai essayé quelques réponses et ont ajouté ceci dans mon code, mais il est maintenant à défaut sur une Range_Global échouer.
Dim startrange, endrange, searchrange As Range
LookUpColumn = 2
With ws.Columns(LookUpColumn)
Set startrange = .Find(What:=Me.R_Start.Value, _
After:=ws.Cells(.Rows.count, LookUpColumn), _
SearchOrder:=xlRows, _
SearchDirection:=xlNext, LookIn:=xlValues)
Set endrange = .Find(What:=Me.R_End.Value, _
After:=ws.Cells(5, LookUpColumn), _
SearchOrder:=xlRows, _
SearchDirection:=xlPrevious, LookIn:=xlValues)
searchrange = Range(startrange, endrange)
MsgBox searchrange.Address
End With
Des suggestions?
- comme je comprends bien, la "date de début" et "date de fin" sont distincts. Q1: ces 2 entrées avec la même valeur? Q2:La colonne de recherche contient plus d'une fois à la fois la date de début/date de fin, une seule, laquelle? Projet de Solution: je voudrais aborder ce avec un
for i=1 to X
, s'arrêter quand j'ai frappé à la "date de fin", magasin, je de position et puisfor j= (i's position) to 1 step -1
et de s'arrêter quand j'ai frappé à la "date de début". Je vais écrire le code mais j'ai besoin de plus de détails. - Merci Pour La Réponse. Q1) Oui, les dates peuvent être les mêmes et la gamme devrez sélectionner toutes les dates sont les mêmes. Q2) de La colonne de recherche peut contenir plusieurs entrées à la fois le début et la date de fin, par exemple: 1er, 1er, 1er, 2ème, 2ème, 3ème, 3ème. avec le 1er et le 3ème étant le début et date de fin. J'avais besoin de toute l'exemple de la gamme. Merci. Oh, et merci de votre projet, la seule chose est que je pourrait avoir le potentiel d'être au tamis de 30 000 lignes de données, j'ai donc pour X pourrait être très gourmande en mémoire?
Vous devez vous connecter pour publier un commentaire.
Commençons par cela et voir ce qui doit être ajusté.
Ce code va chercher une date (en fonction de l'entrée) et trouver la position de cette date dans une colonne. Même avec les "EndDate" et puis crée une gamme sur cette colonne entre les 2 positions.
Une autre approche implique la recherche de la date de fin de bas en haut (comme dans Excel les valeurs de colonne) et pour la date de début de haut en bas. comme ceci:
Et le 3ème (le charme):pour la date de fin du haut vers le bas et de la date de début de haut en bas. comme ceci:
Et le 4ème (Le seul):
Sur mon ordinateur portable à la maison de la recherche sur les 30.000 cellules est instantanée (moins de 1s).
Essayez-le et après les réactions que nous pouvons affiner.
De l'Autre côté, je pourrais lire votre question de recherche Pour sélectionner toutes les valeurs ne entre le haut et le bas de la position, mais toutes les cellules avec des valeurs de dates entre les 2 valeurs d'entrée neverminind l'arrangement des valeurs au sein de la liste (colonne de cellules). c'est à dire Si StartDate = 1.Janv.2013 et EndDate = 3.Janv.2013. Le code doit ramasser les 1,2 et 3 de l'30.000 liste neverminind la position de ces 3 dates (qui en fait peut-être trouvé des milliers de fois). Si Cela est vrai, la solution peut être plus simple que la précédente.
Dim i, j As Integer
(i est déclarée comme une Variante et j échouera si elle est > 32767) àDim i As Long, j As Long
À l'aide de
Find
est la bonne façon de faire ce genre de chose, vous avez juste besoin de quelques détails.Utilisation
Set
pour attribuer les références de plage. Par exempleSet StartRange = ...
(et assurez-vous deDim StartRange as Range
). IdemEndRange
etSearchRange
Spécifier un
After
cellule. Notez que par défaut, c'est la cellule Supérieure Gauche de la plage de recherche, et la recherche commence après cette cellule. Si votre date de début se trouve dans la cellule A1 (et une autre cellule), puis en laissant par défaut sera de retour le mauvais résultatLimite de la plage de recherche de la colonne d'intérêt.
Dim
toutes vos variables. Chaque variaqble a besoin de sa propreAs
(et l'utilisation deOption Explicit
)Résultat final
LookupColumn
devraient également être utilisé dans le.Cells
, si pas, vous pouvez être à la recherche dans une colonne et de définir une plage à l'autre. La réponse ci-dessus n'explique pas comment créer une gamme de entre StartRange et EndRange. Ce que je comprends de Liam qu'il devrait y avoir quelques valeurs intermédiaires capturé à l'intérieur de la gamme.LookupColumn
, j'ai ajouté qu'. Comme je l'ai lu l'OP, ce qui est requis est la première date de début et date de fin de la Dernière. C'est ce que cette réponse donne. Créer une gamme de ces résultats avec de répartition(StartRange, EndRange)StartDate
valeur à la DateJe n'aime pas le concept de cette date, recherche pour un couple de raisons..
Alors que ceux-ci peuvent être valide les hypothèses dans ce cas, je suis sûr qu'il peut y avoir des cas où cela peut ne pas être le cas...
Je ne sais pas la meilleure façon de faire cela, mais une alternative à considérer est l'aide de l'auto-filtre
Quelque chose comme: