2.8k Aufrufe
Gefragt in Windows 7 von
Hallo VBA-Profis,

ich habe ein Problem mit VBA-Excel.
Zelle F100 im "GB"-Tabellenblatt muss leer ist oder gleichtzeitig die Zellen A100 bis
F100 müssen befüllt sein.
Sollte dies nicht eintreffen, dann soll eine Msg-Box aufpoppen mit der Meldung
"Nicht so befüllt, wie es sein sollte" und die alle hinterlegte Makros nicht ausführen
lassen. So sieht es auch und es funktioniert.

Private Sub CommandButton10_Click()

With Worksheets("GB")
If (.Cells(100, 6) = "") Or WorksheetFunction.CountA(Range("A100:F100")) = 6
Then

D_A 'Makro
D_B 'Makro


Else
MsgBox "Tabellenblaut GS, :" & vbCrLf _
& "bitte prüfen"
End If
End With

End Sub

Dieser Makro funktioniert, aber ich möchte es wie folgt erweitern und hier ist das
Problem:
Ich bräuchte jetzt das Makro so, dass er in zwei verschiedenen Tabellenblätter prüft
(nicht nur in "GB"), also auch im Tabellenblatt "PS"
bevor die Makros ausführt.
Voraussetzungen sind fast identisch (aber nur fast).
Tabellenblatt: "PS":
Zelle F100 im "GB"-Tabellenblatt leer ist oder gleichtzeitig die Zellen A100 bis F100
und L100 bis M100 befüllt sind.

Sollte dies jedoch nicht eintreffen, dann brauche ich eine Msg-Box-Fehlermeldung
mit folgendem Satz:

"Tabellenblatt PS bitte prüfen"

Ich sage schon jetzt danke.

Sollte es unverständlich gewesen sein, dann bitte ich um kurze Rückmeldung.

Gruß
Max

22 Antworten

0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Max,

füge mal in eine leere Zelle in deinem Arbeitsblatt GB die folgende Formel ein und sieh dir dann das Ergebnis an, wenn z.B. in W100 nichts steht ;-).
=ANZAHL2(A100:F100)

Wie du richtig vermutet hast, funktioniert hier die Überprüfung auf den Inhalt mit Anzahl2 nicht mehr.

Versuch mal das geänderte Makro:
Sub Fehler()
Dim lngGB As Long
Dim lngPS As Long
Dim lngSpalte As Long
Dim bFehlerGB As Boolean
Dim bFehlerPS As Boolean

If Worksheets("GB").Cells(100, 6) = "" And Worksheets("PS").Cells(100, 6) = "" Then
bFehlerGB = False
bFehlerPS = False
Else
'im Arbeitsblatt GB den Bereich A100 bis F100 prüfen, die Zellen gefüllt sind
With Worksheets("GB")
If .Cells(100, 6) <> "" Then
For lngSpalte = 1 To 6
If .Cells(100, lngSpalte) <> "" Then lngGB = lngGB + 1
Next
If lngGB < 6 Then bFehlerGB = True
End If
End With

With Worksheets("PS")
If .Cells(100, 6) <> "" Then
For lngSpalte = 1 To 6
If .Cells(100, lngSpalte) <> "" Then lngPS = lngPS + 1
Next
For lngSpalte = 12 To 13
If .Cells(100, lngSpalte) <> "" Then lngPS = lngPS + 1
Next
If lngPS < 8 Then bFehlerPS = True
End If
End With
End If

'falls alles Okay, dann die Makros aufrufen und danach Sub verlassen
If bFehlerGB = False And bFehlerPS = False Then
D_A 'Makro
D_B 'Makro
Exit Sub
End If

'Ausgabe der Fehlermeldungen
If bFehlerGB = True And bFehlerPS = False Then MsgBox "Bitte Blatt GB überprüfen!", 16, "Fehler!"
If bFehlerGB = False And bFehlerPS = True Then MsgBox "Bitte Blatt PS überprüfen!", 16, "Fehler!"
If bFehlerGB = True And bFehlerPS = True Then MsgBox "Bitte Blätter GB und PS überprüfen!", 16, "Fehler!"

End Sub

Gruß

M.O.
0 Punkte
Beantwortet von
Hi M.O.

wir haben bzw. Du hast es fast geschafft.
Es arbeitet syntax-technisch gesehen so wie es sein sollte.

Ich habe jedoch vergessen noch etwas zu sagen.
Es gibt Konstellationen, wo in beiden Tabellenblätter (GS und PS) wenn die Zelle F100 befüllt ist, dass trotzdem allen anderen Zellen leer angezeigt werden können.
Das dient eines Berichtes, welches völlig in Ordnung ist.

Das heißt, ich befülle die Zellen F100 und weiter nach rechts, dennoch könnten unter Umständen die Zellen A100 bis E100 (Tabellenblatt "GS")
und Zellen A100 bis E100 und L100 bis M100 (Tabellenblatt "PS") leer angezeigt werden.

In diesem Fall werden die Makros nicht gestartet, sollen jedoch gestartet werden. Wichtig dabei ist, dass die Formeln in Zellen A100 bis E100 etc. heruntergezogen werden.

Sorry, Dir diese Info nicht vorher gegeben zu haben, erst durch dem Testen habe ich diese weitere Kleiningkeit herausgefunden.

Ich hoffe hier auch eine Lösung von Dir zu erhalten. Wäre Dir sehr dankbar.
Dankbar für die Hilfe bin ich schon jetzt für Dein Quelltext, welches Super läuft:-)

Gruß
Max
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Max,

sorry aber ich verstehe nur Bahnhof :-(.

Du schreibst
Es gibt Konstellationen, wo in beiden Tabellenblätter (GS und PS) wenn die Zelle F100 befüllt ist, dass trotzdem allen anderen Zellen leer angezeigt werden können.

aber leider beschreibst du nicht, wie diese Konstellationen aussehen und wie diese durch das Makro geprüft werden können.

Und wie soll ich das verstehen:
Wichtig dabei ist, dass die Formeln in Zellen A100 bis E100 etc. heruntergezogen werden.

Hängt das mit den Konstellationen zusammen?
Falls du eine Beschreibung, wie in Antwort 4 geben kannst, werde ich mal sehen, was man da noch machen kann.

Gruß

M.O.
0 Punkte
Beantwortet von
Hi,

ich versuche es die Problematik besser zu beschreiben (Tabellenblatt "GS"):

Die Zellen A99 bis E99 sind wie folgt verformelt:
A100 = WENN(W99="";"";C99&" "&E99)
B100 = WENN(W99="";"";C99&" "&E99)

W100 stellt die Summe der Monate Januar bis Dezember her.
Es kann also sein, dass im Januar 500 EUR fakturiert wurden und in Februar wieder storniert.
Somit ist die Summe in Zelle W100 = 0 EUR.

Die Zellen in den Spalten A bis E sind nur bis zu den Zeilen 99 verformelt.
Ich ziehe mir die Daten aus einer Datenbank und befülle Die Zellen ab Spalte F.
Nun habe ich in der Zelle F100 beispielsweise folgenden Wert reinkopiert:
'Rev. of goods 3rd import/export

Befindet sich einen Wert in der Spalte F, dann übernehme ich die Formeln aus A99-E99 und kopiere sie in den Zellen A100-E100
Das Ergebnis der Zellen A100 bis B100 ist = (leer), so wie ich es verformelt habe. Ich habe der Zelle via Formel gesagt, wenn Du Zelle "W100" den Wert 0 aufweist, dann bin ich Zelle "A100" leer.

Hier kommt die Makro Problematik:
Ich habe in der Zelle F100 den Wert: 'Rev. of goods 3rd import/export und das Jahresergebnis in der Zelle W100 = 0
In den Zellen A100 und B100 ist der Wert der Zellen = Leer
In den Zellen C100 oder D100 oder E100 kann jedoch trotzdem den Wert darstellen obwohl die Zelle W100 "0" zeigt.

--> Die Makros werdejn nicht ausgeführt obwohl sie ausgeführt werden müssen, weil die Zelle F100 befüllt ist.
Alle anderen Zellen sind auch befüllt, aber mit Formeln, egal der der ausgegebenen Wert "leer" ist oder beispielsweise mit "DE"

Für Tabellenblatt "PS" ist das Problem ähnlich.

Ich hoffe das Problem verständlich dargestellt zu haben.

Vielen Dank für die Zeit, die Du zur Verfügung stellst.

Gruß
Max

PS: wenn Du eine Möglichkeit findest, wie ich Dir das File zur Verfügung stellen kann, dann sage es mir, es wäre dann viel einfacher. Vor mir aus, kannst Du eine Email schell einrichten und dann
löschen.
Da ich leider heute nicht mehr online seine werde (ab 16 Uhr nicht mehr), komme ich morgen dazu erneut zu schreiben.
0 Punkte
Beantwortet von
Sorry, ich habe geschrieben:

Die Zellen A99 bis E99 sind wie folgt verformelt:
A100 = WENN(W99="";"";C99&" "&E99)
B100 = WENN(W99="";"";C99&" "&E99)

Gemeint war aber:
Die Zellen A99 bis E99 sind wie folgt verformelt:
A99 = WENN(W99="";"";C99&" "&E99)
B99 = WENN(W99="";"";C99&" "&E99)
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Max,

wenn ich das richtig verstehe müsste man prüfen, ob
[list]- F100 <> ““ und
- A100 = ““ und
- B100 = ““ und
- im Bereich W2 bis W99 Werte vorhanden sind (ich gehe mal davon aus, dass deine Tabelle Überschriften hat und dass in die Spalte W keine Formeln stehen, sondern Zahlenwerte per Hand eingefügt werden).[/list]
Falls alle oben genannten Bedingungen erfüllt sind, dann sollen auch die beiden Makros ausgeführt werden.

Habe ich das so richtig verstanden?

Und das gilt für beide Blätter, oder ist es im Blatt PS anders?

Gruß

M.O.
0 Punkte
Beantwortet von
Hallo M.O.

in der kompletten W-Spalte gibt es keine Formeln, sondern Werte. Ist zwar die Summe von Jan-Dez, ist aber keine Formel hinterlegt.
Daten kommen aus einer anderen Datenbank, die von mir händisch eingefügt werden.

F100 <> "", hier muss die Zelle befüllt werden,
A100 = ““ und
B100 = ““ und
C100 = ““ und
D100 = ““ und
E100 = ““ und
In Grunde genommen, kann sein, dass Zelle F100 befüllt ist, alle allen eben genannten Zellen spucken den Wert "", muss aber nicht sein.
Ich hätte also gerne, wenn die Zelle F100 befüllt ist und alle anderen Zellen mit Formeln hinterlegt sind (obwohl der Wert "" ausspuckt), dass das Makro läuft.

Diese Regel sind für beide Tabellenblätter "GB" und "PS" gleich.
Nur, dass für die Tabelle PS andere Zellen angesprochen werden, aber auch die Zeile 100.

Wenn es unklar war, bitte zurückmelden.

Danke und Gruß
Max
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Max,

jetzt fällt der Groschen ;-). Aber eine Frage habe ich noch. Was ist in diesem Fall mit den Zellen L100 und M100 im Tabellenblatt PS. Müssen die in diesem Fall auch auf Formeln überprüft werden?

Gruß

M.O.
0 Punkte
Beantwortet von
Ja, auch die die Zellen L und M im Tabellenblatt "PS"

Ich weiß, es ist schwer so zu erklären ohne den Original-File zur Verfügung zu haben.

Gruß
Max
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Max,

schau mal, ob das Makro so funktioniert, wie du willst:

Sub Fehler()
Dim lngGB As Long
Dim lngPS As Long
Dim lngSpalte As Long
Dim bFehlerGB As Boolean
Dim bFehlerPS As Boolean

If Worksheets("GB").Cells(100, 6) = "" And Worksheets("PS").Cells(100, 6) = "" Then
bFehlerGB = False
bFehlerPS = False
Else
'im Arbeitsblatt GB den Bereich A100 bis F100 prüfen, die Zellen gefüllt sind
With Worksheets("GB")
If .Cells(100, 6) <> "" Then
For lngSpalte = 1 To 5
If .Cells(100, lngSpalte).HasFormula = True Then lngGB = lngGB + 1
Next
If lngGB < 5 Then bFehlerGB = True
End If
End With

With Worksheets("PS")
If .Cells(100, 6) <> "" Then
For lngSpalte = 1 To 5
If .Cells(100, lngSpalte).HasFormula = True Then lngPS = lngPS + 1
Next
For lngSpalte = 12 To 13
If .Cells(100, lngSpalte).HasFormula = True Then lngPS = lngPS + 1
Next
If lngPS < 7 Then bFehlerPS = True
End If
End With
End If

'falls alles Okay, dann die Makros aufrufen und danach Sub verlassen
If bFehlerGB = False And bFehlerPS = False Then
D_A 'Makro
D_B 'Makro
Exit Sub
End If

'Ausgabe der Fehlermeldungen
If bFehlerGB = True And bFehlerPS = False Then MsgBox "Bitte Blatt GB überprüfen!", 16, "Fehler!"
If bFehlerGB = False And bFehlerPS = True Then MsgBox "Bitte Blatt PS überprüfen!", 16, "Fehler!"
If bFehlerGB = True And bFehlerPS = True Then MsgBox "Bitte Blätter GB und PS überprüfen!", 16, "Fehler!"

End Sub


Gruß

M.O.
...