2.3k Aufrufe
Gefragt in Tabellenkalkulation von phlip Mitglied (231 Punkte)
Hallo SN User,

ich habe auf einem Tabellenblatt eine Schaltfläche eingefügt, die mit einem Makro belegt ist. Das Makro darf aber nur ausgeführt werden, wenn die beiden folgenden Bedingungen erfüllt sind:

1) Es muss mindestens eine Zeile unterhalb der Überschrift der Tabelle befüllt sein.
2) Jede befüllte Zeile muss vollständig befüllt sein. Es darf kein Feld leer bleiben. Was eingetragen wird ist egal bzw. durch Validierung bereits vorgegeben.

Ist es möglich, die Schaltfläche nur aktiv zu schalten, wenn diese Bedingungen erfüllt sind?
Alternative: Ist es möglich, die Schaltfläche auszublenden, solange die Bedingungen nicht erfüllt sind?

Danke im Voraus für Eure Hilfe.

Viele Grüße
Phlip

6 Antworten

0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi Phlip ^^

ein beispiel

gruss nighty

einzufuegen
alt+f11/projektexplorer/DeineTabelle

die 3 gibt an 2 positionen das indexende der spalten an
waere entsprechend an beiden positionen anzupassen

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim Schalter As Boolean
Dim Zelle As Variant
ReDim Bereich(1, 3) As Variant
If Target.Row > 1 Then
Bereich() = Range(Cells(Target.Row, 1), Cells(Target.Row, 3))
For Each Zelle In Bereich()
If Zelle = "" Then Schalter = True
Next Zelle
If Schalter = True Then
CommandButton1.Enabled = False
Else
CommandButton1.Enabled = True
End If
End If
Application.EnableEvents = True
End Sub
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi Phlip ^^

mit dem cb button koennte es dann so aussehen

gruss nighty

Private Sub CommandButton1_Click()
CommandButton1.Enabled = False
Call DeinMakroname
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim Schalter As Boolean
Dim Zelle As Variant
ReDim Bereich(1, 3) As Variant
If Target.Row > 1 Then
Bereich() = Range(Cells(Target.Row, 1), Cells(Target.Row, 3))
For Each Zelle In Bereich()
If Zelle = "" Then
Schalter = True
Exit For
End If
Next Zelle
If Schalter = True Then
CommandButton1.Enabled = False
Else
CommandButton1.Enabled = True
End If
End If
Application.EnableEvents = True
End Sub
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Philip,

du kannst doch dein Makro für den Schalter mit Hilfe einer If-Verzweigung so schreiben, dass bei erfüllter Bedingung (alle Zellen ausgefüllt) das andere Makro gestartet wird, wenn nicht, dann eine MsgBox mit einem Hinweis dass nicht alle Zellen ausgefüllt sind.

Bis später,
Karin
0 Punkte
Beantwortet von phlip Mitglied (231 Punkte)
Hallo nighty und Karin,

vielen Dank für Eure Hinweise. Leider gehen meine VB-Kenntnisse gegen null und ich habe folgende Probleme beim Verständnis bzw. bei der Umsetzung:

@ nighty: Ich habe den Code aus Deinem zweiten Posting bei vor dem Code des Makros eingefügt. Da es sich bei mir um 5 Spalten handelt, habe ich die 3en aus Deinem Code durch 5en ersetzt. Aber ich erkenne keinen Effekt.

@Karin: Den If-Teil könnte ich analog zu den If-Teilen in nightys Code wahrscheinlich noch nachbauen, aber ich glaube, das mit den Bedingungen bekomme ich nicht hin.

Evtl. hilft Euch die folgende Info noch zum besseren Verständnis, wo mein Problem ist. Das Tabellenblatt ist wie folgt aufgebaut

A1 - Tabellenüberschrift
Zeilen 2 und 3 leer
Zeile A4:E4 - Überschriften der Spalten
ab Zeile 5, die Einträge

Es ist egal, ob eine oder hundert Zeilen befüllt sind. Wichtig ist nur, dass wenn eine Zeile befüllt ist, sie auch komplett befüllt ist.

Tabellenüberschrift


Spalte A | Spalte B | Spalte C | Spalte D | Spalte E
Eintrag1| Eintrag2 | Eintrag 3 | Eintrag4 | Eintrag5
...


Es darf keiner der Einträge 1-5 fehlen, sonst darf das Makro nicht ausgeführt werden.

Allerdings: Wenn es jetzt größeren Aufwand machen würde, ist es den Aufwand nicht wert. Wenn Ihr also noch eine schnelle Idee habt, wie man das Problem lösen kann, die Euch keine Mühe bereitet, dann freue ich mich auf Eure Vorschläge. Wenn Ihr aber jetzt langwierig etwas erklären oder Code schreiben müsstest, dann lasst es bitte. Denn ich selbst habe auch nicht die Zeit, es entsprechend zu würdigen und möchte Euch daher nicht unnötig damit beschäftigen.

Gruß, Phlip
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi Phlip ^^

du wirst es wohl falsch abgelegt haben

ich hab mal eine vielleicht bessere beschreibung bzw vorgehensweise aus dem netz kopiert und hier eingefügt

gruss nighty

p.s.
bei so wenigen zellen ist ein array natuerlich wie mit kanonen auf spatzen zu schiessen,aber schnell *grrrr* ,hier haette vielleicht eine rangebereichsangabe statt eines arrays ausgereicht

^^

während Excel aktiv ist, ist die Tastenkombination Alt + F11 zu drücken, damit öffnet sich das Fenster der Entwicklungsumgebung für VBA

mit Tastenkombination Strg + R den Projektexplorer öffnen und aktivieren

dort die gewünschte Datei per Doppelklick markieren, sie ist dann blau unterlegt

nun Doppelklick unterhalb dieser Datei auf das gewünschte Tabellenblatt, auf welches sich das Makro auswirken soll

nun ist in der rechten Fensterhälfte das Codefenster dieser Tabelle sichtbar. In diese kann der Code eingefügt werden

speichern und Visual Basic mit Tastenkombination Alt + F4 schließen

das Makro steht nun in der Datei zur Verfügung und wird durch Wechsel des Zelleninhaltes ausgelöst
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Philip,
If ActiveCell.Row > 4 Then
If Application.CountA(Range(Cells(ActiveCell.Row, 1), Cells(ActiveCell.Row, 5))) = 5 Then
MsgBox "Dein Makro"
Else
MsgBox "Bitte alle Zellen ausfüllen"
End If
End If

Bis später,
Karin
...