3k Aufrufe
Gefragt in Tabellenkalkulation von Mitglied (335 Punkte)
Hallo liebe Excelianer,

ich stehe gerade voll auf dem Schlauch.

Und zwar möchte ich mit Hilfe des Mid Befehls in Excel VBA Zahlen vereinzeln.

Dazu lasse ich eine Schleife laufen, was an sich kein Problem ist.

Aber der Mid Befehl selbst macht mir Probleme, weil etwas mit der Variable Currcode nitcht stimmt.

spec = Mid(Range("k" & i), currcode, 4)

Currcode ist als Integer gedimmt aber es funzt einfach nicht.

Könntet Ihr mir bitte weiter helfen?

Vielen Dank.

Peter

12 Antworten

0 Punkte
Beantwortet von saarbauer Profi (15.6k Punkte)
Hallo,

welche Werte nimmt "currcode" an?

Prüfe dies mal.

Da nur mit der Formel keine Problembewältigung möglich ist.

Gruß

Helmut
0 Punkte
Beantwortet von Mitglied (335 Punkte)
Hallo Helmut,

ich versuche meine Problemchen noch etwas besser zu beschreiben:

Ich habe z. B. folgende Zahlenreihe mit Leerzeichen dazwischen.

0166 0433 1027 1535 5600 6000

Diese will ich aufteilen, so dass ich als Ergebnis 0166, 0433 separat in verschiedenen Zellen habe.

Dafür habe ich folgenden Code geschrieben:

For l = 0 To Lng / 5
Sheets("Data").Select
signet = Lng - Lng / 5
currcode = signet / 6 * l
spec = Mid(Range("k" & i), currcode, 4)
Sheets("Specs").Select
If Range("F2") = "" Then
Range("F2").Select
Else
Range("F1").Select
Selection.End(xlDown).Select
newrow = ActiveCell.Row + 1
Range("F" & newrow).Select
End If

Selection.NumberFormat = "@"
ActiveCell.Value = spec

If Lng / 5 > 1 Or l < Lng / 5 Then

Range("A" & i & ":E" & i).Copy
Range("A" & i + 1).Select
ActiveSheet.Paste
End If

Mit diesem zähle ich die Zeichen der Zahlenkette um anschließen über die Mid Formel genau die 4 Zahlen ohne die Leerzeichen zu treffen.

Hilft das weiter?

Gruss

Peter
0 Punkte
Beantwortet von saarbauer Profi (15.6k Punkte)
Hallo,

woher hast du den wert für "Lng", ich vermute Länge und die musst du irgendwo ermitteln. In deinem Makroteil auf jeden Fall nicht.

Gruß

Helmut
0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Peter,

ich weiß nicht, ob ich Dich richtig verstanden habe, aber probier' mal folgenden Code.

[code]Option Explicit

Sub trennen()
Dim intL As Integer, strText As String, intI As Integer, intZ As Integer
strText = RTrim(Range("A1")) & " "
intL = Len(strText)
ReDim arr(0 To intL / 5, 0)
intZ = 0
For intI = 1 To intL Step 5
arr(intZ, 0) = Mid(strText, intI, 4)
intZ = intZ + 1
Next
With Range("B1:B" & intL / 5)
.NumberFormat = "@"
.Value = arr
End With
End Sub

Er listet die in A1 stehende Zahlenreihe ab B1 abwärts auf.

Gruß
Rainer
0 Punkte
Beantwortet von Mitglied (335 Punkte)
Hallo Helmut,

anbei der noch fehlende Befehl.

Lng = Len(Range("k" & i))

Lng bestimmt nichts weiter wie die Anzahl der Zeichen.

Im Bsp. 0166 0433 1027 1535 5600 6000 sind es 30, weil die Leerzeichen mitgezählt werden.

Danke Dir.

Gruss

Peter
0 Punkte
Beantwortet von saarbauer Profi (15.6k Punkte)
Hallo,

funktioniert es jetzt, da du schreibst:

Danke Dir.


Gruß

Helmut
0 Punkte
Beantwortet von
Ich würde zum Aufteilen des Zellinhalts evtl. SPLIT bevorzugen. Da braucht man sich z.B. keine Gedanken um die Länge zu machen.

Ein einfaches Beispiel (mit " " als Trennzeichen)
Sub Teilen()
Dim x, i
x = Split(ActiveCell.text, " ", -1, vbTextCompare)
For i = 1 To UBound(x)
With ActiveCell.Offset(i + 1, 0)
.NumberFormat = "@"
.Value = x(i)
End With
Next i
End Sub
Schreibt den Inhalt der aktiven Zelle (also: 0166 0433 1027 1535 5600 6000) einzeln in die Zellen unter der aktiven Zelle.

SPLIT (F1 für Hilfe zur Funktion) erzeugt ein Datenfeld, dessen Einzelelemente dann unter Angabe der Position (von 1 bis letzter Wert -> UBound(x)) ausgelesen werden können.

Mußt du natürlich in deinem Makro an deine Quell/Zielbereiche anpassen...

Gruß, Winuser
0 Punkte
Beantwortet von
Korrektur: Hab da wohl 'nen Fheler drin ;o)

For i = 0 To UBound(x)
With ActiveCell.Offset(i + 1, 0)
.NumberFormat = "@"
.Value = x(i)
End With
Next i
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Peter,

es ist nicht ganz klar, ob du nur die Zahlen einer Zelle oder mehrerer Zellen aufteilen möchtest. Ich nehme einfach mal an, dass mehrere in Spalte A untereinander aufgelistete Zahlenkombinationen zeilenweise neben der jeweiligen Zelle in die Nachbarspalten aufgeteitl werden sollen. Ich würde ebenfalls Split verwenden, wobei die Ausgabe nicht in einer Schleife erfolgen muss sondern sozusagen "auf einen Ritt" erfolgen kann:
Sub Aufteilen()
Dim lngZeile As Long
Dim arrWerte
For lngZeile = 1 To 500 '<== Anzahl anpassen
arrWerte = Split(Cells(lngZeile, 1).Value, " ")
Cells(lngZeile, 2).Resize(, UBound(arrWerte, 1)) = arrWerte
Erase arrWerte
Next lngZeile
End Sub

Bis später,
Karin
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all ^^^

ein beispiel eines beliebigen positionierten zahlenblocks

gruss nighty

Sub Beispiel()
'angenommen a1 waere 11aa22bb
'dann waere die ausgabe 22,durch den parameter 2 auf den zweiten zahlenblock verwiesen
Range("A2") = ZahlenBlockIsolierung(Range("A1"), 2)
End Sub

code]Function ZahlenBlockIsolierung(Zellen As Range, ZahlenBlock As Integer) As String
Dim Zelle As Range
Dim Zeichen As Integer
Dim schalter As Boolean
Dim BlockIndex As Integer
ReDim AnzZahlenBlock(Len([Zellen])) As String
BlockIndex = 1
If ZahlenBlock > Len([Zellen]) Then ZahlenBlock = Len([Zellen])
For Zeichen = 1 To Len([Zellen])
If Mid([Zellen], Zeichen, 1) Like "[0-9]" = True Then
AnzZahlenBlock(BlockIndex) = AnzZahlenBlock(BlockIndex) & Mid([Zellen], Zeichen, 1)
schalter = True
End If
If schalter = True And Mid([Zellen], Zeichen, 1) Like "[0-9]" = False Then
BlockIndex = BlockIndex + 1
schalter = False
End If
Next Zeichen
ZahlenBlockIsolierung = AnzZahlenBlock(ZahlenBlock)
End Function [/code]
...