Befehlsverschachtelung

man grüße!

warum geht das nicht:

ich möchte nur eine schleife unterbrechen, mir das ergebniss anschauen und dann weitermachen.

wer weis rat?

es grüßt euch nikodemo…

Hallo,
+

warum geht das nicht:

Private Sub Nächste()
 CommandButton28\_Click()
 Dim i As Integer
 For i = 1 To 2
 Next i
 End Sub
End Sub

CommandButton28_Click() bedeutet:
Der Eventhandler soll den folgenden Code abarbeiten, wenn für den Commandbutton38 das Klick-Ereignis ausgelöst wird. Dazu muss das aber eine Prozedur sein und darf nicht in einer anderen Prozedur stehen.

ich möchte nur eine schleife unterbrechen, mir das ergebniss
anschauen und dann weitermachen.

wer weis rat?

Schreibe in Deine Zählschleife den Code zum unterbrechen.

Private Sub CommandButton28\_Click()
 Dim i As Integer
 For i = 1 To 2
 MsgBox i
 Next i
End Sub

Die MessageBox wird immer modal geöfnet, Dein Cod dadurch an dieser Stelle angehalten. Du kannst auch jede andere Form modal öffnen oder einfach in eine andere Prozedur verzweigen.

Gruß Rainer

Hallo,

oder hattest Du so etwas vor … ?

Private Sub CommandButton1\_Click()
 Static i As Integer
 i = i + 1
 If i \> 2 Then i = 1
 Cells(1, 1) = i
End Sub

Gruß Rainer

lieber rainer,

ich möchte mir alle geöffneten tabellen anzeige lassen.
aber nicht auf einen rutsch, sonder bei click die erste, nächster click die zweite usw.
wie mach ich das?
weist du bescheid?

danke im voraus

dein nikodemo
(vba-anfänger)

VBA - Tabelle auswählen …
Hallo,

ich möchte mir alle geöffneten tabellen anzeige lassen.
aber nicht auf einen rutsch, sonder bei click die erste,
nächster click die zweite usw.
wie mach ich das?
weist du bescheid?

nein, leider nicht. Ich kenne mit mit VB aus, mit Excel nicht.

Gruß Rainer

ich möchte mir alle geöffneten tabellen anzeige lassen.

Hallo Nikodemo,

das ist nicht eindeutig. Meinst du die Tabellenblätter einer Mappe oder das jeweils aktive Tabellenblatt mehrerer geöfnneter Mappen oder alle Tabellenblätter aller geöffneten Mappen?

Gruß
Reinhard

lieber reinhard,

die anzeige ist nicht wesentlich, was ich möchte ist, das ich eine schleife unterbrechen kann und bei klick wieder weiterlaufen lassen kann.
also ein cmdButton innerhalb einer schleife.
oder gibt es ein andere möglichkeit ausser einer msgbox?

gruß
dein nikodemo

Hallo Niko,

die anzeige ist nicht wesentlich, was ich möchte ist, das ich
eine schleife unterbrechen kann und bei klick wieder
weiterlaufen lassen kann.
also ein cmdButton innerhalb einer schleife.

soweit ich weiß kann man nicht innerhalb einer Schleife auf einen Klick warten.
Das würde ja so in etwa aussehen:

Sub tt()
Dim n
For n = 1 To 10
 While "CommandButton nicht gedrückt"
 Wend
 MsgBox n
Next n
End Sub

Denkbar wäre vielleicht als Alternative eine zeitschleife die alle x Sekunden etwas abprüft was von einem CommandButton durch Klick geändert wird.

oder gibt es ein andere möglichkeit ausser einer msgbox?

Eine Möglichkeit für was?

Gruß
Reinhard

lieber reinhard,
danke für deine antwort.

bei einer msgbox gibt es ja auch den button „“.
das programm läuft erst dann weiter, wenn ich den knopf gedrückt habe.
genau das möchte ich ohne aufruf einer msgbox.

cappuccino?

gruß
dein nikodem

Hallo Niko,

bei einer msgbox gibt es ja auch den button „“.

Kenne ich nicht.

das programm läuft erst dann weiter, wenn ich den knopf
gedrückt habe.
genau das möchte ich ohne aufruf einer msgbox.

Ich sehe da nur Chancen daß du auf den „knopf“ ein makro legst, was mittels einer Static-variablen was hochzählt/weiterschaltet.

cappuccino?

eher nicht :smile:

Gruß
Reinhard

aaaah!

ich rufe mit einem cmdbutton eine routine auf:

dabei ich möchte nur, das ich in einer schleife einen wert angezeigt bekomme und das das programm stehen bleibt bis ich das gelesen habe und dann möcht ich den selben knopf/button wieder drücken und dann soll das programm weiterlaufen und und mir den nächsten wert anzeigen, denn will ich mir dann anschauen und wenn ich ihn gelesen habe möchte ich meinen berühmten knopf/ button drücken und mir den nächsten wert anzeigen lassen, den will ich mir dann anschauen und…

ich will keine messagebox oder sonstwas sehen.

ich weis nicht mehr weiter…

es grüßt dich
nikodemo

Hallo NikoDemo,

mal abgesehen davon das dein Konzept so wie sich das liest, schlichtweg unter aller sau ist. Sorry für den Ausdruck. Aber ein Lösungsansatz waere folgender und das ganz ohne Schleife, die nur Ressourcen fressend waere …

Du klickst auf den Button. Der Tag Eigenschaft weisst du einen Wert zu, rufst eine Routine auf. Diese liest die Tag Eigenschaft aus und zeigt das Tabellenbaltt an. Beim naechsten Klick auf dem Button erhöhst du den Wert der Tag Eigenschaft und rufst erneut die Routine auf.

Dazu brauchst du nicht einmal eine Schleife :wink:

Unter VB würde das so ausschauen.

Private Sub Command1\_Click()
 Command1.Tag = CStr(CInt(Command1.Tag) + 1)
 Call ShowTable
End Sub

Private Sub Form\_Load()
 Command1.Tag = "0"
End Sub

Private Sub ShowTable()
 If CInt(Command1.Tag) = 0 Then Exit Sub
 'Hier kannst du nun deine Tabelle anzeigen
 'Mittels der Tag Eigenschaft weisst du welche Tabelle dran ist
 'zur Demo lassen wir uns den Tag Wert anzeigen
 MsgBox CInt(Command1.Tag)
End Sub

MfG Alex

warum nicht gleich so.

da muß ich mich erst zum deppen machen, damit ich eine lösung bekomme.
ich freue mich ja, wenn ich kompetente hilfe erhalte, zumal ich erst seit etwa einer woche ins vba reinschnuppere. wenn ich eine etwas hilflose, einfache frage stelle, dann nur, weil ich hoffe, dann wenigstens eine einfache antwort zu erhalten.
also was ein „tag“ ist, weis ich noch nicht, werds aber rausfinden.

nichts für ungut, es grüßt dich nikodemo

Hallo NikoDemo,

das man nicht alles weiss, verlangt auch keiner :smile:
Jeder hat einmal angefangen, und sein Wissen wird mit den angefertigten Projecten steigen. Du musst dir nur angewöhnen, sauber zu programmieren und dir keinen murks angewöhnen. Es ist dann schwer, eines Tages sich das abzugewöhnen.

Auch gibt es viele Wege die nach Rom führen, ergo auch beim programmieren. Du musst, wenn es ein grösseres Project wird, einen PAP (ProgrammAblaufPlan) erstellen. Aus diesem wird schon viel ersichtlich. Also wie man was machen sollte.

Aber nun noch einmal zurueck zum Prob.

Ein Button ist ein Object! Objecte wiederrum haben Eigenschaften und lösen Ereignisse aus. Desweiteren haben sie Methoden. Also Bsp. nehmen wir mal ein Auto. Da Auto ist das Object. Es hat Eigenschaften wie zum Bsp. den Typ , die Farbe, die Leistung etc. Auch hat es Methoden. Man kann zum Bsp. Gas geben, Hupen oder Bremsen! Nun kann das Auto auch Ereignisse auslösen. Zum Bsp. bremmst man, also wird das Auto langsamer. Beim programmieren wiederrum würde nun das Ereignis sagen wir mal SpeedChange(Speed as integer) ausgelöst werden :smile:

Nun zu dem Button. Er hat die Eigenschaft „Tag“ Dieser ist für nichts genaues gedacht. Dort kannst du Daten ablegen und diese bei Bedarf abfragen. Das haben wir uns zu nutze gemacht :wink: Sicher haette man auch eine Private oder globale Variable definieren können und diese abfragen, aber was nicht sein muss, muss nicht sein :wink:

Aber das Prinzip hast du verstanden ?

MfG Alex

jawohl, papi.
mein gezeigter code war nur vorschlag, um mein problem zu schildern, nicht zur verwendung geeignet.

gelobe aber besserung.

nikodemo, elektrotechniker, 62

:wink:

Elektrotechniker ? Welcome im Club :wink:

Hallo NikoDemo.

In VBA wirst Du die Tag-Eigenschaft nicht finden. Ein möglicher Code zum Durchlaufen von Arbeitsmappen wäre z.B.:

Deklaration einer Variablen im Deklarationsabschnitt eines Moduls, z.B. „Modul1“:

Public TempIndex As Long

