2016-06-06 9 views
1

Ich möchte Formeln in Spalte B mit einer Verzögerung dazwischen einfügen. Die Formel sollte nur die Formel einfügen, wenn die Zelle, um es nach links (im Fall von B1 ist das A1) nicht leer ist, wie folgt aus:Korrekte Formel gibt "Laufzeitfehler '1004': Anwendungsdefiniert oder objektdefiniert" Fehler beim Ausführen von Sub

enter image description here

Ich habe folgende VBA, die die Formel mit einer Verzögerung Pasten von 1 Sek.

Option Explicit 

Sub RetrieveDataDelay() 
'paste formulas into cells, then calculate, then delay rinse repeat 

    '========================= 
    'Declare Variables 
    '========================= 
     Dim i As Long 'used to loop 
     Dim rowCount As Long 
     Dim LastRow As Long 'used to find the last row 

    '========================= 
    'Setup for Speed 
    '========================= 
     Application.ScreenUpdating = False 
     Application.Calculation = xlCalculationManual 

    '========================= 
    'Define Variables 
    '========================= 
     LastRow = Worksheets(ActiveSheet.Name).Cells(Rows.Count, 1).End(xlUp).Row 'This will find the last used row in column A, change the number 1 to whatever column number you want 
     rowCount = 1 ' set to how many rows you want to do at a time 

    '========================= 
    'Do Work 
    '========================= 
     For i = 1 To LastRow Step rowCount 
      Range("B" & i, "B" & WorksheetFunction.Min(i + rowCount - 1, LastRow)).Formula = "'=IF(ISBLANK(A" & i & ");" & """" & """" & ";Dump(Volumes(A" & i & ";2528;1010;TRUE;" & "Volume" & ";TRUE)))" 'set the formula to whatever it needs to be 
       Calculate 
        Application.Wait (Now + TimeValue("00:00:01")) 'this delays 1 second 
     Next i 

    '========================= 
    'Setup for Speed - Reverse 
    '========================= 
     Application.ScreenUpdating = True 
     Application.Calculation = xlCalculationAutomatic 

End Sub 

Der Fehler tritt bei diesem Teil

Range("B" & i, "B" & WorksheetFunction.Min(i + rowCount - 1, LastRow)).Formula = "=IF(ISBLANK(A" & i & ");" & """" & """" & ";Dump(Volumes(A" & i & ";2528;1010;TRUE;" & "Volume" & ";TRUE)))" 

Die Fehler hat etwas mit der Formel zurückzuführen, die es nicht akzeptiert. Dies ist eine benutzerdefinierte Formel, die mit einer Excel-Erweiterung verwendet wird. Ich weiß, dass die Formel funktioniert, wie ich ein einfaches Anführungszeichen vor als solche setzen:

Range("B" & i, "B" & WorksheetFunction.Min(i + rowCount - 1, LastRow)).Formula = "'=IF(ISBLANK(A" & i & ");" & """" & """" & ";Dump(Volumes(A" & i & ";2528;1010;TRUE;" & "Volume" & ";TRUE)))" 

so dass es die formal buchstäblich Pasten. Wenn ich dann das Anführungszeichen aus der Formel entferne, funktioniert die Formel. Es bleibt also die Frage, warum es diese spezielle Formel in der VBA nicht akzeptiert.

Mit Excel 2013

Antwort

0

Range.Formula braucht die Formel Notation immer in en_us Format unabhängig von den aktuellen Locale-Einstellungen. Das bedeutet Funktionen in englischer Sprache und auch Komma als Trennzeichen zwischen Formelparametern und nicht Semikolon.

So

.Formula = "=IF(ISBLANK(A" & i & ")," & """" & """" & ",Dump(Volumes(A" & i & ",2528,1010,TRUE," & "Volume" & ",TRUE)))" 

Nach Range.Formula Einstellung werden die lokalen Einstellungen in dem Blatt dennoch aktiv sein. In diesem Fall wird die Formel mit einem Semikolon abgegrenzt.

Bt .: Die komplizierte String-Notation für doppelte Anführungszeichen ist nicht notwendig.

.Formula = "=IF(ISBLANK(A" & i & "),"""",Dump(Volumes(A" & i & ",2528,1010,TRUE," & "Volume" & ",TRUE)))" 
+0

Sie Sir, sind ein Held. Das hat funktioniert. Haben Sie eine Idee, warum diese VBA so langsam ist? Ich habe es gerade in 50 Zeilen getestet, es dauert fast 2 Minuten, wenn ich den VBA auf 1 Reihe hintereinander setze. Wenn ich auf 10 Zeilen setze, dann geschieht das in 46 Sekunden. Aber 10 Zeilen gleichzeitig sollten 5 Mal mit einer Verzögerung von einer Sekunde sein, also würde ich denken, dass dies unter 10 Sekunden wäre. – Dechesne

+0

Meiner Meinung nach. Die Geschwindigkeit wird hauptsächlich von der Zeit bestimmt, die 'Calculate' benötigt. Und das wird hauptsächlich von Ihrem 'UDF' 'Dump' bestimmt, der für mich unbekannt ist. Also ich weiß nicht, warum es langsam ist. Aber warum die 'For'-Schleife überhaupt? Warum nicht einfach 'Range (" B1: B "& LastRow) .Formula =" = IF (ISBLANK (A1), "" "", Dump (Volumes (A1,2528, 1010, TRUE, Volume, TRUE))) " 'und dann' Calculate' nur einmal? –