Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Checkbox und Schaltfläche





Frage

Hi ! Ich habe mehrere Checkboxen auf einem Tabellblatt und eine Schaltfläche. Hinter jeder Checkbox verbirgt sich ein anderes aufgezeichnetes Makro. Nun möchte ich mehrere Checkboxen auswählen können und wenn ich dann auf die Schaltfläche drücke, soll er alle markierten Makros/Checkboxen hintereinander ausführen. Leider bekomme ich das so nicht hin. Wenn ich einer Checkbox nen Makro zugewiesen habe, wird das Makro sofort beim Häckchen setzen ausgeführt. :-( Kann mir bitte jemand helfen. Auch wenn es nur Ansetzte sind.

Antwort 1 von coros

Moin Daugenix,

so wie Du das vor hast, wird das auch nichts werden. Alle Makros, die hinter den CheckBoxen stehen, müssen über die Schaltfläche aufgerufen werden und nicht mit den CheckBoxen. Bei Betätigen der Schaltfläche musst Du dann eine If-Abfrage (Wenn Abfrage) durchführen und jede einzelne CheckBox nach Ihrem Zustand abfragen. Also wenn die CheckBox1 = True dann führe das Makro1 aus. Mal ein Beispiel, welches Du in das VBA Projekt der Tabelle einfügen musst, in dem sich die CheckBoxen und die Schaltfläche befindet.

Private Sub CommandButton1_Click()
If CheckBox1 = True Then
MsgBox "Hallo"
End If
If CheckBox2 = True Then
MsgBox "Halli Hallo"
End If
End Sub


Bei dem Beispiel werden beim Klick auf die Schaltfläche die Zustände der CheckBoxen abgefragt. Ist CheckBox1 aktiviert, erscheint eine Meldung auf dem Bildschirm mit dem Text "Hallo". Ist CheckBox2 aktiviert, erscheint ebenfalls eine Meldung mit dem Text "Halli Hallo". Sind beide CheckBoxen aktiviert, werden nacheinander beide Meldungen am Bildschirm angezeigt. Anstelle der MsgBox´en, muss bei Dir das Makro stehen, welches bei CheckBox1 bzw. CheckBox2 ausgeführt werden soll. Wenn Du diese Abfrage noch für weitere CheckBoxen benötigst, dann immer die Anweisung von If bis End If kopieren und vor End Sub wieder einfügen und dann noch die CheckBox-Nummer anpassen.

So, ich hoffe, das hilft Dir schon mal ein wenig weiter. Bei weiteren Fragen melde Dich wieder.

MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 2 von Daugenix

Ja das ist es.
Vielen Dank
Ich probier es gleich aus.
Mit Excel Formeln kenn ich mich ganz gut aus,
aber nicht mit VB Excel.

Eine Frage hätte ich noch.
Dann würde ich mir ne Menge Makros sparen und
mein Problem eventuell mit einer Zählschleife lösen können.

ich möchte zB. :
über den Button, die Zellen ( A 3 - A 10 ) füllen,
und danach die Zellen ( B 3 - B 10 ), (C 3 - C 10 ) usw.

und auch

über den Button, die Zellen ( A 6 - Z 6 ) füllen,
und danach die Zellen ( A 7 - Z 7 ), ( A 8 - Z 8 ) , usw

Kann ich in beiden Varianten irgendwie ne Schleife verwenden?
Wie müsste die Schleife aussehen und wie deklariere ich die Variablen in VB Excel ?
Geht das 1. Beispiel überhaubt ohne Probleme ?

Antwort 3 von Daugenix

Gibt es im Internet ne übersichtliche
Befehlsreferenz aller VB-Excel Befehle ?

Oder auch eine Referenz aller Formeln ?

Antwort 4 von coros

Hi ,

ich weiß jetzt zwar nicht, womit Du Deine zellen füllen möchtest, da Du das ja hier nicht verrätst, aber nachfolgend mal zwei Beispiele. Kopiere sie in ein StandardModul und weise sie Befehlsschaltflächen zu.

Sub Spalten_füllen()
Dim Zeilenwiederholungen_1 As Long, Spaltenwiederholungen_1 As Integer
For Zeilenwiederholungen_1 = 3 To 10
For Spaltenwiederholungen_1 = 1 To 3
Cells(Zeilenwiederholungen_1, Spaltenwiederholungen_1) = "Hallo"
Next
Next
End Sub

Sub Zeilen_füllen()
Dim Zeilenwiederholungen_1 As Long, Spaltenwiederholungen_1 As Integer
For Zeilenwiederholungen_1 = 1 To 3
For Spaltenwiederholungen_1 = 1 To 26
Cells(Zeilenwiederholungen_1, Spaltenwiederholungen_1) = "Hallo"
Next
Next
End Sub


Das erste Makro füllt zuerst die Spalte A mit dem Text "Hallo" und dann Spalte B und C.

Das zwiete Makro füllt zuerst die Zeile 1 von Spalte A bis Z mit dem Text "Hallo" und dann Zeile 2 und Zeile 3.

Das Ende der Schleife kann man auch variabel gestalten, in dem man mit der entsprechenden Anweisung die letzte Spalte oder die letzte Zeile ermitteln läßt, falls notwendig.

Ich hoffe, das hilft Dir weiter. Ansonsten wäre es sicherlich mal sinnvoll, wenn Du mal etwas genauer beschreiben würdest, was Du eigentlich erreichen möchtest. Dann kann man ein etwas konkreteres Makro erstellen.

Antwort 5 von Daugenix

Ich danke Dir vielmals für Deine Mühe.
Das bringt mich schon sehr viel weiter.

Ich will hier nichts verheimlichen, ich werd ma mein Projekt etwas mehr verdeutlichen.

Ich Bastel an einem Jahresplaner.
Es gibt eine Haupttabelle von einem Jahr.
Tage des Monats stehen nebeneinander.
Personen untereinander
Jede Person hat eine Checkbox.

Dann gibt es ein weiteres Tabellenblatt mit einem
normalem DIN A4 Jahreskalender.
Dort sind die Tage des Monats untereinander.

Nun kann ich im Hauptplaner alle Termine von allen Personen eintragen.

Und wenn ich von einer Person den Jahreskalender ausdrucken möchte, aktiviere ich die jeweilige checkbox der Person und das andere Tabellenblatt (Jahreskalender) wird mit den Daten aus dem Hauptkalender übertragen.

Also das Ziel bleibt immer gleich.
Die Quelle (Person) rutscht immer um eine Zeile nach unten. Je nach Auswahl der Checkbox.

Ich wollte anfänglich das Ganze übertragen in Makros aufnehmen (für jede Person / Checkbox ein Makro)

Oder ich erhöhe mit einer Schleife die Zeilennummer, je nach Auswahl der checkbox (Person)

Das wäre Toll wenn es erstmal so klappen würde.
Heute Abend schau ich mir das ganze im Detail mit Deiner bisherigen Antwort an.

Dann schau ich mal ob ich den ganzen Quellcode was mit dem übertragen der Daten von einem zum nächsten Kalender nicht auch in Schleifen machen kann ( Monat für Monat).
Das wäre aber nur Spielerei um den Quellcode klein zu halten.

Antwort 6 von Daugenix

Ich habe es jetzt so gemacht und bin an folgendem Punkt hängen geblieben.

 Private Sub CommandButton1_Click()
Dim zaehler_1 As Long
If CheckBox1 = True Then
    zaehler_1 = 1
    Call Daten_uebertragen
End If
If CheckBox2 = True Then
    zaehler_1 = 2
    Call Daten_uebertragen
End If
If CheckBox3 = True Then
    zaehler_1 = 3
    Call Daten_uebertragen
End If
End Sub


durch den zaehler wollte ich nun die Zeilennummer um eins erhöhen.
Nur weiss ich nicht, wie ich das als Variable genau im Code definieren muss.

 Sub Daten_uebertragen()

    Sheets("1.Halbjahr").Select
      Range("J"6+zaehler_1":AN"6+zaehler_1").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Urlaubskalender").Select
    Range("C36").Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
    Range("A32:A37").Select
    
End Sub


Ich denke mal, dass die Excel-Profis hier wissen, was ich falsch gemacht habe.
Ich kenne mich nur mit PHP aus aber nicht mit VBA.

Wie muss ich das machen ??
So geht es ja nicht :-(

Antwort 7 von coros

Hi Daugenix ,

wenn ich das richtig verstehe, möchtest Du ab Zeile 6 je nach CheckBox -Auswahl die Daten aus Spalte J bis AN ausschneiden und in das andere Blatt C36 wieder einfügen. Dann würde der Code folgendermaßen aussehen.


Sub Daten_uebertragen()
zaehler_1 = zaehler_1 + 6
Sheets("1.Halbjahr").Range("J" & zaehler_1 & ":AN" & zaehler_1).Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Urlaubskalender").Range("C36").PasteSpecial Paste:=xlPasteFormulas, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End Sub


Zum Anfang wird zu dem Wert der Variablen "zaehler_1" die Zahl 6 dazu addiert. Somit hast Du dann z.B. wenn Du CheckBox3 aktivierst, den Wert 9 in der Variablen und das bedeutet, die Daten aus Zeile 9 werden ausgeschnitten.

Ich hoffe, ich habe das so richtig verstanden und auch die Lösung war so richtig. Wenn nicht, dann melde Dich.

MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 8 von Daugenix

Genau so meine ich es :-)

Leider funktioniert es aber nicht :-(
Ich habe die Variable zaehler_1 beim
Command_button() je nach checkBox nummer auf den Wert der Checkbox gesetzt zB.
zaehler_1 = 3 <- bei checkbox3

im Makro soll die Zeile dann hochgerechnet werden

 zaehler_1 = zaehler_1 +   6
Sheets("1.Halbjahr").Range("J" & zaehler_1 & ":AN" & zaehler_1).Select 

dann müsste die Variable zaehler_1 jetzt den wert 9 haben.
Also soll er die Zeile (J9:AN9) selektieren.
Er selektiert aber immer die Zeile 6.
Das heisste die Variable zaehler_1 hat immer den Wert 6, egal welche checkbox ich auswaehle.

Private Sub CommandButton1_Click()
Dim zaehler_1 As Long
If CheckBox1 = True Then
zaehler_1 = 1
Call Daten_uebertragen
End If
If CheckBox2 = True Then
zaehler_1 = 2
Call Daten_uebertragen
End If
If CheckBox3 = True Then
zaehler_1 = 3
Call Daten_uebertragen
End If
End Sub


Ansonsten funktioniert alles bestens.
wenn ich die 6 in eine andere Zahl veränder, zB 10, dann springt er auch in zeile 10.

Antwort 9 von coros

Hi Daugenix,

Du musst die variable mit an das Makro übergeben. Das machst Du in Deinem Code folgendermaßen:

Private Sub CommandButton1_Click()
Dim zaehler_1 As Long
If CheckBox1 = True Then
zaehler_1 = 1
Daten_uebertragen zaehler_1
End If
If CheckBox2 = True Then
zaehler_1 = 2
Daten_uebertragen zaehler_1
End If
If CheckBox3 = True Then
zaehler_1 = 3
Daten_uebertragen zaehler_1
End If
End Sub


Du brauchst nicht um das Makro "Daten_uebertragen" zu starten das Wort Call davor zu schreiben, das geht auch ohne. Du musst allerdings, um die variable an das Makro mit zu übergeben, immer hinter den Makronamen noch die Variable schreiben, die Übergeben werden soll. Dann musst Du noch eine kleine Änderung in Deinem Makro durchführen. Du musst in der Zeile

Sub Daten_uebertragen() 


die Variable deklarieren. Das sieht dann so aus:

Sub Daten_uebertragen(zaehler_1 As Long)


Somit sieht dann Dein Makro folgendermaßen aus:

Sub Daten_uebertragen(zaehler_1 As Long)
zaehler_1 = zaehler_1 + 6
Sheets("1.Halbjahr").Range("J" & zaehler_1 & ":AN" & zaehler_1).Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Urlaubskalender").Range("C36").PasteSpecial Paste:=xlPasteFormulas, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End Sub


So, jetzt sollte es aber funktionieren. Wenn nicht oder bei weiteren fragen melde Dich.

MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 10 von Daugenix

HAAAAA !!!!

ES GEHT !!!!


Super, vielen Dank für Deine super schnelle Hilfe.

Mir ist da noch was eingefallen, nicht erschrecken. :-)

Da das bisher als Beispiel nur ein Monat war, wird das Makro etwas 12x so gross und muss ne Menge machen.

Wenn das Makro durchgearbeitet wird, kann man verfolgen was passiert: Tabellenblätter auswähen, Zellen auswählen, usw.
Kann man die Ansicht solange ausschalten, das man nicht sieht was das Makro macht ?

Antwort 11 von coros

Hi,

setze am Anfang Deines Makros die Anweisung

Application.ScreenUpdating = False


ein. Das schaltet die Bildschirmaktualisierung für die Laufzeit des Makros aus.

MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 12 von coros

Hi,

noch mal ich. Was ich noch vergessen habe zu schreiben, verzichte wenn möglich auf die vielen Select-Anweisungen. Das benötigt nur ungemein Prozessorleistung. Wie Dir vielleicht aufgefallen ist, habe ich weiter oben ja schon mal Dein Makro etwas eingkürzt, in dem ich diese Select Geschichten herausgenommen habe. Es geht meistens ohne das. Probier einfach mal ein bisschen ohen Select, das macht ein Makro bedeutend schneller.

MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 13 von Daugenix

Genau das meine ich.

Nun funktioniert alles so wie es soll.
Ich muss jetzt nur noch die letzten 11 Monate zum Makro hinzufügen und dann war es das.

Prima, da bin ich aber froh, dass ich das mit Deiner Hilfe hinbekommen habe.

Jetzt habe ich wieder ne Menge über Excel und VBA gelernt und kann mich bald an noch größeren Profekten versuchen. Ich hab da schon ein paar Ideen :-)