Prozedur zum Durchlaufen, auch in „Modul1“:

Sub WindowHopper()

 If TempIndex + 1 \> Application.Windows.Count then
 TempIndex = 0
 End If
 TempIndex = TempIndex + 1
 Application.Windows(TempIndex).Activate

End Sub

Fehlt „nur noch“ die Schaltfläche, die die Prozedur aufruft.

Dieser Code löst keine Fehler aus und der TempIndex hat tatsächlich immer den Wert, den man auch erwarten würde. Trotzdem funktioniert das Umschalten zur nächsten Arbeitsmappe nicht wirklich korrekt.

VG
Carsten

Hallo Carsten,

In VBA wirst Du bei die Tag-Eigenschaft nicht finden.

Vba kennt schon die tag-Eigenschaft, aber nicht bei Commandbuttons.

Ein
möglicher Code zum Durchlaufen von Arbeitsmappen wäre z.B.:

Wenn ich Niko recht verstehe (was mir recht schwr bis gar nicht gelingt) gehts gar nicht um die Anzeige von Arbeitsmappenblättern sondern um X.

Fehlt „nur noch“ die Schaltfläche, die die Prozedur aufruft.

Ja, am besten wohl als Symbol oben in den Leisten.

Dieser Code löst keine Fehler aus und der TempIndex hat
tatsächlich immer den Wert, den man auch erwarten würde.
Trotzdem funktioniert das Umschalten zur nächsten Arbeitsmappe
nicht wirklich korrekt.

Was genau bedeutet „nicht wirklich korrekt“? Ich konnte da nichts feststellen was nicht klappt.

Btw. beim Testen wurde mir meine Personl.xls angezeigt, das will ich aber nicht, müßte man ggfs. noch im Code mitaufnehmen.

Und zu Windows(), ich benutze es nahezu nie und sehe es auch nahezu nie in Proficodes. Warum weiß ich nicht.

Gruß
Reinhard

Hallo Reinhard.

Wenn ich Niko recht verstehe (was mir recht schwr bis gar
nicht gelingt) gehts gar nicht um die Anzeige von
Arbeitsmappenblättern sondern um X.

Jetzt verstehe ich nicht. Was meinst Du mit X

Ja, am besten wohl als Symbol oben in den Leisten.

Jo

Was genau bedeutet „nicht wirklich korrekt“? Ich konnte da
nichts feststellen was nicht klappt.

Wenn ich die Prozedur ausführe, dann werden die Fenster nicht in der erwarteten Reihenfolge aufgerufen, sondern es gibt Sprünge und wenn TempIndex wieder 1 wird, bleibt das ohnehin aktive Fenster aktiv. Aber vielleicht ist ja auch diese Arbeitsmappe (Mappe1) korrupt, denn die verwende ich immer, wenn ich etwas ausprobieren will.

Und zu Windows(), ich benutze es nahezu nie und sehe es auch
nahezu nie in Proficodes. Warum weiß ich nicht.

Ich hab’s heute auch zum ersten Mal benutzt :smile:

VG
Carsten

Hallo Carsten,

nicht gelingt) gehts gar nicht um die Anzeige von
Arbeitsmappenblättern sondern um X.

Jetzt verstehe ich nicht. Was meinst Du mit X

Wikipedia sagt dazu u.a.:


Häufig werden mit „X“ auch besonders geheimnisvolle oder unerforschte
Dinge bezeichnet („X-Ray“ = Röntgenstrahlung, „X-Faktor“, „Terra X“,
„Generation X“, „X-Men“). Wahrscheinlich ist dies eine
Popularisierung der traditionellen mathematischen Verwendung als
Zeichen für Unbekanntes.

Was genau bedeutet „nicht wirklich korrekt“? Ich konnte da
nichts feststellen was nicht klappt.

Wenn ich die Prozedur ausführe, dann werden die Fenster nicht
in der erwarteten Reihenfolge aufgerufen, sondern es gibt
Sprünge und wenn TempIndex wieder 1 wird, bleibt das ohnehin
aktive Fenster aktiv.

Danke dir, vielleicht ist es dieses unberechenbare Verhalten warum man Windows() nicht so benutzt.

Aber vielleicht ist ja auch diese
Arbeitsmappe (Mappe1) korrupt, denn die verwende ich immer,
wenn ich etwas ausprobieren will.

Da bin ich überfragt woraus Excel die Anfangsmappe Mappe1.xls zusammensetzt.

Und zu korupten Mappen, sie entstehen halt weil Excel in der xls irgendwas falsch abspeichert. Letztlich ist das nur an sonderbarem Verhalten erkennbar.
Da kann man nur noch versuchen alle Module und auch alle Blätter in eine neue Mappe kopieren.

Gruß
Reinhard