Wie ermittelt man in Excel (VBA) den Zelleninhalt bei verbundenen Zellen?
Ich durchlaufe in meinem Excel VBA-Script die Zellen einer Spalte, um den Zelleninhalt auszuwerten. Nun kann es passieren daß Zellen "verbunden" sind. In diesem Fall liefert mir das Script nur jeweils für die linke oberste Zelle der verbundenen Zellen den Wert zurück. In den anderen Zellen kommt Blank zurück. Ich würde in allen Zellen den gleichen Wert zurückerwarten?
Wie könnte man das bewerkstelligen?
Hardcopy/Beispiel: In den grünen Spalten steht was ich erwarten würde. In den gelben die tatsächliche VBA-Ausgabe.
Private Sub Worksheet_Activate()
Dim iRow As Integer
iRow = 4
Do
Worksheets("Test").Cells(iRow, 5) = Worksheets("Test").Cells(iRow, 1)
Worksheets("Test").Cells(iRow, 7) = Worksheets("Test").Cells(iRow, 2)
iRow = iRow + 1
If iRow > Worksheets("Test").UsedRange.Rows.Count Then Exit Do
Loop
End Sub

4 Antworten
Hallo. quick & dirty:
Private Sub Worksheet_Activate()
Dim iRow As Integer
iRow = 4
Do
Worksheets("Test").Cells(iRow, 5) = Worksheets("Test").Cells(iRow, 1).MergeArea.Cells(1, 1).Value
Worksheets("Test").Cells(iRow, 7) = Worksheets("Test").Cells(iRow, 2).MergeArea.Cells(1, 1).Value
iRow = iRow + 1
If iRow > Worksheets("Test").UsedRange.Rows.Count + Worksheets("Test").Cells(iRow, 1).MergeArea.Rows.Count Then Exit Do
Loop
End Sub
Ausnahme, wenn letzte Zeile B verbunden ist letzte Zeile A aber nicht!!
UsedRange ist in dem obigen Beispiel 17. Von daher füllt er genau bis zur richtigen Zeile 17 auf, wenn ich MergeArea.Rows.Count in der Abbruchbedinung weglasse. Wenn die Bedingung drin lasse, zählt er bis zur Zeile 19 und damit eigentlich zu weit!?
Deine Erwartungen werden nicht erfüllt.
Wenn man Zellen (mit Inhalt) verbindet, wird man gewarnt, dass der erste Wert verwandt wird. Wenn man das bestätigt (muss man ja), werden ausser dem ersten Wert ALLE anderen Werte gelöscht. Ja, gelöscht, weg, wie nie da gewesen.
EXCEL geht sogar so weit, dass es, wenn der verbundene Bereich mit einer Leerzelle beginnt, nach "Verbinden über Auswahl" und sogleich Rückgängigmachung des Befehls, den Inhalt der zweiten Zelle (die erste mit Inhalt) in die erste (bisher leere Zelle) verschiebt.
Also wird die Spalte B in dem Beispiel, trotz VBA-Abfrage, leer bleiben.
PS: ob eine Zelle verbunden ist, beantwortet der Befehl "ActiveCell.MergeCells"
Gruß aus Berlin
Danke für die Antwort. Vieles ergibt sich ja schon aus der Fragestellung.
Es muß aber doch eine Möglichkeit geben, den gesuchten Wert anstatt Blank in einer bestimmten Zelle zu ermitteln? Das wäre eigentlich die Frage bzw. das Problem.
ActiveCell.MergeCells könnte ja schon mal ein erster Schritt sein. Damit würde man dann wissen, daß es sich um eine verbundene Zelle handelt. Wie bekommt man dann raus in welcher Zelle der gesuchte Wert steht? Gibt es vieleicht einen Befehl, der die oberste linke Ecke (Zelle) einer verbundenen Zelle zurückgibt?
Private Sub Worksheet_Activate()
Dim iRow As Integer
iRow = 4
Do
If Cells(iRow, 5) <> "" Then
Cells(iRow, 5) = Cells(iRow, 1)
Else
Cells(iRow, 5) = Cells(iRow - 1, 5)
End If
If Cells(iRow, 7) <> "" Then
Cells(iRow, 7) = Cells(iRow, 2)
Else
Cells(iRow, 7) = Cells(iRow - 1, 7)
End If
iRow = iRow + 1
Loop Until iRow > Sheets("Test").UsedRange.Rows.Count
End Sub
Ist leider nicht das was ich wollte. Man muß schon Mergearea verwenden.
Tja, ich habe nichts weiter gefunden, was die obere Ecke definieren kann.
Lediglich, dass mit "ActiveCell.MergeArea.Count" die Anzahl der verbundenen Zellen ermittelt wird.
PS: Wie kann man eigentlich den in der Frage befindlichen Text des VBA-Monitors hier in diese Seiten reinbekommen?
Gruß aus Berlin
Wenn man hier eine Frage erstellt, kann man ein oder mehrere Bilder mit hochladen.
Die Bilder mußt Du halt vorher erzeugen:
Eine mögliche Vorgehensweise:
Bildschirmhardcopy z. B. mit "Drucken"-Taste vom Excel-Fenster erstellen.
Hardcopy in Bildbearbeitungsprogramm einfügen. (z. B. Paint)
Evlt. Bild nachbearbeiten/zuschneiden.
Bild im jpeg-Format abspeichern.
Bild mit Hochladen.
Meinst Du das?
Danke, schaut beim ersten Test doch sehr gut aus!
Warum hast Du die Abbruchbedingung für die Schleife verändert?