Microsoft Excel

Herbers Excel/VBA-Archiv

Sytanx zur ForNext-Schleife | Herbers Excel-Forum


Betrifft: Sytanx zur ForNext-Schleife von: Jörg-HH
Geschrieben am: 08.12.2009 20:16:16

Guten Abend zusammen,

habe einen Knoten mit der richtigen Schreibweise...

In einem Blattcode steht:

If Target.Address = Range("Hilfszelle2").Address Then
  Call machwas2
End If

If Target.Address = Range("Hilfszelle3").Address Then
  Call machwas3
End If
usw... bis 5

in einem Modul steht:
Sub machwas2()
   diesunddas
End Sub

Sub machwas3()
   diesunddas
End Sub
usw... bis 5

Wenn ich versuche, das in eine Form zu stecken nach dem Prinzip
For i = 2 to 5
If Target.Address = Range("Hilfszelle" & i).Address Then
  Call machwas & i
End If
next
wird immer die call-Zeile bemeckert, egal ob ich da was mit Tüddelchen oder ohne schreibe. Woran liegt das, und wie muß es richtig heißen?

Grüße - Jörg

  

Betrifft: AW: Sytanx zur ForNext-Schleife von: Daniel
Geschrieben am: 08.12.2009 20:44:25

Hi

so geht das in diesem Fall nicht.
über Call kannst du das Makro nur direkt aufrufen.
wenn der Makroname aus einzelnen Textbestandteilen zusammengesetz wird dann so:

Application.Run "machwas" & i

Gruß Daniel


  

Betrifft: uppps... von: Jörg-HH
Geschrieben am: 08.12.2009 21:45:19

Hallo Ihr zwei
hab erstmal Daniels Variante probiert, weil sie in der Reihenfolge "obenauf lag" - das läuft ja wie geschmiert und veranlaßt mich zu einer weiteren Frage:

Die verschiedenen Subs unterscheiden sich in ihren Einzelheiten auch nur durch Zellnamen mit Indizes (als die entstanden, hatte ich noch Null Ahnung von VBA) - also etwa so:

Sub machwas2()
   Range("diesunddas2).ClearContents
End Sub

Sub machwas3()
   Range("diesunddas3).ClearContents
End Sub
usw, es werden da immer Zellen angesprochen, die nebeneinander liegen. Könnte ich das vereinfachen ungefähr so
Sub machwas i()
   Range("diesunddas" & i).ClearContents
End Sub

??
Jörg


  

Betrifft: AW: uppps... von: Ramses
Geschrieben am: 08.12.2009 21:53:01

Hallo

Fast richtig

Sub machwas (i as Variant)
   Range("diesunddas" & i).ClearContents
End Sub
Der Aufruf erfolgt dann so
Sub demo()
Machwas 5
End Sub
Gruss Rainer


  

Betrifft: AW: i as Integer reicht o.T. von: Gerd L
Geschrieben am: 08.12.2009 22:04:01

Gruß Gerd


  

Betrifft: i as String und Machwas "5" oT. von: Tino
Geschrieben am: 08.12.2009 22:11:38




  

Betrifft: Flexibility heisst das Zauberwort :-) o.w.T. von: Ramses
Geschrieben am: 08.12.2009 22:28:23

...


  

Betrifft: wann call, wann nicht...? von: Jörg-HH
Geschrieben am: 08.12.2009 22:47:44

Jungs - ich bin begeistert...!!! Jetzt kann ich einige hundert Zeilen Code löschen :-)))

Kann mir noch jemand erklären, warum ich in dem einen Fall

Call Machwas5 schreiben muß, im anderen aber

Machwas 5 (ohne Call, aber mit Leerschritt)??

Danke und schönen Abend!

Jörg


  

Betrifft: AW: wann call, wann nicht...? von: Gerd L
Geschrieben am: 08.12.2009 23:26:25

Hallo Jörg,

in Peter 's Beispiel wird selektiv eines von vier verschiedenen Makros aufgerufen,
die Ziffer ist Bestandteil des/der aufgerufenen Makro/s.

In Rainer 's Code wird - unterstellt den Aufruf in einer Schleife platziert- stets das selbe
Makro aufgerufen u. hierbei die Ziffer als Argument übergeben, deshalb die Leerstelle.
Diesem Aufruf könntest Du ebenfalls ein Call voranstellen, müsstest dann das Argument
in Klammern setzen: Call Machwas (5) oder Call Machwas (Cstr(i))

In Peter 's Code könntest Du Call auch weglassen.

Die Notation von Call dient im Wesentlichen der besseren Lesbarkeit des des Codes,
konkret der Unterscheidung der Prozeduraufrufe von Variablen u. Konstanten.

Gruß Gerd


  

Betrifft: ...(Cstr(i)) war das i-Tüpfelchen... von: Jörg-HH
Geschrieben am: 09.12.2009 11:38:37

Moin Gerd

das war nun noch das Sahnehäubchen... ich finde die langen VBA-Lehrjahre ja immer wieder spannend.

Ich habe zig Abschnitte in meinem Kram, wo immer acht ellenlange gleiche Codes hintereinander stehen, die sich nur durch einen Index unterscheiden, und ich dachte mir immer, es muß doch funktionieren, daß man den Ablaufcode variabel hält und den Aufruf noch dazu. Was immer das (Cstr(i)) auch bedeuten mag - das scheint mir jetzt der Anschub zu sein, mit dem ich meinen ganzen Code durchackern und seitenweise überflüssige Abschnitte löschen kann.

Danke euch allen für die Nachhilfe :-)

Jörg


  

Betrifft: AW: Sytanx zur ForNext-Schleife von: Peter Feustel
Geschrieben am: 08.12.2009 20:58:03

Hallo Jörg,

so könnte es laufen:
Option Explicit

Public Sub Aufruf()

Dim iIndx  As Integer

   For iIndx = 2 To 5
      If Target.Address = Range("Hilfszelle" & iIndx).Address Then
         Select Case iIndx
            Case 2: Call Machwas2
            Case 3: Call Machwas3
            Case 4: Call Machwas4
            Case 5: Call Machwas5
         End Select
      End If
   Next iIndx

End Sub

Gruß Peter