1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

VBA: Aufteilen nach Zeichenanzahl

Discussion in 'Programmieren' started by R3G3R, Mar 18, 2013.

Thread Status:
Not open for further replies.
  1. R3G3R

    R3G3R Byte

    Hallo Community,

    mich hat das programmieren mal wieder "gepackt" nur scheiter ich an einer kleinen sache.... Ich möchte den Inhalt einer Excelzelle nach einer bestimmten zeichenanzahl (egal von hinten oder von vorne) auf Zwei andere zellen aufteilen. Ist dieses grundsätzlich möglich auch ohne ein Trennzeichen? oder habe ich zu hohe erwartungen an VBA gestellt?


    Lg
    R3G3R
     
  2. VB-Coder

    VB-Coder Megabyte

    Klar ist das möglich.

    Nehmen wir an in Zelle A1 steht folgender Inhalt

    A1
    Jetzt willst du den Inhalt z.B. auf Zelle B1 und C1 wie folgt aufteilen

    B1
    C1
    Der erste und grundlegende Schritt wäre nun, sich den Inhalt aus A1 in eine Variable zu holen.

    PHP:
    DIM mytxt AS String
    mytxt 
    Range("A1").value
    Jetzt muss man den Text an der gewünschten Stelle aufsplitten. Das kann man auf mehrere Wege erreichen.

    Methode 1: Abzählen

    Sprich also man zählt vorher ab wieviele Zeichen man bis zu dem Punkt hat, wo der Inhalt abgetrennt werden soll. Nicht vergessen Leerzeichen mit zu zählen ! In unserem Beispiel soll nach dem ! Abgeschnitten werden. Also nach dem 12. Zeichen von Links. Somit besteht der Inhalt für B1 also aus den ersten 12 Zeichen von Links. Dann zählen wir weiter, da wir den Rest ja für C1 benötigen. Diesmal zählen wir jedoch von Rechts bis zu dem Leerzeichen nach dem Ausrufezeichen. Sprich also, wir brauchen die 20 Zeichen von Rechts um C1 zu füllen. Zum Abtrennen aus dem String können wir die beiden Funktionen Left$ und Right$ verwenden.

    PHP:
    DIM wertB1wertC1 AS String
    wertB1 
    Left$(mytxt,12)
    wertC1 Right$(mytxt,20)
    Nun müssten wir nurnoch die Werte wertB1 und wertC1 in die entsprechenden Zellen B1 und C1 schreiben

    PHP:
    Range("B1") = wertB1
    Range
    ("C1") = wertC1
    Komplett würde das ganze dann also so aussehen
    PHP:
    Dim mytxt,wertB1,wertC1 AS String
    mytxt 
    Range("A1").value
    wertB1 
    Left$(mytxt,12)
    wertC1 Right$(mytxt,20)
    Range("B1") = wertB1
    Range
    ("C1") = wertC1
    Man könnte den Code auch noch extrem verkürzen. Das ganze könnte im Extremfall dann in etwa so aussehen:
    PHP:
    Range("B1") = Left$(Range("A1").value,12)
    Range("C1") = Right$(Range("A1").value,20)
    Eine weitere Methode wäre es den Inhalt in ein Array zu holen. Sprich also in einzelne Wörter zu zerlegen.

    PHP:
    Dim mytxt AS String
    Dim myArray 
    AS Variant
    mytxt 
    Range("A1").value
    myArray 
    Split(mytxt" ")
    Jetzt könnte man das ganze beliebig zusammensetzen. Der Inhalt von A1 ist in myArray jetzt geteilt. Es wurde alles getrennt was ein Leerzeichen dazwischen hat.

    myArray(0) beinhaltet: Hallo
    myArray(1) beinhaltet: Welt
    myArray(2) beinhaltet: !
    myArray(3) beinhaltet: Dies
    myArray(4) beinhaltet: ist
    myArray(5) beinhaltet: der
    myArray(6) beinhaltet: Inhalt
    myArray(7) beinhaltet: .

    Es gibt noch unzählige weiterer Möglichkeiten. Welches die beste ist, hängt immer vom Ausgangsmaterial ab und dem erwarteten Ergebnis.
     
    Last edited: Mar 18, 2013
  3. R3G3R

    R3G3R Byte

    die funktion mit left und right funktioniert super. danke.

    nur habe ich bislang nicht mit der range funktion gearbeitet und wollte das ganze über mehrere zellen einer spalte "dynamisch" machen......hat nicht wie gewünscht geklappt.....

    dann hab ich das ganze über cells probiert.... auch das hat er mir um die ohren gehauen :-(

    hättest du da noch mal ein beispiel?


    lg
     
  4. VB-Coder

    VB-Coder Megabyte

    Kannst du ein konkretes Beispiel geben ? Sodass ich mir das ganze auch vor Augen führen kann. Irgendwie stehe ich gerade auf dem Schlauch. Ich verstehe dein Vorhaben nämlich nicht.

    Was ist wo genau und wo soll es hin ? Ist der Inhalt fest oder ändert er sich ?

    Also wie gesagt ein konkretes Beispiel, damit auch ein Außenstehender sich das vorstellen kann wäre von Vorteil.
     
  5. R3G3R

    R3G3R Byte

    das beispiel sollst du bekommen. in der spalte E stehen 4 oder 6 stellige zahlen.
    ist die zahl 4 stellig passiert nichts.
    ist die zahl 6 stellig soll die erste stelle von links in spalte D und die 4stellen von rechts wieder in E. zB 904980; 9=D und 4980=E die 0 entfällt.

    das funktioniert fest fuer nur eine zelle mit deinem o.g. beispiel super nur moechte ich dies jetzt fuer die komplette spalte E evtl beschränkt auf 5000 zeilen.

    hoffe ich habe mich nicht zu undeutlich ausgedrueckt
     
  6. VB-Coder

    VB-Coder Megabyte

    Jetzt habe auch ich verstanden, was du willst ;)

    Beispiel folgt...


    EDIT: So jetzt hatte ich mal eben 10 Minuten Zeit was zusammen zu basteln

    Versuchs mal mit folgendem Beispiel:
    PHP:
    Dim i As Integer
     
    For 1 To Range("E" Rows.Count).End(xlUp).row
        
    If IsNumeric(Range("E" i)) And Len(Range("E" i)) = 6 Then
            Dim tmpAll
    ,tmpDtmpE As String
            tmpAll 
    Range("E" i).Value
            tmpD 
    Left$(tmpAll,1)
            
    tmpE Right$(tmpAll,4)
            
    Range("D" i) = tmpD
            Range
    ("E" i) = tmpE
    Next i
    Habs jetzt nicht getestet - sollte aber funktionieren.

    Es werden alle gefüllten Felder in E geprüft, ob sie eine Zahl enthalten und ob diese 6 stellig ist. Wenn beide Bedingungen erfüllt sind, wird die erste Ziffer in die entsprechende Zelle in Zeile D geschrieben und die letzten 4 Ziffern in die entsprechende Zelle in Zeile E. Der aktuelle Inhalt von E (also die 6stellige Zahl) geht verloren bzw. wird überschrieben.

    Falls was nicht funktioniert einfach melden. Wenns geht, wäre ein Feedback auch schön ;)
     
    Last edited: Mar 19, 2013
  7. R3G3R

    R3G3R Byte

    ich bin wunschlos glücklich ^.^ danke, auch im namen meiner kollegen in der buchhaltung :)

    funktioniert einwandfrei. Fehlte nur ein Kleines End If

    PHP:
    Dim i As Integer
     
    For 1 To Range("E" Rows.Count).End(xlUp).row
        
    If IsNumeric(Range("E" i)) And Len(Range("E" i)) = 6 Then
            Dim tmpAll
    ,tmpDtmpE As String
            tmpAll 
    Range("E" i).Value
            tmpD 
    Left$(tmpAll,1)
            
    tmpE Right$(tmpAll,4)
            
    Range("D" i) = tmpD
            Range
    ("E" i) = tmpE
         End 
    If
    Next i  
     
Thread Status:
Not open for further replies.

Share This Page