2017-08-18 18 views
3

(recrue de codage affichant la première question jamais si s'il vous plaît pardonner mes erreurs)Capitaliser Dynamic Range dans VBA

Je suis en train d'apprendre des méthodes simples de validation des données. J'ai lu un autre article similaire à ce que je fais: convert-entire-range-to-uppercase, mais cela ne fonctionne pas quand je change la gamme pour répondre à mes besoins. N'a pas pu trouver autre chose qui a adressé ceci.

J'ai une colonne Excel nommée "Bloc" qui apparaît à différents endroits dans différents classeurs, et j'ai besoin de mettre en majuscule les lettres qui apparaissent dans cette colonne. Je pense que le code fonctionne comme prévu jusqu'à la dernière ligne, ce qui entraîne "#NAME?" remplir toute la gamme.

C'est ce que j'ai jusqu'à présent:

Dim LastColumn As Long 
Dim LastRow As Long 
Dim BlockColumn As Long 
Dim BlockRange As Range 

    'defines LastColumn, LastRow & BlockColumn 
    LastColumn = Cells.Find(What:="*", After:=Range("a1"), LookAt:=xlPart, LookIn:=xlFormulas, _ 
     SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False).Column 
    LastRow = Cells.Find(What:="*", After:=Range("a1"), LookAt:=xlPart, LookIn:=xlFormulas, _ 
     SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row 
    BlockColumn = Cells.Find(What:="Block", After:=Range("a1"), LookAt:=xlPart, LookIn:=xlFormulas, _ 
     SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Column 

    'capitalizes any text in BlockColumn 
    Set BlockRange = Range(Cells(2, BlockColumn), Cells(LastRow, BlockColumn)) 
    BlockRange = [UPPER(BlockRange)] 

En plus de se demander où je fait une erreur, je suis sûr que je l'ai trop compliqué cela. Quelqu'un pourrait-il me montrer un moyen de le repenser ou de le simplifier? Je me demandais aussi les avantages et les inconvénients généraux pour accomplir une tâche comme celle-ci via la boucle (par opposition à cette méthode), mais pas sûr si c'est l'endroit à demander que ...

Répondre

3

[] est un raccourci pour évaluer et fait n'accepte pas les variables.

Vous devrez utiliser Evaluate.

Vous avez également besoin d'INDEX pour ne pas écraser toute la plage avec la première valeur.

blockRange.value = blockRange.Parent.Evaluate("INDEX(UPPER(" & blockRange.Address & "),)") 
+1

'[]' * utilisé comme ceci * est un raccourci pour 'Evaluate'. Les crochets peuvent également être utilisés pour déclarer des membres enum cachés avec des noms autrement illégaux, par ex. '[_Default]'. Fous hein! Ça fait du bien de rehausser une de vos * réponses * (et pas un * commentaire *) enfin! =) –