Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Range mit UNION bilden

Range mit UNION bilden
04.09.2013 02:42:56
Peter_S
Hallo,
ich möchte eine Range aus mehreren einzelnen Spalten bilden und verwende hierzu UNION. Beim Lesen der Range erhalte ich aber auch alle anderen Spalten.
Beispiel:
Set rSpalten = Nothing
For iCol = 1 To ws.UsedRange.Columns.Count
If iCol = 2 Or _
iCol = 5 Or _
iCol = 8 Then
If rSpalten Is Nothing Then
Set rSpalten = ws.Cells(1, iCol).EntireColumn
Else
Set rSpalten = Union(rSpalten , ws.Cells(1, iCol).EntireColumn)
End If
End If
Next
Mit rSpalten.Cells(1, 2) erhalte ich statt den Wert aus der ersten Zeile der 3. Spalte statt wie gewünscht den Wert aus der 5. Spalte.

Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Bei einer Mehrfachauswahl ...
04.09.2013 04:50:37
Luc:-?
…(Union) muss man jede Area einzeln ansprechen, Peter;
mit flfd Index kann man in diesem Fall nur eine Array-Variable traktieren. Bei Union wird einfach über die jeweilige Area hinaus weitergezählt.
Gruß Luc :-?

AW: Range mit UNION bilden
04.09.2013 05:03:49
Luschi
Hallo Peter_S,
so ist es ja auch von Dir vorgegeben im Vba-Code, die Spalten 2, 5 und 8 werden in das neue Rangeobjekt übernommen.
Im neuen Bezugssystem ist die jetzt 2. Spalte die ehemals 5. Spalte.
Die ehemals 3. Spalte ist überhaupt nicht übernommen worden.
Ein Beispiel:

Sub test1()
Dim rg As Range
Set rg = Range("K1:Z10")
MsgBox rg.Range("A1")
Set rg = Nothing
End Sub
Jetzt rate mal, welcher Zellinhalt angezeigt wird; natürlich der Inhalt vom alten Bezugssystem 'K1'.
Gruß von Luschi
aus klein-Paris

Anzeige
AW: Range mit UNION bilden
04.09.2013 09:49:50
Peter_S
Hallo Luschi,
vielen Dank für Deinen Hinweis. Genau so würde ich es erwarten. In der neuen Range erhalte ich in der ersten Spalte die Werte der ursprünglichen Spalte 2. Aber in der zweiten Spalte der neuen Range stehen nich die Werie der ursprünglichen Spalte 5 sondern die der ursprünglichen Spalte 3.
Sorry, mein erster Beitrag war hier missverständlich (das erste "statt" gehört aus dem letzten Satz raus). Kann es sein, dass dies mit der Übernahme der Entire.Column zusammenhängt?
Gruß Peter

Anzeige
AW: Range mit UNION bilden
04.09.2013 11:15:21
Luschi
Hallo Peter,
ich habe noch mal ein bischen getestet und festgestellt, das in Deinem Fall (lückenbehaftete Bereiche in einem Range-Objekt) der Zugriff 'rSpalten.Cells(1, 3).Value' so nicht funktioniert.
Eigentlich willst Du ja hier den Inhalt von 'H1' ändern oder anzeigen. Excel geht aber von der 1. Zelle in rSpalten aus ('B1') und nimmt die 3. Zelle rechts davon aus der tatsächlichen Tabelle und nicht aus rSpalten - greift also auf 'D1' zu.
Wenn man aber per For 'Each rg In rSpalten' den Bereich durchläuft, werden nur die Zellwerte der 2., 5. und 8. Spalte angezeigt.
Verstehen tue ich das auch nicht.
Gruß von Luschi
aus klein-Paris

Anzeige
AW: Range mit UNION bilden
04.09.2013 12:22:13
Peter_S
Hallo Luschi und Rudi,
vielen Dank für Eure Hinweise und Vorschläge. For each rng in rSpalten funktioniert nicht, da ich die Zellen direkt adressieren muss. Der Lösungsvorschlag über Areas funktioniert auch nicht, da Excel dummerweise nebeneinander liegende Spalten zu einer Area zusammenfasst.
Viele Grüße
Peter

Anzeige
AW: Range mit UNION bilden
04.09.2013 14:05:50
Rudi
Hallo,
wozu brauchst du den Bereich?
Um ihn in der gewünschten Weise adressieren zu können, brauchst du einen zusammenhängenden Bereich.
Motto:
rSpalten.Copy
with sheets(2).cells(1,1)
.currentregion.clear
.pastespecial xlpastevalues
set rpalten =.currentregion
end with
Gruß
Rudi

Anzeige
Nebeneinanderliegende Spalten?
04.09.2013 16:08:38
Luc:-?
Deine Spalten in Union liegen doch gar nicht nebeneinander, Peter,
sonst wäre richtig, was du schreibst! Aber da du anscheinend der Peter bist, der meine AWn lieber ignoriert, darfst du dein Problem gern ohne meine Mithilfe lösen! :->>
Luc :-?

das liegt wohl daran, ...
04.09.2013 16:45:26
Rudi
Hallo,
... dass sein Beispiel (wie die meisten Bsp) nicht der Realität entspricht.
Gruß
Rudi

Anzeige
Ja, da wirst du leider mal wieder recht haben, ...
05.09.2013 01:06:39
Luc:-?
…Rudi…! ;-]
Gruß Luc :-?

wie Luc schon schrieb,....
04.09.2013 11:20:31
Rudi
Hallo,
muss du in dem Fall mit Areas() arbeiten.
MsgBox rSpalten.Areas(2).Cells(5) oder
MsgBox rSpalten.Areas(2).Range("A5")
gibt dir die 5.Zeile der 2.Spalte zurück.
Gruß
Rudi
;
Anzeige
Anzeige

Infobox / Tutorial

Range mit UNION bilden


Schritt-für-Schritt-Anleitung

Um eine Range aus mehreren Spalten in Excel VBA zu bilden, kannst du die Union-Methode verwenden. Hier ist eine Schritt-für-Schritt-Anleitung:

  1. Öffne den VBA-Editor in Excel (Alt + F11).

  2. Erstelle ein neues Modul: Rechtsklick auf "VBAProject" > Einfügen > Modul.

  3. Füge den folgenden Code ein:

    Sub ErstelleUnionRange()
       Dim rSpalten As Range
       Dim ws As Worksheet
       Set ws = ThisWorkbook.Sheets("DeinTabellenblatt") ' Ersetze "DeinTabellenblatt" mit dem tatsächlichen Namen
    
       Set rSpalten = Nothing
    
       For iCol = 1 To ws.UsedRange.Columns.Count
           If iCol = 2 Or iCol = 5 Or iCol = 8 Then
               If rSpalten Is Nothing Then
                   Set rSpalten = ws.Cells(1, iCol).EntireColumn
               Else
                   Set rSpalten = Union(rSpalten, ws.Cells(1, iCol).EntireColumn)
               End If
           End If
       Next iCol
    
       ' Beispiel: Wert der ersten Zelle in der neuen Range abrufen
       MsgBox rSpalten.Cells(1, 1).Value
    End Sub
  4. Führe das Makro aus (F5), um die Union Range zu erstellen.


Häufige Fehler und Lösungen

  • Fehler: Falscher Zellinhalt wird angezeigt.

    • Lösung: Achte darauf, dass die Indizes in rSpalten.Cells(1, x) korrekt sind. Die Zählung beginnt bei der ersten Zelle der neuen Range.
  • Fehler: For Each Schleife funktioniert nicht.

    • Lösung: Wenn du direkt auf Zellen zugreifen musst, verwende Union und achte darauf, dass du die richtige Zelle adressierst.

Alternative Methoden

Wenn Union nicht die gewünschte Flexibilität bietet, kannst du auch die Areas-Eigenschaft nutzen:

MsgBox rSpalten.Areas(2).Cells(1, 1).Value

Diese Methode ermöglicht es dir, auf spezifische Teile der Union Range zuzugreifen, was hilfreich ist, wenn du mit nicht zusammenhängenden Zellen arbeitest.


Praktische Beispiele

Hier ist ein einfaches Beispiel, um zu verdeutlichen, wie du Union verwenden kannst:

Sub BeispielUnion()
    Dim rSpalten As Range
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Tabelle1")

    Set rSpalten = Union(ws.Columns(2), ws.Columns(5), ws.Columns(8))

    ' Wert der Zelle in der ersten Zeile der 5. Spalte abrufen
    MsgBox rSpalten.Cells(1, 1).Value  ' Dies gibt den Wert der 2. Spalte in rSpalten zurück
End Sub

In diesem Beispiel wird eine Union Range aus den Spalten 2, 5 und 8 erstellt, und du kannst auf die Zellen innerhalb dieser Range zugreifen.


Tipps für Profis

  • Verwende Debug.Print: Nutze diese Methode, um Werte während der Entwicklung im Direktfenster anzuzeigen. So kannst du Fehler schneller identifizieren.

  • Optimierung der Performance: Bei großen Datenmengen kann die Verwendung von Union die Performance beeinträchtigen. Überlege, stattdessen mit Arrays zu arbeiten.

  • Vermeide leere Zellen: Stelle sicher, dass die Spalten, die du in deine Union Range einfügst, keine leeren Zellen enthalten, um unerwartetes Verhalten zu vermeiden.


FAQ: Häufige Fragen

1. Wie kann ich mehrere nicht zusammenhängende Bereiche in Excel mit VBA zusammenfassen? Du kannst die Union-Methode verwenden, um mehrere Bereiche in Excel VBA zu kombinieren. Stelle sicher, dass du die Bereiche korrekt adressierst.

2. Was passiert, wenn ich auf eine Zelle in einer Union Range zugreife? Wenn du auf eine Zelle in einer Union Range zugreifst, wird Excel die Zelle basierend auf der Position in der gesamten Range zählen. Dies kann zu Verwirrung führen, wenn du nicht mit den Indizes vertraut bist.

3. Wie kann ich die Werte aus einer Union Range in eine andere Tabelle kopieren? Du kannst die Methode Copy verwenden und die Werte dann in die Zielzelle einfügen:

rSpalten.Copy Destination:=Sheets("ZielTabelle").Cells(1, 1)

Durch diese Anleitungen und Beispiele bist du gut gerüstet, um mit der Union-Methode in Excel VBA zu arbeiten.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige