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

Join-Befehl

Forumthread: Join-Befehl

Join-Befehl
11.02.2005 18:14:58
Reinhard
Hallo Wissende,
wie benutze ich denn den Join Befehl in VBA?

Sub ttt()
Dim Bereich As Variant
Bereich = [A1:I1]
'MsgBox Join(Bereich, "")
Zeile = Join(Bereich, "")
End Sub

klappt nicht an der Join-Zeile (ungült. Prozeduraufruf bzw ungültig. Argument)
Wie schreibe ich einen Rangebereich mit Join verknüpft in eine einzige Variable?
Gruß
Reinhard
Anzeige
AW: Join-Befehl
Kurt
hi,
sieh dir mal "union" an
...und Tschüss Kurt
Danke, aber leider
Reinhard
Hi Kurt,
Set Bereich = Application.Union(Range("A1"), Range("B1:I1"))
anstelle von
Bereich = [A1:I1]
nutzt mir m.A.n nix, oder ich übersehe da was.
Ich habe folgendes:
A1:= "K"
B1:= "u"
C1:= "r"
D1:= "t"
und ich möchte mittels Join erreichen, dass die Variable "Zeile" den Wert "Kurt" hat.
Und mein Ansatz funktioniertt halt nicht :-(

Sub ttt()
Dim Bereich As Variant
Bereich = [A1:D1]
'MsgBox Join(Bereich, "")
Zeile = Join(Bereich, "")
End Sub

Gruß
Reinhard
Anzeige
AW: Danke, aber leider - Lösung
Luc
Hallo Reinhard & Kurt,
die VBA-Funktion Join(bereich, trennzeichen) vereint die Inhalte der Zellen von bereich miteinander und setzt zwischen die einzelnen Werte trennzeichen, wenn angegeben. Es entsteht ein String, der einer passend deklarierten Variablen zugewiesen wdn kann. Die Umkehrung von Join() ist übrigens Split(string, trennzeichen). Die Funktion Union() vereint dagegen verschiedene Zellbereiche zu einem multiplen Auswahlbereich, wenn die Einzelbereiche voneinander getrennt liegen. Das Ergebnis verfügt also i.d.R. über mehrere Areas. Reinhard geht's hier aber offensichtl um Join(). Deshalb folgende Korrekturen:

Sub ttt()
Dim Bereich As Range, Zeile As String
Set Bereich = Range("A1:D1")
Zeile = Join(Bereich, "")
MsgBox Zeile
End Sub

Und wenn jetzt nicht in der MsgBox Kurt erscheint...
(zur Bezugsschreibweise vgl Thread "riesen Problem mit Formel in Excel - Sebastian 09.02.2005 13:18:37" mit "AW: Riesenproblem - Lösung - von Luc am 10.02.2005 22:13:18")
Schönen Abend noch
Luc
Anzeige
AW: Danke, aber leider - Lösung
Kurt
hallo Luc,
es ist schön, dass du dich hier zum Oberlehrer aufschwingst aber vielleicht solltest du deinen Code mal ausprobieren
...und versuch doch mal als erster zu antworten damit auch du das Vergnügen hast von anderen für Verständnisfehler gemassregelt zu werden *nichtsoengsehenabermalnachdenken*
und jetzt mal für dich:
Join(sourcearray [, delimiter])
sourcearray Erforderlich. Eindimensionales Datenfeld, das die zu kombinierenden, untergeordneten Zeichenfolgen enthält.
und dein Array ist leider nicht eindimensional sodern hat leider deren zwei
das kann man leicht nachvollziehen wenn man das Ding als Überwachungsausdruck definiert aber das hast du ja leider nicht getan
wir harren jetzt deinen weiteren Einfällen (aber ohne Schleife bitte (das kann ja jeder)) viel Spass
...und Tschüss Kurt
Anzeige
kommt Fehlermeldung
Reinhard
Dir auch einen schönen Abend Luc,
danke für deine Erläuterungen, habe auch den Thread mit Sebastian gelesen, muss den nochmal lesen um zu verstehen was mein join mit Formulalocal zu tun haben könnte, anscheinend ist heute nicht der Tag an dem mir dir Gedanken zufliegen *gg) aber wie auch immer,es bringt mich leider auch nicht zum Ziel :(

Sub ttt()
Dim Bereich As Range, Zeile As String
Set Bereich = Range("A1:D1")
Zeile = Join(Bereich, "")
MsgBox Zeile
End Sub

bringt Fehler 13, Typenunvrträglichkeit in der Join-Zeile.
Weitere Tipps, Ideen? *hoff*
Gruß
Reinhard
Anzeige
AW: kommt Fehlermeldung
Kurt
hi,
um dir erstmal weiterzuhelfen von luc kommt ja nix als heiss Luft

Sub ttt()
Dim zelle As Range
Dim zFolge As String
For Each zelle In Range("A1:D1")
zFolge = zFolge & zelle.Value
Next
MsgBox zFolge
End Sub

...und Tschüss Kurt
AW: kommt Fehlermeldung
Luc
Hallo Reinhard,
wollte schon weg sein, aber zur Strafe dafür, das ich das nicht getestet hatte, musste ich das ja jetzt wohl klären. Also nicht die Dimensionalität ist schuld an der Fehlermeldung, sondern, dass es sich um einen Range handelt. Join verarbeitet offensichtlich nur 1dimens. Datenfelder in Variablen (z.B. vom Typ Variant), was ich bisher auch stets getan, hier aber offensichtlich vergessen habe. Also müssen die Inhalte erst mal in eine solche Variable, weshalb du bereich wohl als Variant deklariert hast. Im folgenden geht es dann allerdings nicht ohne eine For- bzw For-Each-Schleife, da hat Kurt recht (s.u.):

Sub ttt()
Dim Bereich() As Variant, Zeile As String, i As Integer, n As Integer, x As Range
n = Range("A1:D1").Cells.Count - 1
ReDim Bereich(n)
For Each x In Range("A1:D1")
Bereich(i) = x.Value
i = i + 1
Next x
Zeile = Join(Bereich, "")
MsgBox Zeile
End Sub

Natürlich kannst du die einzelnen Werte in einer For-Schleife auch direkt miteinander verknüpfen, aber Join() ist schon recht hilfreich, vor allem, wenn man aus solchen Feldern Zeichenketten macht, um sie irgendwo zwischenzuspeichern und später wieder in Felder zurückzuverwandeln.
Mein Hinweis auf den anderen Thread bezog sich in 1.Linie auf die Notation von Zellbezügen. Hier verwendet der Recorder eine Methode, die von der OnLine-Hilfe nicht gerade in den Vordergrund gerückt wird.
Also hat etwas gedauert, meine Frau wird sauer sein, denn ich wollte schon weg sein.
Schönen Abend und tut mir leid (gut dass ich mir das mit dem Besen verkniffen habe).
Luc
PS: hat gedauert, inzwischen war hier wohl einiges los, schau ich gleich mal.
Anzeige
AW: kommt Fehlermeldung
Kurt
hi Luc,
kein problem
ich hab wohl auch ein wenig überreagiert
*shakehandanbiet*
...und Tschüss Kurt
p.s. nächstes mal geht bitte die Frau vor !! (ist sicherer) *grins*
OK, akzept, aber sag ihr's selber (smiling) owT
Luc
AW: kommt Fehlermeldung
Reinhard
Hallo Luc,
dank für deine Ausführlichkeit. Schleifen will ich erstmal vermeiden, ansonsten backe ich sie mir aus euren Anregungen und meinem bescheidenen Wissen schon zusammen.
Mal schauen ob K.Rola noch ein Wunderjoin o.ä. kennt :-)
Habe es noch nicht komplett geschrieben aber versuche jetzt eine Lösung über Datei-Export.
Letzlich geht es ja um die Problematik von
https://www.herber.de/forum/messages/566515.html (Anfragetext siehe unten)
Also wie vergleiche ich A1:I1 mit M1:U1 ohne in einer Schleife erst A1 bis I1 einzulesen usw.
Dadurch kam ich auf Join, was wohl nicht geht :-(
Meine neue Idee mit Dateiexport ist folgende, ich speichere A1:Ix sowie M1:U1 in jeweils einer eigenen Txtdatei ab, mal schauen, wenn möglich mit Leerzeichenspaltentrenner,
dann lese ich sie Satzweise (=ganzer zeilenbereich) in Variablen ein und vergleiche dann diese Variablen.
Mal schauen wie lange das dauert usw. und ob es überhaupt so realisiert werden kann, aber das teste ich nachher oder morgen mal aus.
Gruß
Reinhard
Text: in Tabelle1 habe ich zwei Bereiche: Bereich1="A1:I85" und Bereich2="M1:U13". Ich möchte aus Bereich2 erste Zeile ("M1:U1") in Bereich1 ("A1:I85") suchen und bei Übereinstimmung farblich markieren. Dann aus Bereich2 zweite Zeile ("M2:U2") nehmen und in Bereich1 ("A1: I85") suchen und bei Übereinstimmung farblich markieren und so weiter. In jeder Zeile sind 6 (sechs) unterschiedliche Spalten mit einem x1 bis x9 belegt.
Bereich1 kann bis 55000 Zeilen groß werden.
Bereich2 kann bis 1500 Zeilen groß werden.
Alle meine versuche waren ohne Erfolg. Wer kann mir dabei helfen eine VGA Lösung zu finden?
Anzeige
AW: Join-Befehl
K.Rola
Hallo,
ich hab jetzt nicht alle Antworten gelesen.
Gehts dir darum, die Zeichen zu verketten oder willst du unbedingt join verwenden?
Gruß K.Rola
AW: Join-Befehl
Reinhard
Hallo K.Rola,
lohnt sich nicht wirklich alle Antworten zu lesen, da tobt wohl ein Kleinkrieg :-(
Ja, ich will die Zellen einer Zeile verketten, aber ohne Schleife und mir fiel da nur der Join-Befehl ein bzw auf, jetzt grübel ich halt warum er nicht funktioniert.
Bereich = Array("H", "e", "l", "l", "o")
msgbox Join(Bereich, " ")
klappt ja,
Bereich=[A1:E1]
msgbox Join(Bereich, " ")
leider nicht.
Also wie gesagt, suche eine Lösung , ohne Schleife.
Danke für deine Mühe :-)
Gruß
Reinhard
Anzeige
OT. Nachtrag
Reinhard
Hallo K.Rola,
ich kam auf das Problem bei Anfrage: https://www.herber.de/forum/messages/566515.html
Anfagetext siehe unten.
Ich wollte da ein temporäres Tabellenblatt erstellen, in die dortige Spalte A dann Join(A1:Ix) rein und in Spalte B dann Join(M1:Ux) reinschreiben.
Dann den Vergleich starten und dann im Originalblatt die entsprechenden Zeilen markieren.
Anshcliessend das temporäre Baltt löschen.
Gruß
Reinhard
Text: n Tabelle1 habe ich zwei Bereiche: Bereich1="A1:I85" und Bereich2="M1:U13". Ich möchte aus Bereich2 erste Zeile ("M1:U1") in Bereich1 ("A1:I85") suchen und bei Übereinstimmung farblich markieren. Dann aus Bereich2 zweite Zeile ("M2:U2") nehmen und in Bereich1 ("A1: I85") suchen und bei Übereinstimmung farblich markieren und so weiter. In jeder Zeile sind 6 (sechs) unterschiedliche Spalten mit einem x1 bis x9 belegt.
Bereich1 kann bis 55000 Zeilen groß werden.
Bereich2 kann bis 1500 Zeilen groß werden.
Alle meine versuche waren ohne Erfolg. Wer kann mir dabei helfen eine VGA Lösung zu finden?
Anzeige
AW: Join-Befehl
Kurt
hi,
das ist schön, dass du das als Kleinkrieg bezeichnest wenn man mal ein paar fachliche Argumente austauscht und es dann nicht für nötig empfindest zu antworten
da du ja scheinbar über den Dingen stehst bin ich ab hier raus
...und Tschüss Kurt
Ui, erlitt wohl grad nen Kollateralsachaden :-)
Reinhard
Hallo Kurt,
um Forumsaufblähungen zu drosseln, sehe ich es als sehr korrekt an, wenn ein Frager erst alle reinpurzelnden Antworten auswertet, testet usw und dann eine einzige Rückmeldung mit Feedback für jeden Antworter schreibt.
Gilt natürlich nicht wenn die Antwort direkt beantwortet werden muss um den Fortgang des Threads zu ermöglichen.
Schade für deine Reaktion.
Gruß
Reinhard
Anzeige
AW: Ui, erlitt wohl grad nen Kollateralsachaden :-)
Kurt
pech gehabt ;-)
Solch ein „Kollateralschaden“ gilt nur dann nicht als Kriegsverbrechen, wenn er bei einem Angriff auf ein militärisches Ziel als „Nebenwirkung“ entstanden ist und nicht beabsichtigt war.
*grins*
...und Tschüss Kurt
AW: Join-Befehl
K.Rola
Hallo,
join kann ja nur eindimensionalen Array. Einen solchen kannst du aber nicht auf
einen Rutsch füllen, also irgenwie brauchst du eine Schleife.
Nimmst du ein Variant- Datenfeld, ist es nicht eindimensional.
Gruß K.Rola
Anzeige
Ende - seh ich das richtig...
Luc
...na, das tut mir jetzt aber leid. Hatte bis zu meiner soeben erfolgten Antwort abgeschaltet. Das Problem ist ja wohl jetzt geklärt. Du hast ne Lösung, Reinhard, und weißt außerdem, was man mit Join anfangen kann.
Naja, und das andere, das kommt schon mal vor. Hab auch schon sauer reagiert, wenn ich das Gefühl hatte, jemand wertet meine Arbeit ab (vor allemm, wenn der dann wirklich keine Ahnung hat), aber hier wussten ja alle was, und so muss es sein.
Gute Nacht, dann
Luc
Anzeige
Jepp, beendet, Danke an Alle :-) o.w.T.
Reinhard
;
Anzeige

Infobox / Tutorial

Join-Befehl in VBA effizient nutzen


Schritt-für-Schritt-Anleitung

Um den Join-Befehl in VBA korrekt zu verwenden, folge diesen Schritten:

  1. Deklariere deine Variablen: Verwende Dim, um deine Variablen zu deklarieren. Achte darauf, dass du für den Bereich (Range) Dim Bereich As Range und für die zu erstellende Zeichenkette Dim Zeile As String nutzt.

  2. Setze deinen Bereich: Definiere den Zellbereich, dessen Werte du verketten möchtest. Beispiel:

    Set Bereich = Range("A1:D1")
  3. Erstelle das Array: Da Join nur eindimensionale Arrays verarbeitet, musst du die Werte des Bereichs in ein Variant-Array speichern:

    Dim Bereich() As Variant
    Dim i As Integer
    Dim n As Integer
    n = Range("A1:D1").Cells.Count - 1
    ReDim Bereich(n)
    For Each zelle In Range("A1:D1")
       Bereich(i) = zelle.Value
       i = i + 1
    Next zelle
  4. Verwende den Join-Befehl: Jetzt kannst du die Werte mit Join verketten:

    Zeile = Join(Bereich, "")
    MsgBox Zeile

Häufige Fehler und Lösungen

  • Fehler 13: Typenunverträglichkeit: Dieser Fehler tritt auf, wenn du versuchst, einen Range-Bereich direkt mit Join zu verarbeiten. Stelle sicher, dass du den Bereich in ein eindimensionales Array überträgst, wie oben beschrieben.

  • Ungültiger Prozeduraufruf: Dies passiert, wenn du Join falsch anwendest, z.B. wenn das Array nicht korrekt initialisiert ist oder nicht eindimensional ist.


Alternative Methoden

Falls du Join nicht verwenden möchtest, kannst du die Werte auch manuell verketten:

Sub ManuellesVerketten()
    Dim zelle As Range
    Dim result As String
    For Each zelle In Range("A1:D1")
        result = result & zelle.Value
    Next zelle
    MsgBox result
End Sub

Diese Methode funktioniert auch, wenn du keine Schleifen vermeiden willst.


Praktische Beispiele

  1. Verkettung ohne Leerzeichen:

    MsgBox Join(Array("H", "e", "l", "l", "o"), "")
  2. Verkettung mit Leerzeichen:

    MsgBox Join(Array("H", "e", "l", "l", "o"), " ")
  3. Verwendung von Range und Join:

    Sub Beispiel()
       Dim Bereich() As Variant
       Dim i As Integer
       Dim n As Integer
       n = Range("A1:D1").Cells.Count - 1
       ReDim Bereich(n)
       For Each zelle In Range("A1:D1")
           Bereich(i) = zelle.Value
           i = i + 1
       Next zelle
       MsgBox Join(Bereich, "")
    End Sub

Tipps für Profis

  • Verwendung von MsgBox zur Fehlersuche: Nutze MsgBox, um Zwischenergebnisse zu überprüfen und sicherzustellen, dass die Variablen wie gewünscht befüllt werden.

  • Eindimensionale Arrays: Achte darauf, dass du immer eindimensionale Arrays verwendest, wenn du Join anwendest. Das hilft, typbedingte Fehler zu vermeiden.

  • Berücksichtigung von Trennzeichen: Experimentiere mit verschiedenen Trennzeichen in Join, um die Ausgabe nach deinen Bedürfnissen zu gestalten.


FAQ: Häufige Fragen

1. Warum funktioniert Join nicht mit einem Range? Join kann nur mit eindimensionalen Arrays arbeiten. Wenn du ein Range verwendest, musst du zuerst die Werte in ein Array übertragen.

2. Gibt es eine Möglichkeit, Join ohne Schleifen zu verwenden? Join selbst benötigt eine Form von Schleifen, um die Werte in ein eindimensionales Array zu übertragen. Eine manuelle Verkettung ist eine Alternative, erfordert jedoch ebenfalls eine Schleife.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige