Mehrere Zellen auf Kommentare prüfen

Hallo zusammen,

ich versuche gerade einen Zellbereich auf den Inhalt von Kommentaren zu überprüfen.
Ich will erreichen, dass Excel mir die Antwort „Ja“ in eine „Antwort-Zelle“ schreibt, sobald in einer Zelle des Zellbereichs ein Kommentar enthalten ist. Ist dies nicht der Fall, soll in der „Antwort-Zelle“ „Nein“ stehen.

Hier mein Versuch:

Sub test()
Dim Zelle As Range
Set Bereich = Range(„A1:B1“)

For Each Zelle In Bereich
If Zelle.Comment Is Nothing Then
Worksheets(„Tabelle1“).Range(„D7“).Value = „Ja“
If Not Zelle.Comment Is Nothing Then
Worksheets(„Tabelle1“).Range(„D7“).Value = „Nein“
End If
End If
Next Zelle
End Sub

Leider funktioniert es nur für die Zelle B1. Ob in der Zelle A1 ein Kommentar enthalten ist oder nicht spielt anscheinend keine Rolle und ich weiß nicht warum?!

Könnt ihr mir bitte helfen?

LG,

Max

Hallo magezz,

Der Kommentar in Zelle A1 wird ausgewertet aber NICHT angezeigt, da durch die Schleife (A1 - B1) der Wert für A1 durch den Wert von B1 überschrieben wird.
Da in jeder Zelle ein Kommentar vorhanden sein könnte, muss eine derartige Funktion zellenbasiert arbeiten.

Beispiel:

Private Function HasComment(strZelle As String) As Boolean
If Worksheets("Tabelle1").Range(strZelle).Comment Is Nothing Then
 HasComment = False
Else
 HasComment = True
End If
End Function

Wenn Du wissen willst, ob in einem ZellenBEREICH mindestens ein Kommentar ist, dann mach die Schleife beim Aufruf wie folgt:

Private Function HasCommentRange(strBereich As String) As Boolean
For Each Zelle In Bereich
 If HasComment(Zelle) = True Then
 HasCommentRange = True
 Exit Function
Next Zelle
HasCommentRange = False
End Function

Aufruf in der Zelle mit „= HasComment()“ bzw. „=HasCommentRange()“

Gruß
Harry

Hallo Max,
das Problem ist: egal, was mit Zelle A1 ist, es wird durch das Ergebnis in Zelle B1 überschrieben. Du müsstest also die Ergebnisse für A1 und B1 in unterschiedliche Zellen schreiben lassen, um auch das Ergebnis zu A1 zu erfahren.

Gruß
Norman

Hallo Max,
ich habe noch vergessen, dich darauf hinzuweisen, dass ein „end if“ in die Zeile nach „Worksheets(„Tabelle1“).Range(„D7“).value=„Ja““ versetzt werden muss.
Ansonsten käme If Not Zelle.Comment Is Nothing Then nie zum Tragen, da nicht beide Bedingungen gleichzeitig zutreffen können.
LG
Norman

Hallo Harry,

vielen Dank für deine schnelle Antwort!

Du hast es genau auf den Punkt gebracht: ich will wissen, ob in einem Zellenbereich mindestens ein Kommentar ist… Leider reichen meine Kenntnisse nicht aus, um deine Lösung auf funktionierende Art und Weise umzusetzen.
Kannst du mir vielleicht den kompletten Code aufschreiben, damit ich nachvollziehen kann wie es funktioniert?
Ich bin gerade überfordert und du würdest mir sehr weiterhelfen.

Viele Grüße,

Max

Hallo Max,
so geht’s:
Sub richtig()
Dim Zelle As Range
Dim Bereich As Range
Set Bereich = Range(„A1:B1“)

Worksheets(„Tabelle1“).Range(„D7“).Value = „Nein“

For Each Zelle In Bereich
If Not Zelle.Comment Is Nothing Then
Worksheets(„Tabelle1“).Range(„D7“).Value = „Ja“
GoTo erledigt

End If
Next Zelle
erledigt:
End Sub

Warum deine Variante nicht klappt, siehst du vielleicht selbst, wenn du Einrückungen verwendest:
Sub test()
Dim Zelle As Range
Set Bereich = Range(„A1:B1“)

For Each Zelle In Bereich
If Zelle.Comment Is Nothing Then
Worksheets(„Tabelle1“).Range(„D7“).Value = „Ja“
If Not Zelle.Comment Is Nothing Then
Worksheets(„Tabelle1“).Range(„D7“).Value = „Nein“
End If
End If
Next Zelle
End Sub

Oder wenn du deinen Code im Debugmodus ausführst und dir ansiehst, welche Schritte der Reihe nach ausgeführt werden.

Viel Erfolg,
herzliche Grüße
Katharina

Hallo Max,

Sub test()
Dim Zelle As Range
Set Bereich = Range(„A1:B1“)

For Each Zelle In Bereich
If Zelle.Comment Is Nothing Then
Worksheets(„Tabelle1“).Range(„D7“).Value = „Ja“

=> eigentlich soll „Ja“ geschrieben werden, wenn ein Kommentar da ist, Nothing bedeutet aber: kein Kommentar

If Not Zelle.Comment Is Nothing Then

Die zweite Bedingung ist innerhalb der ersten, wenn also die erste nicht zutrifft, verlässt das Programm diese Verzweigung.

Worksheets(„Tabelle1“).Range(„D7“).Value = „Nein“

So wird das Ergebnis jeweils in Zelle D7 geschrieben, du erkennst nur den letzten Eintrag, in dem Fall zur Zelle B1.
Versuche es hiermit:
Sub test()
Dim Zelle As Range
Set Bereich = Range(„A1:B1“)
For Each Zelle In Bereich
If Zelle.Comment Is Nothing Then
Cells(7, Zelle.Column).Value = „Nein“
Else
Cells(7, Zelle.Column).Value = „Ja“
End If
Next Zelle
End Sub

mfg
Thomas

Hallo magezz,

hier mein Vorschlag zur Korrektur:

Sub test()
Dim bereich As Range
Dim Zelle As Variant
Set bereich = Range(„A1:B1“)
For Each Zelle In bereich
If Zelle.Comment Is Nothing Then
Worksheets(„Tabelle1“).Range(„D7“).Value = „Nein“
Else
Worksheets(„Tabelle1“).Range(„D7“).Value = „Ja“
End If
Next Zelle
End Sub

ich hoffe es hilft.

Gruß Hugo

Hallo magezz,

hier mein Vorschlag zur Korrektur:

Sub test()
Dim bereich As Range
Dim Zelle As Variant
Set bereich = Range(„A1:B1“)
For Each Zelle In bereich
If Zelle.Comment Is Nothing Then
Worksheets(„Tabelle1“).Range(„D7“).Value = „Nein“
Else
Worksheets(„Tabelle1“).Range(„D7“).Value = „Ja“
End If
Exit Sub
Next Zelle
End Sub

ich hoffe es hilft.

Gruß Hugo

Wenn Du in der ersten Zelle ein „JA“ einsetzt, in der 2. Zelle ein „NEIN“, und in der 3. Zelle steht wieder ein „JA“, was ist dann am Ende in der Antwortzelle?

Worksheets(„Tabelle1“).Range(„D7“).Value = „Nein“
For Each Zelle In Bereich
If Zelle.Comment Is Nothing Then
Worksheets(„Tabelle1“).Range(„D7“).Value = „Ja“
End If
Next Zelle

Also: setze vorher ein „NEIN“ ein, und falls in irgendeiner Zelle die Bedingung zutrifft, mache daraus ein „JA“.

Es gibt sicherlich auch die Möglichkeit, alles in die Schleife einzubauen, aber die Schleife wird dadurch komplizierter und langsamer.

mfg
Wolfram

Hallo

das 2te IF ist ja für nix!!! einfach Else

und es geht. Dann evtl. nicht immer in D7 schreiben sonst siehst es ja nicht!

Gruss keymax

PS. findest sonst auch viel im Internet

Sub test()
Dim Zelle As Range
Set Bereich = Range(„A1:F9“)

For Each Zelle In Bereich
If Zelle.Comment Is Nothing Then
Worksheets(„Tabelle1“).Range(„D7“).Value = „Ja“
Else
'–If Not Zelle.Comment Is Nothing Then
Worksheets(„Tabelle1“).Range(„D8“).Value = „Nein“
'—End If
End If
Next Zelle
End Sub

Hallo Max,

der Fehler liegt darin, dass du die beiden If-Schleifen ineinander verschachtelt hast. Dadurch wird die 2. If-Abfrage nie ausgeführt.

So sollte es gehen:

Sub test()
 Dim Zelle As Range
 Set Bereich = Range("A1:B1")

 Worksheets("Tabelle1").Range("D7").Value = "Nein"

 For Each Zelle In Bereich 
 If Not(Zelle.Comment Is Nothing) Then
 Worksheets("Tabelle1").Range("D7").Value = "Ja"
 End If
 Next
End Sub

Gruß,
BellHouse

Hallo Katharina,

vielen Dank für deine schnelle Hilfe.

Es klappt jetzt wunderbar!

Darf ich dich bzgl. eines weiteren Problems noch um Hilfe bitten?

Ich habe einen Code den ich anpassen müsste- aber auch hier bin ich nicht in der Lage es alleine zu machen.

Ich möchte ein Tabellenblatt auf Textboxen durchsuchen, und mir in einer Zelle eines anderen Tabellenblatts den Wert Ja (wenn eine Textbox enthalten ist) oder Nein (wenn keine Textbox enthalten ist) zurückgeben lassen.

Bisher habe ich mir eine MsgBox anzeigen lassen und nun will ich es ändern, damit ein Wert in der Zelle erscheint. Aber ich kriege es nicht hin.

Hast du diesbezüglich auch eine Idee?
(Code steht unten…)

Public Function IsTextBoxInside(ByRef probjSheet As Worksheet) As Boolean

Dim objShape As Shape

For Each objShape In probjSheet.Shapes

If objShape.Type = msoTextBox Then

IsTextBoxInside = True
Set objShape = Nothing
Exit For

End If
Next
End Function

Public Sub Test()
MsgBox IsTextBoxInside(Tabelle1)
End Sub

Und hättest du vielleicht einen Tipp wie ich mich grundsätzlich der VBA-Thematik nähern kann?
Gute Einsteigerliteratur zu finden ist irgendwie nicht so leicht…

Liebe Grüße,

Max

Hallo magezz,

also:

  • Excell starten und Datei öffen
  • Extras Visual Basic Editor öffen (Alt-F11 glaub ich)
  • Z. B. unter „Arbeitsblatt“ rechtst mausklicken und
    Code anzeigen bzw. neues Modul einfügen
  • Hier steht normalerweise „Option Compare …“ =>
    darunter schreibst du „Option Explicit“
  • Fügst Du die beiden Funktionen von mir ein und
    speicherst das Ganze
  • Dann im Tabellenblatt (Du hast D7 als Zielzelle
    genannt) gibst du ein:
    =Wenn(HasCommentRange(A1:B2) = Wahr; „Ja“; „Nein“)

=> in der Zelle wird nun „Ja“ ausgegeben, wenn die
Funktion HasCommentRange TRUE zurückgibt und „Nein“,
wenn nicht.

Das gleiche geht auch mit allen anderen benutzer-
definierten Funktionen. Einfach mit dem Ist-Zeichen
aufrufen.

Hoffe es klappt.
Bin jetzt für 2,5 Wochen im Urlaub und weiss nicht, ob ich Mails checken kann.

Gruß
Harry

Hi,

Deine Verwendung von Ifs ist falsch. Die geschachtelten Ifs in Deinem Code könnte man leicht durch ein Else ersetzen. Aber selbst dieses ist gar nicht nötig.
Du mußt Dir genau überlegen, was das Makro tun soll und wie VBA das umsetzen kann. Also Dich mehr mit den Befehlen und Strukturen von VBA beschäftigen.

Zum Problem. Du willst, daß in Zelle D7 steht, ob eine der Zellen des Suchbereichs einen Kommentar enthält. Dann

  • geht man davon aus, daß alle Zellen keinen Kommentar haben

  • durchläuft die Zellen in einer Schleife

  • wenn eine Zelle einen Kommentar hat, ist die Suchbedingung schon erfüllt

  • man kann daher den Sucherfolg notieren und - vor allem - die Suchschleife verlassen, denn wahrer als wahr wird’s nicht.
    Sieht dann bspw. so aus:

    Sub test()
    Dim Zelle As Range
    Dim Bereich As Range
    Set Bereich = Range(„A1:B15“)
    Dim HatKommentar As Boolean 'standardmäßig FALSE
    For Each Zelle In Bereich
    If Not (Zelle.Comment Is Nothing) Then
    HatKommentar = True
    Exit For
    End If
    Next Zelle
    Worksheets(„Tabelle1“).Range(„D7“).Value = IIf(HatKommentar, „Ja“, „Nein“)
    End Sub

Bitte verwende in Zukunft stets die pre-Tags, denn nicht eingerückten Code zu lesen ist schwer. Bei längeren Texten weigere ich mich inzwischen.

HTH.

Markus

Hallo Max,

ich denke Deine Abfragen sind nicht in Ordnung. Wenn in A1 ein Kommentar enthalten ist, ist das Ergebnis der 1. Abfrage False. Zur 2. Abfrage geht’s nicht, da die in der 1. enthalten ist.

Folgendes wäre möglich:

For …
If Zelle.Comment Is Nothing Then
Worksheets(„Tabelle1“).Range(„D7“).Value = „Ja“
else
Worksheets(„Tabelle1“).Range(„D7“).Value = „Nein“
end if
Next …

Gruß
JOGI