2016-02-16 19 views
8

Tüm hücre aralığını alan ve bunları küçük harflere dönüştüren VBA koduna bakıyorum.Tüm aralığı hücreler arasında geçiş yapmadan küçük harfe dönüştürün Dolaylı

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

Bu sabit aralık (tamamen sözdizimi anlamıyorum için çalışıyor, ancak aşağıdaki sonrası :)

Post detailing code above

Benim sorun bulundu şudur:

aşağıdaki buldum

Değişen aralık boyutları ile uğraşırken, aralığı dinamik olarak ayarlayabilmek istiyorum. Ancak, aşağıdakiler işe yaramıyor ve INDIRECT() yöntemini VBA'da kullanamıyorum.

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

Bu işi yapmanın bir yolu var mı? Bu çok daha hızlı olması gerektiği şüpheli olarak Gerçekten

+2

'&' ve 'n' gibi bir boşluk bırakın:' 'Range (" A1: A "& n)' – findwindow

+0

VBA otomatik olarak doğru şekilde biçimlendirir - Yine de olduğu gibi boşluklarla tekrar denedim sorun. Sayfamda # VALUE hata alıyorum. – MartijndR

cevap

9

bu deneyin .. döngü için kullanmaktan kaçının istiyorum:

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

Soruya göre doğru cevap budur - köşeli parantezler VBA'daki "Değerlendirmek" için kestirme gösterimdir, ancak yalnızca bir dizgi değişmezidir, "Değerlendir" ise birleştirilmiş dizeyi kabul eder. –

+3

VBA [LCase] ​​ile gerçekten paralellenmiş [LOWER] (https://goo.gl/GMzwTs) ve [UPPER] (https://goo.gl/WXHHZ4) fonksiyonları hakkında çok fazla şaka var. https://msdn.microsoft.com/en-us/library/office/gg264497.aspx) ve [UCase] ​​(https://msdn.microsoft.com/en-us/library/office/gg264252.aspx) işlevleri . Daha önce bahsedilmemiş olan, VBA'nın çalışma sayfasının yerel [PROPER] (https://goo.gl/9F1oDG) işlevlerine eşdeğer olmaması ve bunu kullanmak için mükemmel bir aday olmasıdır. – Jeeped

6

bu yavaşlatacaktır çalışma sayfasının hücre yoluyla Döngü. Tüm hücre verilerini alın, bellekte işleyin ve sonucu çalışma sayfasına geri dökün.

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 

50 K hücresi üzerinde 0,3 saniyede, 1 M hücreler 6.78 saniyede test edilmiştir.

İlgili konular