2016-08-13 4 views
3

Ich brauche eine einfache und schnelle Lösung für die Multiplikation aller Werte in einem Bereich durch einen numerischen Wert in VBA-Code. Ich weiß, über diese Lösung: Multiply Entire Range By Value?Multiplizieren Sie jeden Wert in einem Bereich mit einer Konstante, aber leere Zellen überspringen

Set rngData = ThisWorkbook.Worksheets("Sheet1").Range("A1:B10") 
rngData = Evaluate(rngData.Address & "*2") 

Aber es hat einen großen Nachteil - wenn die ursprüngliche Zelle leer war, führt dies zu Null. Wie erzwinge es leere Werte überspringen?

Ich möchte vermeiden, die Werte durchlaufen, weil es sehr langsam ist.

+0

Zuordnung Wert 1 zu den leeren Zellen vielleicht? –

+0

Ich meinte, ich möchte, dass die leeren Zellen natürlich leer bleiben. –

+0

Ich verwende dies auf meine Makros. rngData.TextToColumns Ziel: = rngData (1), DataType: = xlFixedWidth, _ Feldinfo: = Array (0, 1), TrailingMinusNumbers: = True – winghei

Antwort

2

Sie können Ihren bestehenden Ansatz mit Evaluate verwenden, aber ein bisschen schlauer damit - es kann Bedingungen usw. nehmen, also fügen Sie einfach einen Test für ISBLANK. Dieses Beispiel basiert auf einer Kombination von leeren und nicht leeren Zellen im Bereich A1:C3 getestet - nur für Ihren Bereich aktualisieren und es zu versuchen:

Option Explicit 

Sub Test() 

    Dim rng As Range 

    Set rng = Sheet1.Range("A1:C3") 

    'give the name a range so we can refer to it in evaluate 
    rng.Name = "foo" 

    'using Evaluate 
    rng = Evaluate("IF(ISBLANK(foo),"""",foo*2)") 

    'using [] notation 
    'preferred IMO as dont need to escape " 
    rng = [IF(ISBLANK(foo),"",foo*2)] 

End Sub 
+0

Danke, es funktioniert gut! Ich habe schon einmal darüber nachgedacht, aber ich habe nicht erwartet, dass "" als leere Zelle bewertet würde, aber ich würde erwarten, dass es sich um einen Text von Null Länge handelt. Das ist auch ein bisschen überraschend. Wenn Sie beispielsweise formula = "" in Zelle A1 schreiben und dann diese Zelle kopieren und als Wert in Zelle A2 einfügen, ist Zelle A2 nicht leer (Sie können es mit der Funktion ISBLANK() testen), aber es ist ein Text von Null Länge. –

+0

Kann es nicht probieren, sollte aber ohne benannten Bereich funktionieren '[IF (ISBLANK (A1: C3), A1: C3, A1: C3 * 2)]' oder der Hässliche 'Evaluate (Replace (" IF (ISBLANK(),, * 2) "," ", r.Address (0, 0)))' – Slai

1

Ich weiß, dass Sie eine akzeptierte Antwort haben, aber für was auch immer es lohnt mich Es stellt sich heraus, dass Sie den Bereich nicht benennen müssen. Und wenn die Zellen im Bereich Text enthalten, dann ist dieser einzeilige Code funktioniert gut

Sub MultiplyRangeByConstant() 
    [A1:C3] = [IF(ISBLANK(A1:C3),"",IF(ISTEXT(A1:C3),A1:C3,2*A1:C3))] 
End Sub 
1

wenn es Formeln oder irgendetwas anderes im Bereich:

'[a1:b3] = [{"=1","a";2,"=0/0";"",3}] 
[a1:b3] = [if(a1:b3="","",if(isNumber(a1:b3),a1:b3*2,a1:b3))] 

oder die Formeln zu ignorieren, die gute alte PasteSpecial

Set temp = [c1].EntireRow.Find("") ' any blank cell that is not in the range 
temp.Value = 2 
temp.Copy 
[a1:b3].SpecialCells(xlCellTypeConstants).PasteSpecial , Operation:=xlMultiply 
temp.Value = "" 
Verwandte Themen