Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1920to1924
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

Metronom

Metronom
14.03.2023 16:07:58
Antonio
Hallo liebe Gemeinde,
Das Synkronlaufen der zwei Listbox funz gut, und während das Makro "Metronom
läuft, wird mir in einen Label der aktulle Akkord gezeigt.
https://www.herber.de/bbs/user/158256.xlsm
Das Problem den ich habe ist das beim starten des Makro, starten auch die Listbox.
Meine Frage an euch, was ich noch nicht schaffe ist:
Wie kann ich ein Leerlauf des Makro erreichen, sagen wir so, von 1....4 zählen, das heißt eine Art Auftakt,
dann sollen auf das nächste 1 die Listbox starten, so :
Start, Label1: 1,2,3,4
beim nächste 1
Listbox laufen.
Ich habe bis jetzt mit:
Application.Time.Now + Time(00:00:03) und mit
Sleep 3000 probiert aber ohne Erfolg.
Ich hoffe Ihr versteht was ich meine, wenn nicht bitte nachfragen.
LG Antonio

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Metronom
14.03.2023 17:43:44
Mathias
Hallo Antonio,
In deiner Methode "Metronom" startest du eine Schleife, die all die arbeit macht, mit:
Do While ToggleButton1.Value = True
Ich würde vor dieser Schleife eine weitere Schleife bauen.
For i = 1 to 4
Label1.Caption = cstr(i)
Sleep 1000
Next
Dann Zählt das Label im Sekunden Takt von eins bis vier und dann startet deine Schleife und macht die Arbeit.
Natürlich musst die die Zeit so anpassen, dass sie in dein Takt passt und auch evtl. noch exit möglichkeiten einbauen wie: if togglebutton not true anymore then abort counter
Aber das scheinst ja schon selbst zu können.
Liebe Grüße
Mathias
Anzeige
AW: Metronom
14.03.2023 17:54:44
Antonio
Hallo Mathias,
danke für die Rückmeldung,
Das "Sleep" Funktion hatte schon, da läuft aber nichts bis die Zeit abgelaufen ist,
ich möchte gerne das im Label 1 die Zählung bis 4 schon stattfindet,
erst beim zweiten 1 sollen die Listbox mitlaufen
Ich hoffe das es deutlich ist wes ich meine.
LG Antonio
AW: Metronom
14.03.2023 20:07:49
Mathias
Hey Antonio,
das ist mir klar. Mein Code sollte dahingehend auch funktionieren.
Wie du richtig erkannt hast, macht das Programm nichts mehr, wärend es die Sleepzeit abwartet.
Wenn du also die Sleepzeit vier Takte/Sekunden lang machst, dann kannst du das Label wärend der Wartezeit nicht ändern.
Deswegen verwende ich eine Schleife die vier mal durchläuft. Sie wartet nur einen Takt/Sekunde ab und ändert dann das Label und wartet dann den nächsten Takt/Sekunde und ändert das Label wieder. Die Sleep Zeit sollte dann natürlich 1 Takt lang sein. Da ich von Musik keine Ahnung habe, habe ich erstmal eine Sekunde benutzt.
Liebe Grüße
Mathias
Anzeige
AW: Metronom
15.03.2023 07:36:16
Antonio
Hi Mathias,
dein Code funktioniert ja auch, habe nur gedacht das ein "Leerlauf" möglich wäre,
wie bei einen Konzert, wo der Schlagzeug den Takt vor gibt, dann kommt die Musik.
Ich werde versuchen die Sleepzeit im Modul "Call ListBox_Scroll einzubauen.
wenn nicht anders geht, muss ich damit leben.
Eine Frage hätte ich noch, kannst du mir sagen warum das Label manchmal
mir die Akkorde zeigt und manchmal nicht?
Finde kein Fehler im Code.
LG Antonio
AW: Metronom
15.03.2023 11:20:34
Mathias
Hey Antonio,
das ist natürlich auch möglich.
Die Schleife vor deiner Schleife war auf die schnelle nur die einfachste Lösung.
Du kannst eine boolsche Variable erstellen, die nach dem start FALSE angibt.
Dann machst du für die Befehle die in der ersten Runde unterdrückt werden sollen ein WENN Statement.
Wenn TRUE dann wird der Befehlt ausgeführt.
Somit werden die Befehle nicht aufgeführt.
Wenn dann das Label das erste mal wieder auf 1 gesetzt wird, setzt du die Variable auf TRUE.
Dann werden alle Befehle ausgeführt.
Liebe Güße
Mathias
Anzeige
AW: Metronom
15.03.2023 11:42:19
Antonio
Hi Matthias,
das ist eine gute Idee, werde versuchen umzusetzen,
ich Danke Dir zunächst.
LG Antonio
AW: Alternativ
15.03.2023 12:18:43
Antonio
Hi Matthias,
komme mit der "b" nicht klar, wenn ich die Boolean richtig gesetz habe (?) dann passiert nichts.
Sub Metronom()
Dim b As Boolean
BeatCount = 0
b = False
'Call labelBlink
If b = False Then
Do While ToggleButton1.Value = True
    BpM = TextBox1.Value
    Beginn = Timer()
    Delay = 0
    If ToggleButton2.Value = True Then Takt = 2
    If ToggleButton3.Value = True Then Takt = 3
    If ToggleButton4.Value = True Then Takt = 4
    If ToggleButton5.Value = True Then Delay = TextBox2.Value
    If Ende  Beginn Then
    Ende = Beginn + 120 / BpM + Delay / 1000
    
    Label1.Caption = 1 + BeatCount Mod Takt
    If BeatCount Mod Takt = 0 Then Label1.BackColor = vbGreen Else Label1.BackColor = vbWhite
    Tonfrequenz = Int(333 + 111 * ((1 + BeatCount Mod Takt) / Takt))
    Call Beep(Tonfrequenz)
    
    BeatCount = BeatCount + 1
    
    If Label1.Caption = 1 Then
    b = True
    Call ListBox_Scroll
    End If
    End If
    If ToggleButton1.Value = False Then End
DoEvents
DoEvents
Loop
End If
ListBox1.ListIndex = -1
ListBox7.ListIndex = -1
Label1.Caption = 0
End Sub
ansonsten mache ich mit dem Call labelBlink weiter:
Sub labelBlink()
 Dim a As Integer
    For a = 1 To 8
     If a Mod 2 = 1 Then
      Me.Label1.BackColor = vbRed           'Blinkfarbe
      Else
      Me.Label1.BackColor = &H8000000F         'Standard
     End If
    DoEvents
    Sleep 500
    Next a
End Sub
LG Antoniio
Anzeige
AW: Alternativ
15.03.2023 13:15:40
Antonio
Hi Matthias,
es haben zwei Zeilen vor meiner Schleife gereicht:
Sub Metronom()
BeatCount = 0
Call Beep(Tonfrequenz)                   --------
BeatCount = BeatCount + 1            --------
Do While ToggleButton1.Value = True
Aber.....
der Label zeigt "0" an und beim Start springt auf "2", das heißt ich habe nur 3 Beep
Hier ein Tipp?
LG Antonio
AW: Alternativ
15.03.2023 17:31:37
Mathias
Hallo Antonio,
du hast jetzt das WENN-Statement um deine Schleife drum herum gepackt.
Da du die Variable in deiner Schleife erst auf TRUE setzt, obwohl die Schleife bei FALSE gar nicht startet, kann das so nicht funktionieren.
Ich meinte eigentlich, dass du nur Bestimmte Zellen in deiner Schleife ausführen lässt. Also das die Schleife ganz normal durchläuft und den Takt macht und TIKTOK angibt und alles was du gerne sehen möchtest, nur halt die Befehle, die nicht ausgeführt werden sollen wie z.B. Call BEEP und Call ListBox_scroll mit einem WENN-Statement unterdrückt werden. Dann kannst du natürlich nicht nach dem ersten Durchgang der Schleife die Variable einfach auf TRUE setzen sondern musst natürlich auch dafür eine Bedinung verlangen, damit die Variable zum richtigen Zeitpunkt gesetzt wird.
Liebe Grüße
Mathias
Anzeige
AW: Alternativ
15.03.2023 18:46:42
Antonio
Hi Matthias,
du hast Recht, ich habe da aufgehört wo b=True ist,
Mit dem Wenn kann ich mich nur auf den Label1.Caption richten weil er maßgebend ist
Sub Metronom()
    Dim b As Boolean
    BeatCount = 0
    b = False                           'hier auf False gesetzt
Do While ToggleButton1.Value = True
    BPM = TextBox1.Value
    Beginn = Timer()
    Delay = 0
    If ToggleButton2.Value = True Then Takt = 2
    If ToggleButton3.Value = True Then Takt = 3
    If ToggleButton4.Value = True Then Takt = 4
    If ToggleButton5.Value = True Then Delay = TextBox2.Value
    If Ende  Beginn Then
    Ende = Beginn + 120 / BPM + Delay / 1000
    Label1.Caption = 1 + BeatCount Mod Takt
    If BeatCount Mod Takt = 0 Then Label1.BackColor = vbGreen Else Label1.BackColor = vbWhite
    Tonfrequenz = Int(333 + 111 * ((1 + BeatCount Mod Takt) / Takt))
    Call Beep(Tonfrequenz)
    BeatCount = BeatCount + 1           'Bis hier soll das Makro laufen
    
    If Label1.Caption = 4 Then          'Wenn zu Ende gezählt dann
     b = True                           'Variable auf True
    Call ListBox_Scroll                 'Call Liszbox......
    End If
    End If
    If ToggleButton1.Value = False Then End
DoEvents
DoEvents
Loop
ListBox1.ListIndex = -1
ListBox7.ListIndex = -1
Label1.Caption = 0
End Sub
So habe ich ein Leerlauf aber die ListBox kommen auf 4 und nicht auf 1.
LGV Antonio
Anzeige
AW: Alternativ
15.03.2023 19:56:46
Mathias
Hey Antonio,
du hast jetzt auch deine Abfrage zum aufrufen der ListBox_Scroll Methode auf 4 gesetzt, was vorher eine 1 war.
Außerdem hast du zwar ein boolean erstellt aber prüfst ihn nirgends.
Versuch mal diese vier Zeilen:
If Label1.Caption = 4 Then          'Wenn zu Ende gezählt dann
b = True                           'Variable auf True
Call ListBox_Scroll                 'Call Liszbox......
End If
gegen folgenden Code zu tauschen:
If Label1.Caption = 1 And b = True Then
    Call ListBox_Scroll
End If
If Label1.Caption = 4 Then
    b = True
End If
So wird deine Methode ListBox_Scroll wie gewohnt bei 1 aufgerufen.
Allerdings ist beim ersten Durchlauf die Variable "b" noch false und deshalb wird die Methode nicht aufgerufen.
Wenn das Label dann zum erstem mal die 4 bekommt, wird die Variable auf True gesetzt. Somit wird nächstes mal bei der 1 die ListBox_Scroll Methode ausgeführt.
Liebe Grüße
Mathias
Anzeige
AW: Alternativ
15.03.2023 20:06:22
Mathias
Hey Antonio
Mir ist aufgefallen, dass du jetzt auch 2 oder 3 Takte spielen kannst.
Dann solltest du nicht auf
Label1.Caption = 4
prüfen sondern auf:
Label1.Caption = Takt
Weil du sonst die 4 nie erreichen wirst und wieder zum stocken kommst.
So wird die Variable immer auf dem letzten Takt auf TRUE gesetzt.
Liebe Grüße
Mathias
AW: Danke
16.03.2023 09:08:21
Antonio
Hi Matthias,
ich weiß jetzt was ich falsch gemacht habe,
und gestern habe nur Bäume gesehen.
Vielen Dank für deine geduldige und lehrreich Motivation.
Label1.Caption = Takt, nicht 4, habe auch übersehen.
Vielen Dank nochmal
Liebe Grüße
Antonio
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige