2016-04-14 4 views
0

Ich habe einen einfachen Code, der sehr lange braucht. Ich habe mich gefragt, ob es irgendeinen Weg gibt, diesen Lauf schneller zu machen? Vielleicht sollte dieser Teil (Cells (i, "U"). Wert = Cells (n, "X"). Wert) sollte nicht 2 Mal verwendet werden! Vielen Dank!iF Dann Else-Code - wie macht man das schneller? VBA

For n = 3 To time_frame + 3 
For i = 3 To 1002 

If (Cells(i, "U").Value = Cells(n, "X").Value) And (Bed_in_use < 24) And Wait_L > 0 Then 
Wait_L = Wait_L - (24 - Bed_in_use) 
ElseIf (Cells(i, "U").Value = Cells(n, "X").Value) And (Bed_in_use < 24) And Wait_L <= 0 Then 
Bed_in_use = Bed_in_use + 1 
End If 
Next i 
Next n 

MsgBox "The number of bed in use is " & Bed_in_use & ". There are " & Wait_L & " patients in the waiting list." 

End Sub 
+0

Sie könnten ein Array der Werte in Zeilen "U" und "X" dann vergleichen Sie die Werte des Arrays anstatt die Zellen. – jcarroll

+0

@jcarroll OK können Sie bitte lassen Sie mich wissen, wie ich Array des Wertes erstellen kann. Vielen Dank. – Zapata

Antwort

0

Ich bin nicht ganz sicher, was Ihr Code versucht zu tun. Aber hier ist ein Beispiel, wie Sie zwei Listen vergleichen und die Gesamttreffer verfolgen können.

Sub test() 

    Dim arrayU() As Variant 
    Dim arrayX() As Variant 

    Dim LrowU As Integer 
    Dim LrowX As Integer 

    Dim i As Integer 
    Dim j As Integer 

    Dim bed_in_use As Integer 

    LrowU = Columns(21).Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 
    LrowX = Columns(24).Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 

    ReDim arrayU(1 To LrowU) 
    ReDim arrayX(1 To LrowX) 

    For i = 1 To LrowU 
     arrayU(i) = Cells(i, 21) 
    Next i 

    i = 1 

    For i = 1 To LrowX 
     arrayX(i) = Cells(i, 24) 
    Next i 

    i = 1 
    j = 1 

    For i = 1 To LrowX 
     For j = 1 To LrowU 
      If arrayX(i) = arrayU(j) Then bed_in_use = bed_in_use + 1 
     Next j 
    Next i 

    MsgBox (bed_in_use) 

End Sub 
2

Paar Dinge wird dies beschleunigen - Das erste in den Kommentaren von @jcarroll erwähnt wurde, die Zellen, die Sie in ein Array benötigen ziehen und mit, dass anstelle von wiederholten Aufrufen von Cells machen.

Die zweite ist, was Sie erwähnt haben, Strukturieren Sie Ihre If Aussagen in einer Weise, dass Sie nicht die gleichen Vergleiche zweimal machen. Zum Beispiel hat dies für entweder Bedingung wahr zu sein ...

Cells(i, "U").Value = Cells(n, "X").Value 

... und diese immer hat um wahr zu sein:

Bed_in_use < 24 

Nach Bed_in_use ist 24 (oder höher), können Sie die Schleife verlassen, weil Sie weder die If noch die ElseIf Aussage erfüllen werden. Ich würde es in etwas in dieser Art wiederholen:

Dim values() As Variant 
values = ActiveSheet.UsedRange '...or whatever Range you need. 

For n = 3 To time_frame + 3 
    If Bed_in_use >= 24 Then Exit For 
    For i = 3 To 1002 
     If Bed_in_use >= 24 Then Exit For 
     If values(i, 21).Value = values(n, 24).Value Then 
      If Wait_L > 0 Then 
       Wait_L = Wait_L - (24 - Bed_in_use) 
      Else 
       Bed_in_use = Bed_in_use + 1 
      End If 
     End If 
    Next i 
Next n 
+0

Es ist großartig! Aber wie wäre es mit "gehe zur Linie ..." anstatt "dann exit for" zu benutzen? Dann kann ich Statment für Bed_in_use <24 hinzufügen? – Zapata

+0

@Hamidkh - Ich würde kein Goto verwenden. Wenn Sie "Bed_in_use <24" ersetzen müssen, ersetzen Sie es einfach durch eine andere Bedingung oder einen Funktionsaufruf. – Comintern