Zellen suchen und aktivieren
#1
Moin,
mal eine Verständnisfrage.

Ich suche in einer Tabelle nach einem bestimmten Wort und kann z. B. alle Zellen mit dem entsprechenden Wort z. B. färben.

Warum kann ich nicht mit der gleichen Methode alle diese Zellen aktivieren?

Mit "zelle.activate" wird nur die letzte Zelle in der Zeile mit dem entsprechenden Wort markiert.

Wo ist mein Gedankenfehler???

Code:
With Sheets("Kalender")
    Set Bereich = Range("H4:NN4")
        For Each zelle In Bereich
        If zelle.Value = "Start" Then zelle.Activate
        'If zelle.Value = "Start" Then zelle .Interior.ColorIndex = 15
        Next zelle
        End With

Gruß
Björn
Antworten Top
#2
Moin!
Nun ja, es kann halt immer nur eine einzige Zelle (auch in einer Mehrfach-Selektion) aktiv sein.
Du könntest den Bereich mittels Union() zusammensetzen.

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#3
Hallo

ich würde es wie unten programmieren. Bitte nicht vergessen den Bereich vorher von Innenfarbe zu löschen!
Das bei deinem Makro nur die letzte Zelle aktiviert ist, sollte dir schon klar sein. Oder??  Ich erkläre es.

Wenn du nach zelle.Activate eine Msgbox einsetzt, siehst du das immer nur eine Zelle aktiviert wird!
Das kostet aber unnötig Zeit, wir schalten deshalb den Bildschirmaufbau lieber ab. So gehts schneller!
Wenn du alle Zellen aktivieren willst könnte es über Union gehen. Damit kenne ich mich aber nicht aus!

mfg Gast 123

Code:
With Sheets("Kalender")
    Set Bereich = Range("H4:NN4")
    Bereich.Interior.ColorIndex = xlNone
    Application.ScreenUpdating = False
    For Each zelle In Bereich
        If zelle.Value = "Start" Then zelle.Interior.ColorIndex = 15
    Next zelle
End With
End Sub
Antworten Top
#4
Hallo Björn,

das Zusammensetzen mit der von Ralf erwähnten Union-Methode sieht dann so aus:

Code:
Sub aaa()
  Dim rngGefundeneZellen As Range
  Dim rngZelle As Range
  For Each rngZelle In Sheets("Kalender").Range("H4:NN4")
    If rngZelle.Value = "Start" Then
      If Not rngGefundeneZellen Is Nothing Then
        Set rngGefundeneZellen = Application.Union(rngGefundeneZellen, rngZelle)
      Else
        Set rngGefundeneZellen = rngZelle
      End If
    End If
  Next rngZelle
  If Not rngGefundeneZellen Is Nothing Then
    'rngGefundeneZellen.Select
    rngGefundeneZellen.Interior.ColorIndex = 15
  End If
End Sub

Gruß, Uwe
Antworten Top
#5
(08.07.2023, 15:45)Gast 123 schrieb: Wenn du alle Zellen aktivieren willst könnte es über Union gehen.

Moin!
Wie ich schrieb, kann immer nur eine einzige Zelle aktiv sein.

Aber ich wüsste auch nicht, weshalb man das anders brauchen sollte.

Zur Threaderöffnung:
Wenn schon With-Statement, dann unbedingt ein . vor Range setzen!

Hier mal mit Union() und ActiveSheet:
Code:
Sub Vereinigt_euch()
Dim Bereich As Range, Zelle As Range
With ActiveSheet
  For Each Zelle In .Range("H4:NN4")
    If Zelle.Value = "Start" Then
      If Bereich Is Nothing Then
        Set Bereich = Zelle
      Else
        Set Bereich = Union(Bereich, Zelle)
      End If
    End If
  Next Zelle
  Bereich.Interior.ColorIndex = 15
End With
End Sub

Sehr viel einfacher ist natürlich der Vorschlag von gast 123
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#6
Moin,
ok, da war ich wohl mit meiner Methode auf dem absoluten Holzweg.

Erst mal danke für die vielen Antworten, aber mir ging es nicht darum, die Zellen zu färben, denn das funktioniert mit dem Code, den ich gepostet hatte.
Zu mindestens mit dem Teil:
Code:
If zelle.Value = "Start" Then zelle .Interior.ColorIndex = 15


Mein eigentliches Ziel ist es, alle Zellen mit "Start" zu finden und diese dann um zwei weitere Zellen nach rechts zu erweitern und dann zu verbinden.

Ich dachte, ich könnte dies tun, in dem ich zuerst alle Zellen markiere in der "Start" steht. Das war wohl nichts.


Gruß
Björn
Antworten Top
#7
Hallo

ich weise höflich darauf hin das die Forum Kollegen von verbundenen Zellen abraten, weil es oft zu Problemen kommt.
Wenn sie trotzdem verbunden werden sollen dasnn probiere bitte diesen Code. Mit Warnung bei Überschneidungen!

mfg Gast 123

Code:
Sub Zellen_verbinden()
Dim AC As Range, Txt As String
For Each zelle In Range("H4:AN4")
    If zelle = "Start" Then
    If WorksheetFunction.CountIf(zelle.Resize(1, 3), "Start") = 1 Then
      zelle.Resize(1, 3).MergeCells = True
      zelle.Resize(1, 3).Interior.ColorIndex = 1
    Else
      Txt = Txt & ", " & zelle.Address(0, 0)
      zelle.Resize(1, 3).Select
      MsgBox zelle.Address(0, 0) & " überschneidet sich mit Folgezellen", vbInformation
    End If
    End If
Next zelle
If Txt <> "" Then MsgBox "verbundene Zellen in:" & vbLf & "Zelle: " & Mid(Txt, 2)
End Sub
Antworten Top
#8
Moin,
ja das funktioniert einwandfrei.

Danke!

Gruß
Björn
Antworten Top
#9
Hi,

ich möchte mal auf den höflichen Hinweis vom Gast hinweisen und mit Nachdruck eine Erklärung für das Verbinden der Zellen fordern.

Um es kurz zu machen: verbundene Zellen machen immer wieder Ärger. Man muss höllisch aufpassen, dass sie einem nicht in die Quere kommen - sowohl in normalen Excel-Formeln als auch bei VBA-Programmen.

Daher schildere deine Motivation und es lässt sich sicherlich ein Ersatz ohne verbundene Zellen finden.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste