Microsoft Excel

Herbers Excel/VBA-Archiv

VBA kürzer damit Makro schneller wird

Betrifft: VBA kürzer damit Makro schneller wird von: mehmet
Geschrieben am: 06.11.2014 00:45:34

Hallo Forum,
wie könnte man das Makro mit Schleife verkürzen:

Sheets("OL_test_OneLeg3d").Range("g3") = "=IF(n3="""","""",IF(n3=""- "","""",IF(IF(n3=""- "","""",MOD(m3-n3,1))<IF(n3=""- "","""",MOD(n3-m3,1)),"" - "","" + "")))"
Sheets("OL_test_OneLeg3d").Range("g4") = "=IF(n4="""","""",IF(n4=""- "","""",IF(IF(n4=""- "","""",MOD(m4-n4,1))<IF(n4=""- "","""",MOD(n4-m4,1)),"" - "","" + "")))"
Sheets("OL_test_OneLeg3d").Range("g5") = "=IF(n5="""","""",IF(n5=""- "","""",IF(IF(n5=""- "","""",MOD(m5-n5,1))<IF(n5=""- "","""",MOD(n5-m5,1)),"" - "","" + "")))"
Sheets("OL_test_OneLeg3d").Range("g6") = "=IF(n6="""","""",IF(n6=""- "","""",IF(IF(n6=""- "","""",MOD(m6-n6,1))<IF(n6=""- "","""",MOD(n6-m6,1)),"" - "","" + "")))"
Sheets("OL_test_OneLeg3d").Range("g7") = "=IF(n7="""","""",IF(n7=""- "","""",IF(IF(n7=""- "","""",MOD(m7-n7,1))<IF(n7=""- "","""",MOD(n7-m7,1)),"" - "","" + "")))"
Sheets("OL_test_OneLeg3d").Range("g8") = "=IF(n8="""","""",IF(n8=""- "","""",IF(IF(n8=""- "","""",MOD(m8-n8,1))<IF(n8=""- "","""",MOD(n8-m8,1)),"" - "","" + "")))"
Sheets("OL_test_OneLeg3d").Range("g9") = "=IF(n9="""","""",IF(n9=""- "","""",IF(IF(n9=""- "","""",MOD(m9-n9,1))<IF(n9=""- "","""",MOD(n9-m9,1)),"" - "","" + "")))"

Meine Laufvariable von oben nach unten heisst eigendlich "k"
Ich kriege es nicht hin in die Formel einzubinden.

herzlichen Dank
Gruss
mehmet

  

Betrifft: AW: VBA kürzer damit Makro schneller wird von: Daniel
Geschrieben am: 06.11.2014 01:00:47

HI

kannst du so verkürzen:

Sheets("OL_test_OneLeg3d").Range("g3:g9").formula = "=IF(n3="""","""",IF(n3=""- "","""",IF(IF(n3=""- "","""",MOD(m3-n3,1))<IF(n3=""- "","""",MOD(n3-m3,1)),"" - "","" + "")))"

Schleife brauchst du nicht, du kannst die Formel - wenn sie mit Copy-Paste von der ersten in die anderen Zellen übertragbar wäre - auch in alle Zellen gleichzeitig schreiben.
Excel macht das dann mit den relativen und absoluten Zellbezügen schon richtig.

Gruß Daniel


  

Betrifft: AW: VBA kürzer damit Makro schneller wird von: mehmet
Geschrieben am: 06.11.2014 11:00:42

Dank dir Daniel,
wusste nicht, dass es so geht. Läuft jetzt auch schneller.
Wie könnte man die folgende Formel verkürzen
Diesmal ist eine IF Abfrage pro Formel:


'ATA +/-
If Sheets("OL_test_OneLeg3d").Range("g3") = "" Then
Sheets("OL_test_OneLeg3d").Range("g3") = "=IF(o3="""","""",IF(o3=""- "","""",IF(IF(o3=""- "","""",MOD(m3-o3,1))<IF(o3=""- "","""",MOD(o3-m3,1)),"" - "","" + "")))"
End If
If Sheets("OL_test_OneLeg3d").Range("g4") = "" Then
Sheets("OL_test_OneLeg3d").Range("g4") = "=IF(o4="""","""",IF(o4=""- "","""",IF(IF(o4=""- "","""",MOD(m4-o4,1))<IF(o4=""- "","""",MOD(o4-m4,1)),"" - "","" + "")))"
End If
If Sheets("OL_test_OneLeg3d").Range("g5") = "" Then
Sheets("OL_test_OneLeg3d").Range("g5") = "=IF(o5="""","""",IF(o5=""- "","""",IF(IF(o5=""- "","""",MOD(m5-o5,1))<IF(o5=""- "","""",MOD(o5-m5,1)),"" - "","" + "")))"
End If
If Sheets("OL_test_OneLeg3d").Range("g6") = "" Then
Sheets("OL_test_OneLeg3d").Range("g6") = "=IF(o6="""","""",IF(o6=""- "","""",IF(IF(o6=""- "","""",MOD(m6-o6,1))<IF(o6=""- "","""",MOD(o6-m6,1)),"" - "","" + "")))"
End If
If Sheets("OL_test_OneLeg3d").Range("g7") = "" Then
Sheets("OL_test_OneLeg3d").Range("g7") = "=IF(o7="""","""",IF(o7=""- "","""",IF(IF(o7=""- "","""",MOD(m7-o7,1))<IF(o7=""- "","""",MOD(o7-m7,1)),"" - "","" + "")))"
End If
If Sheets("OL_test_OneLeg3d").Range("g8") = "" Then
Sheets("OL_test_OneLeg3d").Range("g8") = "=IF(o8="""","""",IF(o8=""- "","""",IF(IF(o8=""- "","""",MOD(m8-o8,1))<IF(o8=""- "","""",MOD(o8-m8,1)),"" - "","" + "")))"
End If
If Sheets("OL_test_OneLeg3d").Range("g9") = "" Then
Sheets("OL_test_OneLeg3d").Range("g9") = "=IF(o9="""","""",IF(o9=""- "","""",IF(IF(o9=""- "","""",MOD(m9-o9,1))<IF(o9=""- "","""",MOD(o9-m9,1)),"" - "","" + "")))"
End If


Wenn ich es so mache:

If Sheets("OL_test_OneLeg3d").Range("g3:g30") = "" Then
Sheets("OL_test_OneLeg3d").Range("g3:g30") = "=IF(o3="""","""",IF(o3=""- "","""",IF(IF(o3=""- "","""",MOD(m3-o3,1))<IF(o3=""- "","""",MOD(o3-m3,1)),"" - "","" + "")))"
End If

Bekomme ich Fehlermeldung: Typen unverträglich.

Wenn so:

If Sheets("OL_test_OneLeg3d").Range("g3:g30") = "" Then
Sheets("OL_test_OneLeg3d").Range("g3:g30") = "=IF(o3="""","""",IF(o3=""- "","""",IF(IF(o3=""- "","""",MOD(m3-o3,1))<IF(o3=""- "","""",MOD(o3-m3,1)),"" - "","" + "")))"
End If

wird die vorherige Formel überschrieben.


Dank Dir
Gruss
mehmet


  

Betrifft: AW: VBA kürzer damit Makro schneller wird von: Daniel
Geschrieben am: 06.11.2014 12:36:52

HI
IF-Abfrage ist schwierig.
Wenn die Formel nur bei bestimmten Bedingungen eingetragen werden soll, dann brauchst du in den meisten Fällen tatsächlich eine Schleife, denn du kannst nicht alle Zellen gleichzeitig abfragen.
ausserdm solltest du die R1C1-Schreibweise für die Formeln verwenden.
Das erspart dir den Aufwand, die Formel in jeder Zeile neu verfassen zu müssen, weil du die relativen Zellbezüge besser beschreiben kannst.
In der R1C1-Schreibweise haben alle Zellen, deren Formel per Copy-Paste übertragbar ist, auch tatsächlich genau den selben Textstring als Formel:

For i = 3 to 9
    With Sheets("OL_test_OneLeg3d").Cells(i, 7)
       if .Value = "" Then .FormulaR1C1 = "=Hier der Formeltext in R1C1"
    end With
Next
leider verhindert der Editor die Korrekte Darstellung.
Ersezte in deiner Formel den Bezug "n3" durch "RC14" und "m3" durch "RC13"
das R steht für "Zeile", weils ein Zellbezug auf die selbe Zeile ist lässt man sie weg
nach dem C steht die Spaltennummer.
Damit steht dann in jeder Zelle dieselbe Formel und du kannst einfach mit einer Schleife arbeiten.
Aus diesem Grund ist die R1C1-Schreibweise für Formeln in VBA oft die besser. Ausserdem zeichnet der Recorder sie auch so auf.

Gruß Daniel


  

Betrifft: AW: VBA kürzer damit Makro schneller wird von: mehmet
Geschrieben am: 07.11.2014 01:26:24

Hallo Daniel,
ich verstehe nicht wie du es meinst:

'ETA +/-
Sheets("OL_test_OneLeg3d").Range("g3:g30") = _
"=IF(n3="""","""",IF(n3=""- "","""",IF(IF(n3=""- "","""",MOD(m3-n3,1))<IF(n3=""- "","""",MOD(n3-m3,1)),"" - "","" + "")))"

'ETA DLY
Sheets("OL_test_OneLeg3d").Range("h3:h30") = "=IF(n3=""- "","""",TEXT(IF(IF(n3=""- "","""",MOD(m3-n3,1))<IF(n3=""- "","""",MOD(n3-m3,1)),IF(n3=""- "","""",MOD(m3-n3,1)),IF(n3=""- "","""",MOD(n3-m3,1))),""hh:mm""))"

'ATA +/-
For i = 3 to 9
With Sheets("OL_test_OneLeg3d").Cells(i, 7)
if .Value = "" Then .FormulaR1C1 = "=Hier der Formeltext in R1C1"
end With
Next

Das mit dem Web Editor kann man mit ~f~ ergänzen.
Kann Du mir mal zeigen wie Du es meinst.
Dank Dir
Gruss
mehmet


  

Betrifft: AW: VBA kürzer damit Makro schneller wird von: daniel
Geschrieben am: 08.11.2014 10:21:47

Hi
Schreibe die Formel mal von Hand in die Zelle und zeichne mit dem Recorder auf.
Schaue dir dann die Formelschreibweise an, die der Recorder verwendet.
Gruß Daniel


  

Betrifft: AW: VBA kürzer damit Makro schneller wird von: mehmet
Geschrieben am: 08.11.2014 22:44:38

Hallo Daniel,
habe aufgezeichnet:


Range("G3").Select
ActiveCell.FormulaR1C1 = _
"=IF(RC[8]="""","""",IF(RC[8]=""- "","""",IF(IF(RC[8]=""- "","""",MOD(RC[6]-RC[8],1))<IF(RC[8]=""- "","""",MOD(RC[8]-RC[6],1)),"" - "","" + "")))"
Range("G3").Select
Selection.AutoFill Destination:=Range("G3:G30"), Type:=xlFillDefault
Range("G3:G30").Select
Range("G11").Select



und so eingefuegt:

'ATA +/-
'Aufzeichnung: =IF(RC[8]="""","""",IF(RC[8]=""- "","""",IF(IF(RC[8]=""- "","""",MOD(RC[6]-RC[8],1))<IF(RC[8]=""- "","""",MOD(RC[8]-RC[6],1)),"" - "","" + "")))
For iATA = 3 To 30
With Sheets("OL_test_OneLeg3d").Cells(iATA, 7)
If .Value = "" Then .FormulaR1C1 = "=IF(RC[8]="""","""",IF(RC[8]=""- "","""",IF(IF(RC[8]=""- "","""",MOD(RC[6]-RC[8],1))<IF(RC[8]=""- "","""",MOD(RC[8]-RC[6],1)),"" - "","" + "")))"
End With
Next iATA


sieht aus als würde es klappen
Bekomme keine Fehler Meldung und die Formeln sind dann auch so drin wie es sein sollte

Vielen vielen Dank für deine Hilfe und Geduld


Gruss
mehmet


  

Betrifft: AW: VBA kürzer damit Makro schneller wird von: Rudi Maintaire
Geschrieben am: 06.11.2014 13:00:04

Hallo,
wenn die Zellen wirklich leer sind:

Sheets("OL_test_OneLeg3d").Range("g3:g30").Specialcells(xlCellTypeBlanks).formular1c1 = _
"=IF(rc15="""","""",IF(rc15=""- "","""",IF(IF(rc15=""- "","""",MOD(rc13-rc15,1))
Gruß
Rudi


  

Betrifft: AW: VBA kürzer damit Makro schneller wird von: mehmet
Geschrieben am: 07.11.2014 01:31:53

Hallo Rudi,
vielen Dank für Deine Interesse.
Nein, die Zellen sind nicht leer. Zellen beinhalten auch Formel.
Diese sollen aber überschrieben werden, wenn diese vorher nicht zugetroffen haben.
Gruss
mehmet