Vielen Dank nochmal Oliver
Du hast jetzt einen neuen Dauergast auf Deiner
Homepage: www.excelbeispiele.de

Antwort 14 von coros

Hi Daugenix,

freut mich, dass die Endlösung so ist, wie Du es wolltest. Danke Dir auch für Deine Rückmeldung und Deinen Gästebucheintrag.

MfG,
coros
Jeder macht was er will, keiner macht was er soll, aber alle machen mit.

Antwort 15 von Daugenix

hmpf

nu bekomm ich diese kleinigkeit nicht hin :-(

Original:
ActiveCell.FormulaR1C1 = _
"=VERKETTEN(´1.Halbjahr´!D7;" ";´1.Halbjahr´!C7)"



Versuch mit Variable zaehler_1 anstatt die Zahl 7
ActiveCell.FormulaR1C1 = _
"=VERKETTEN(´1.Halbjahr´!D" & zaehler_1 & ";"" "";´1.Halbjahr´!C" & zaehler_1 & ")"


Syntax Fehler

Ich bin zu doof die Variablen in die Zeile zu bekommen, wegen den Anführungszeichen macht er Probleme.

Wie kann ich das Umgehen ?

Antwort 16 von coros

Hi,

nachfolgende Anweisung sollte Ihren Zweck erfüllen und in die aktive Zelle die Verkettenformel einfügen.

ActiveCell.FormulaR1C1 = _
"=CONCATENATE(´1.Halbjahr´!R" & zaehler_1 & "C4,´1.Halbjahr´!R" & zaehler_1 & "C3)"


Ich hoffe, Dir hilft´s

MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 17 von Daugenix

So nun geht aber wirklich alles.
Habe es von vorn bis hinten getestet.
Sogar das ausdrucken läuft nu auch automatisch über das Makro (die Makros)

Für meine VBA Kenntnisse ist das ein ziemlich
großes Projekt geworden.
Insgesamt: 4 Tabellenblätter, 7Buttons, 25 Checkboxen, 12 Makros und die ganze Steuerung meiner Ausgabeseite mit Ausdrucken usw.

Oliver, hab nochmals vielen Dank.
Mit Sicherheit werde ich mich im Laufe der Zeit irgendwann nochmals bei Dir melden.
So VBA-Perfekt bin ich leider nicht, dass ich mit jedem Problem fertig werde. Aber ich versuchs ernsthaft erst auf eigene Faust.

Bis zum nächsten Problem
Daugenix

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: