2016-02-16 50 views
8

Sprawdzam kod VBA, który ma cały zakres komórek i konwertuje je na małe litery. Znalazłem następujące:Konwersja całego zakresu na małe litery bez przechodzenia między komórkami Pośrednie

[A1:A20] = [index(lower(A1:A20),)] 

Działa to dobrze na określony zakres (nie całkowicie zrozumieć składnię, ale okazało się, że następujące postu :)

Post detailing code above

Mój problem jest taki:

Chciałbym móc ustawić zakres dynamicznie, ponieważ mam do czynienia ze zmieniającymi się rozmiarami zakresów. Jednak poniższe nie działa i nie mogę wydawać się być w stanie użyć metody INDIRECT() w VBA.

Range("A1:A" & n) = [index(lower(Range("A1:A" & n)),)] 

Czy istnieje sposób, aby to zadziałało? Naprawdę chciałbym, aby uniknąć za pomocą pętli for jak podejrzewam, to powinno być dużo szybciej ..

+2

Pozostaw spację między '&' a 'n' jak: 'Zakres (" A1: A "i n)' – findwindow

+0

VBA automatycznie formatuje go we właściwy sposób - próbowałem ponownie ze spacjami na wszelki wypadek, ale to samo problem. W moim arkuszu są błędy #VALUE. – MartijndR

Odpowiedz

9

Spróbuj tego:

Range("A1:A" & n) = Application.Evaluate("index(lower(A1:A" & n & "),)") 
+4

Jest to poprawna odpowiedź na podstawie pytania - nawiasy kwadratowe są skrótowymi notacjami dla "Evaluate" w VBA, ale przyjmują tylko literał łańcuchowy, natomiast 'Evaluate' akceptuje połączony ciąg znaków. –

+3

Było dużo przekomarzania się z funkcjami [LOWER] (https://goo.gl/GMzwTs) i [UPPER] (https://goo.gl/WXHHZ4), które są faktycznie sparowane z VBA [LCase] ​​(https://msdn.microsoft.com/en-us/library/office/gg264497.aspx) i [UCase] ​​(https://msdn.microsoft.com/en-us/library/office/gg264252.aspx) funkcje . Nie wspomniano, że VBA nie ma odpowiednika natywnych funkcji [PROPER] arkusza roboczego (https://goo.gl/9F1oDG) i jest to doskonały kandydat do użycia. – Jeeped

6

Przelotowe komórce arkusza będzie to spowolnić. Pobrać wszystkie dane komórki, przetworzyć je w pamięci, a następnie zrzucić wynik z powrotem do arkusza roboczego.

Sub makeLower() 
    Dim v As Long, vLWRs As Variant 

    With Worksheets("Sheet1") 
     With .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp)) 
      vLWRs = .Value2 
      For v = LBound(vLWRs, 1) To UBound(vLWRs, 1) 
       vLWRs(v, 1) = LCase(vLWRs(v, 1)) 
      Next v 
      .Cells = vLWRs 
     End With 
    End With 
End Sub 

Testowane na komórce 50K w 0.3 sekundy, komórki 1M w 6,78 sekundy.