Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1168to1172
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA ohne GoTo

VBA ohne GoTo
Peter
Hallo Excel-Experten,
ich suche eine Möglichkeit, die nachfolgende If-Sequenz ohne GoTo zu schreiben, komme jedoch immer nur zu einem endlosen Bandwurm an Abfragen.
Gibt es eine kurze, prägnante Variante?
For lZeile = 2 To lLetzte
          If sTyp  "" Then
            If .Range("C" & lZeile).Value  sTyp Then Goto Weiter
             Else
            End If
         If sRohdichte  "" Then
            If Val(.Range("D" & lZeile).Value)  Val(sRohdichte) Then Goto Weiter
             Else
            End If
         If sLaenge  "" Then
            If CDbl(.Range("F" & lZeile).Value)  CDbl(sLaenge) Then Goto Weiter
             Else
            End If
         If sBreite  "" Then
            If CDbl(.Range("G" & lZeile).Value)  CDbl(sBreite) Then Goto Weiter
             Else
            End If
         If sStaerke  "" Then
            If CDbl(.Range("H" & lZeile).Value)  CDbl(sStaerke) Then Goto Weiter
             Else
            End If
         If sKunde  "" Then
            If LCase(Trim(.Range("J" & lZeile).Value))  sKunde Then Goto Weiter
             Else
            End If
         If rZeile Is Nothing Then
            Set rZeile = .Rows(lZeile)
          Else
            Set rZeile = Union(rZeile, .Rows(lZeile))
         End If
Weiter:
      Next lZeile
Für eine tolle Lösung vielen Dank schon im vorraus.
Gruß Peter

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: VBA ohne GoTo
01.08.2010 16:01:42
Hajo_Zi
Halo Peter,
vielleicht so.
Option Explicit
Sub Peter()
Dim rzeile As Range
Dim lZeile As Long
Dim lLetzte As Long
Dim Styp As String
Dim sRohdichte As String
Dim sLaenge As String
Dim sBreite As String
Dim sStaerke As String
Dim SKunde As String
Dim BoZustand As Boolean
lLetzte = 123
With ActiveSheet
For lZeile = 2 To lLetzte
If Styp  "" Then
If .Range("C" & lZeile).Value  Styp Then BoZustand = True
End If
If sRohdichte  "" And BoZustand = False Then
If Val(.Range("D" & lZeile).Value)  Val(sRohdichte) Then BoZustand = True
End If
If sLaenge  "" And BoZustand = False Then
If CDbl(.Range("F" & lZeile).Value)  CDbl(sLaenge) Then BoZustand = True
End If
If sBreite  "" And BoZustand = False Then
If CDbl(.Range("G" & lZeile).Value)  CDbl(sBreite) Then BoZustand = True
End If
If sStaerke  "" And BoZustand = False Then
If CDbl(.Range("H" & lZeile).Value)  CDbl(sStaerke) Then BoZustand = True
End If
If SKunde  "" And BoZustand = False Then
If LCase(Trim(.Range("J" & lZeile).Value))  SKunde Then BoZustand = True
End If
If BoZustand = False Then
If rzeile Is Nothing Then
Set rzeile = .Rows(lZeile)
Else
Set rzeile = Union(rzeile, .Rows(lZeile))
End If
End If
Next lZeile
End With
Set rzeile = Nothing
End Sub

Anzeige
AW: VBA ohne GoTo
01.08.2010 16:07:37
Peter
Hallo Hajo,
Danke für Deine Lösung, sie gefällt mir schon wesentlich besser als meine GoTos.
Gruß Peter
VBA mit GoTo
01.08.2010 16:11:48
Anton
Hallo Peter,
so vllt:
Code:

For lZeile = 2 To lLetzte  
  If sTyp <> "" Then If .Range("C" & lZeile).Value <> sTyp Then GoTo weiter    
  If sRohdichte <> "" Then If Val(.Range("D" & lZeile).Value) <> Val(sRohdichte) Then GoTo weiter    
  If sLaenge <> "" Then If CDbl(.Range("F" & lZeile).Value) <> CDbl(sLaenge) Then GoTo weiter    
  If sBreite <> "" Then If CDbl(.Range("G" & lZeile).Value) <> CDbl(sBreite) Then GoTo weiter    
  If sStaerke <> "" Then If CDbl(.Range("H" & lZeile).Value) <> CDbl(sStaerke) Then GoTo weiter    
  If sKunde <> "" Then If LCase(Trim(.Range("J" & lZeile).Value)) <> sKunde Then GoTo weiter      
  If rZeile Is Nothing Then    
    Set rZeile = .Rows(lZeile)
  Else
    Set rZeile = Union(rZeile, .Rows(lZeile))
  End If  
weiter:
Next lZeile


mfg Anton
Anzeige
AW: VBA mit GoTo
01.08.2010 16:15:52
Peter
Hallo Anton,
danke für Deine Anteilnahme, aber mein Anliegen ist es ja gerade OHNE die GoTo und die Sprungadresse auszukommen.
Gruß Peter
AW: VBA ohne GoTo
01.08.2010 17:26:26
Gerd
Hallo Peter!
Dim blnNO As Boolean, arr1, arr2, arr3, intIndex As Integer
arr1 = Array(sTyp, sRohdichte, sLaenge, sBreite, sStaerke, sKunde)
arr3 = Array(sTyp, Val(sRohdichte), CDbl(sLaenge), CDbl(sBreite), CDbl(sStaerke), sKunde)
For lZeile = 2 To lLetzte
blnNO = False
arr2 = Array(.Range("C" & lZeile).Value, Val(.Range("D" & lZeile).Value), CDbl(.Range("F" & lZeile).Value), _
CDbl(.Range("G" & lZeile).Value), CDbl(.Range("H" & lZeile).Value), LCase(Trim(.Range("J" & lZeile).Value)))
For intIndex = LBound(arr1) To UBound(arr1)
If arr1(intIndex) "" Then If arr2(intIndex) arr3(intIndex) Then blnNO = True: Exit For
Next
If blnNO = False Then
If rZeile Is Nothing Then
Set rZeile = .Rows(lZeile)
Else
Set rZeile = Union(rZeile, .Rows(lZeile))
End If
End If
Next lZeile
Gruß Gerd
Anzeige
AW: VBA ohne GoTo
01.08.2010 22:23:07
Peter
Hallo Gerd,
danke für Deine interessante Lösung, die ich erstmal in Ruhe testen und verstehen muss.
Zur Zeit bricht sie mir ab, wenn ich nicht alle Felder (die aus ComboBoxes kommen) gefüllt habe.
Gruß Peter
AW: VBA ohne GoTo
02.08.2010 06:52:25
Gerd
Guten Morgen Peter,
das kann sein. Ich habe wegen der umfangreichen Struktur nicht nachgebaut u. nicht getestet.
Die Schleife vielleicht besser so:
For intIndex = LBound(arr1) To UBound(arr1)
If arr1(intIndex) "" Then
If arr2(intIndex) arr3(intIndex) Then
blnNO = True: Exit For
End If
End If
Next
oder so:
For intIndex = LBound(arr1) To UBound(arr1)
If arr1(intIndex) "" Then If arr2(intIndex) arr3(intIndex) Then blnNO = True
If blnNO = True Then Exit For
Next
Gruß Gerd
Anzeige
AW: VBA ohne GoTo
02.08.2010 14:33:46
Peter
Hallo Gerd,
das Problem trat schon beim Befüllen von Arr3 auf, wenn die Felder durch die ComboBoxes mit "LEER" bzw. nicht gefüllt worden sind. Dann war die Konvertierung mit CDbl ein Problem.
Jetzt fülle ich die Variablen, wenn in der ComboBox nichts ausgewählt wurde mit 0 und frage zusätzlich
If vArr1(intIndex) "" And vArr3(intIndex) 0 Then
dann funktioniert Dein Makro hervorragend.
Danke also noch einmal!
Gruß Peter

122 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige