| Die beiden Standard-Funktionen Split() und Join() werden von VBA ebenso geboten wie von allen anderen gängigen Programmiersprachen. | Hier wird demonstriert, wie man sie für Kalkulations-Programme (LibreOffice, OpenOffice, MS-Excel, ...) und in VBA nutzen kann. |
VBA
|
Visual Basic for Applications - Strings (Text, Zeichen) |
Kalkulation
|
Text spalten und zusammenführen in Kalkulations-Programmen (LibreOffice, MS-Excel, ...) |
| Split() | Spaltung von Text in sinnvolle Teile |
| Join() | Zusammensetzung von Text aus Bestandteilen |
| IP-Adressen | Spaltung und Zusammensetzung von IPv4 Adressen wie z.B. 38.107.179.214 |
| Datei-Pfade | Spaltung und Zusammensetzung von Pfaden wie z.B. C:\Daten\test.dat |
| Internet-Adressen | Spaltung und Zusammensetzung von URL's wie z.B. http://www.topsoft.at/pstrainer |
| Datum & Zeit | Spaltung und Zusammensetzung von Strings wie z.B. 2012-05-20 16:32:02 |
Split() für Kalkulations-Programme |
|||||||||||||||||||||||||||||||||
Aufspaltung eines StringsDie Aufgabe besteht in der Aufspaltung eines Strings an bestimmten Stellen - in diesem Beispiel: an Leerzeichen = WortGrenzen.Das Problem besteht darin, wie die einzelnen Teile zurückzugeben sind. Eine Kalkulations-Funktion kann immer nur 1 Wert zurückgeben. Lösung:
Die Aufspaltungs-Funktion pst_split() erhält
zusätzlich ein 3. Argument (index). Damit wird jenes
Element ausgewählt, welches zurückzugeben ist.Im Beispiel wird der Eingabe-Text von Zelle A1 (grün unterlegt) in Worte getrennt. In B3 wird die Anzahl der Worte berechnet, in den folgenden Zellen die einzelnen Worte zurückgegeben. Alle Ergebnisse sind in blauer Schrift hervorgehoben. |
|
||||||||||||||||||||||||||||||||
|
Argumente:
•
Der zu spaltende Text (hier in Zelle A1)
wird immer als 1. Argument übergeben.• Der Separator-String wird als 2. Argument übergeben. Mit einem Leerzeichen (hier verwendet) wird nach Worten getrennt. • Der ganzzahlige Index wird als 3. Argument übergeben. |
Rückgabe:
•
Mit Index=0 wird die Anzahl der durch Spaltung erhaltenen
Elemente (Worte) zurückgegeben.• Mit jedem anderen Index wird das jeweilige Element zurückgegeben. • Wenn ein Index die Anzahl der Elemente übertrifft, dann wird ein leerer String zurückgegeben. |
||||||||||||||||||||||||||||||||
|
Die rechts vorgestellte VBA-Funktion pst_split() dient zur
Rückgabe eines (!) Elements nach Spaltung des Strings. Die Funktion erwartet 3 Argumente: text ... Der zu spaltende String separator ... Der Trenn-String, meist nur ein einzelnes TrennZeichen. index ... steuert die Rückgabe Die String-Variable text wird in das → Array sa gespalten. Danach wird je nach dem Wert von index entschieden: • Für index<=0 wird die Anzahl der gefundenen Elemente UBound((sa)+1) zurückgegeben. • Wenn der index ein existierendes Element sa(index-1) bezeichnet, dann wird dieses zurückgegeben. • In jedem anderen Fall wird ein leerer String zurückgegeben. - Sie können alternativ einen FehlerWert zurückgeben. |
Visual Basic (VBA) Funktion
zur Rückgabe eines Elements aus einem aufgespaltenen String
Function pst_split(text As String, _
Bei der Anwendung wird die Funktion für jedes angeforderte Element erneut
berechnet: Dieser an sich unnötige Aufwand ist normalerweise so gering,
dass er nicht bemerkt wird.
separator, _
Optional index As Integer = 0) As String
sa = Split(text, separator)
End Function
Select Case index
Case Is <= 0
End Select
pst_split = CStr(UBound(sa) + 1)
Case Is < (UBound(sa) + 2)
pst_split = sa(index - 1)
Case Else
pst_split = ""
Die Funktion ist als Kompromiss wesentlich einfacher anzuwenden als z.B. eine {Array-Formel}, die nur von wenigen AnwenderInnen beherrscht wird. |
||||||||||||||||||||||||||||||||
Join() für Kalkulations-Programme |
||||||||||||||||||||||||||||
Zusammensetzung eines StringsDie Aufgabe besteht darin, den Inhalt (Wert) mehrerer Zellen zu einem String zusammenzufügen, mit oder ohne einen Verbindungs-String.Argumente:
•
Der Bereich (hier A1:C3)
aller Zellen, die zusammenzusetzen sind, wird als 1. Argument übergeben.• Der Verbindungs-String wird als 2. Argument übergeben. Dieser String bzw. dieses Zeichen wird im Ergebnis zwischen die einzelnen Elemente eingesetzt. Rückgabe:
•
Der zusammengesetzte Text wird zurückgegeben. Er besteht aus dem Inhalt aller
algegebenen Zellen, verbunden durch je einen Verbindungs-String.
|
|
|||||||||||||||||||||||||||
|
Alternative:
Diese Aufgabe kann man auch mit Standard-Mitteln von Kalkulations-Programmen ausführen:
Mit dem & Operator werden Strings verknüpft:
=A1&"-"&B1&"-"&C1&"-"&A2&"-"&B2&"-"&C2&"-"&A3&"-"&B3&"-"&C3
|
||||||||||||||||||||||||||||
|
Die rechts vorgestellte VBA-Funktion pst_join() dient zur
Rückgabe eines (!) Elements nach Spaltung des Strings. Die Funktion erwartet 2 Argumente: bereich ... Der (rechteckige) Bereich aller Zellen, deren Inhalt zusammenzuführen ist. join_char ... Der Verbindungs-String, meist nur ein VerbindungsZeichen. Die VBA-Funktion Join() wird in dieser Version nicht benötigt, weil der AusgabeString direkt schrittweise zusammengesetzt wird. |
Visual Basic (VBA) Funktion
zur Zusammensetzung eines Strings aus dem Inhalt aller Zellen eines Bereichs
Function pst_join( _
bereich As Range, _
Dim i As IntegerOptional join_char As String = "") As String Dim s As String
s = ""
End Function
For i = 1 To bereich.Count
If i > 1 Then s = s & join_char
Nexts = s & bereich(i).Value pst_join = s |
|||||||||||||||||||||||||||
|
Die rechts vorgestellte Version VBA-Funktion pst_join()
funktioniert genauso, ist jedoch anders programmiert. Diese Version zeigt, wie man die
VBA StandardFunktion Join() verwenden kann: • Zuerst wird mit ReDim die Dimension des → Arrays sa eingestellt. • Danach wird der Inhalt aller Zellen des Bereichs mit Hilfe der For-Schleife in das Array sa übertragen. • Zuletzt werden Array-Elemente mit Join() verknüpft. |
Alternative Version der
Visual Basic (VBA) Funktion pst_join()
Function pst_join(bereich As Range, _
Optional join_char As String = "") As String
Dim i, imax As IntegerDim sa() As String
imax = bereich.Count
End FunctionReDim sa(imax - 1) For i = 1 To imax sa(i - 1) = bereich(i).Value
Nextpst_join = Join(sa, join_char) |
|||||||||||||||||||||||||||
IP-Adressen: Spalten und Zusammensetzen |
|||||||||||||||||||||||||||||||||||||||||||||||||
IPv4-String -> ZahlEine IPv4 Adresse ist ein typisches Beispiel für ein "strukturierten String": Eine Adresse wie z.B.38.107.179.214
wird typisch als String dargestellt: 4 Dezimalzahlen mit Werten von je 0...255
bezeichnen die 4 Bytes = 32 Bit der Adresse, getrennt durch .
Punkte.Die Aufspaltung eines IPv4 Strings ist mindestens in diesen Fällen sinnvoll: • Die ersten 3 Bytes sind normalerweise für alle Geräte eines lokalen Netzwerks (LANs) gleich, das 4. Byte muss unterschiedlich sein. Zur Analyse ist es praktisch, den String an den Punkten zu spalten. Die Umwandlung des IPv4-Strings in eine ganze Dezimalzahl erfordert eine Spaltung, danach Berechnung der numerischen Adresse. |
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
Die ↑ oben vorgestellte Funktion pst_split()
wird hier verwendet, um die 4 Bytes der IP-Adresse zu isolieren. Die Standard-Funktion WERT() wandelt den jeweils erhaltenen String in eine Zahl um, mit der man (wie z.B. in Zelle A6) rechnen kann. |
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
Die rechts vorgestellte Version VBA-Funktion ip_string_to_num()
spaltet den als Argument übergebenen IPv4-String in seine 4 Teile.
Zur Vereinfachung sind alle Tests weggelassen, d.h. diese Version funktioniert
nur mit einem fehlerfreien IPv4-String, der alle 4 Teile enthält, mit Punkten
getrennt, jeder Zahlenwert im Bereich 0...255 Das mit Split() erhaltene → Array sa enthält 4 Elemente als Strings. Diese werden mit Funktion Val() in Zahlen umgewandelt und zur Berechnung des numerischen Werts verwendet. |
Visual Basic (VBA) Funktion
zur Berechnung des numerischen Werts einer als String vorgegebenen IPv4-Adresse:
Function ip_string_to_num(ip As String) As Double
Dim i As Integer Dim sa() As String Dim ipnum As Variant
sa = Split(ip, ".")
End Function
ipnum = 0 For i = 0 To UBound(sa) ipnum = ipnum * 256 + Val(sa(i))
Nextip_string_to_num = ipnum |
||||||||||||||||||||||||||||||||||||||||||||||||
Zahl -> IPv4-StringDie Zahlenwerte von 32-Bit IPv4-Adressen sind unhandlich, aber notwendig, wenn man damit rechnen will.• Hier wird gezeigt, wie man daraus einen IP-String in gewohnter Form berechnen kann: Im Bereich A2:D6 wird die Berechnung mit Standard Kalkulations-Funktionen durchgeführt. Eine Ausnahme ist nur die auf dieser Seite vorgestellte ↑ Funktion pst_join() zur Zusammensetzung des IPv4-Strings. |
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
Der Zahlenwert der IP-Adresse wird als Variant ipnum
übergeben. • Zur Vereinfachung sind alle Tests weggelassen. Es wird z.B. nicht geprüft, ob das Argument ipnum eine Zahl ist, oder ob sie im erlaubten Bereich 0...ipnum...2^32-1 liegt. • Der String wird schrittweise in der Variablen ip zusammengesetzt. • Die For-Schleife wird 4mal durchlaufen. In jedem Durchgang wird eine IP-'Ziffer' als Dezimalzahl 0..di..255 berechnet und in den String eingesetzt. • In der Variablen d wird der Stellenwert einer Ziffer des von IPv4 verwendeten 256er Systems berechnet. Der aktuelle Wert von ipnum wird durch den Stellenwert dividiert und abgeschnitten, das ergibt die jeweilige IP-Ziffer 0..di..255 • Der abgeschnittene Rest ergibt den neuen Wert der Variable ipnum |
Visual Basic (VBA) Funktion
zur Berechnung eines IPv4-Strings aus dem 32-Bit Zahlenwert der Adresse.
Function ip_num_to_string(ByVal ipnum As Variant) As String
Dim i, di As Integer Dim ip As String Dim d As Variant
ip = ""
End Function
For i = 0 To 3
d = 256 ^ (3 - i)
Nextdi = Int(ipnum / d) ipnum = ipnum - d * di If i > 0 Then ip = ip & "." ip = ip & CStr(di) ip_num_to_string = ip |
||||||||||||||||||||||||||||||||||||||||||||||||
Datei-Pfade: Spalten und Zusammensetzen |
|||||||||||||||||||||||||||||||
| Ein absoluter Datei-Pfad ist ein String, welcher den gesamten Weg zu einem Verzeichnis (Ordner) oder einer Datei angibt - Beginnend von der 'Wurzel' des Dateisystems bis zum Ziel. Ein relativer Pfad beschreibt den Weg, ausgehend von einem anderen Startpunkt (wird hier nicht weiter erwähnt). |
•
Linux verwendet nur eine einzige Wurzel und den /
Slash als Pfad-Trennzeichen. • Windows verwendet jedes 'Volume' als eigene Wurzel und den \ BackSlash als Trennzeichen. |
||||||||||||||||||||||||||||||
|
Im Beispiel rechts wird ein (Windows)-Pfad in der grün unterlegten
Zelle A1 vorgegeben. ● Mit der auf dieser Seite vorgestellten ↑ Funktion pst_split() wird der Pfad an allen \ Zeichen in seine Bestandteile gespalten und im Bereich A3:A6 angezeigt. In Zelle A2 wird die Anzahl der gefundenen Teile ausgegeben. ● Danach wird gezeigt, wie man die Teile mit ↑ Funktion pst_join() wieder zu einem Pfad zusammensetzt. Wenn man die Anzahl der Teile nicht voraussetzt, dann muss man den zu verwendenden Bereich Live berechnen. Das Beispiel berechnet die Bereichs-Adresse in Zelle A8 und verwendet diese mit → Funktion INDIREKT() zur Zusammenführung in Zelle A9 • Für Linux-Pfade verwendet man das Standard Trennzeichen / an Stelle des Windows-Backslash. |
|
||||||||||||||||||||||||||||||
Internet-Adressen: Spalten und Zusammensetzen |
|
|
Internet-Adressen (URLs) sind im einfachsten Fall ähnlich aufgebaut wie
(Linux) Datei-Pfade. Man kann sie mit den Separator /
Slash in ihre Bestandteile zerlegen und wieder zusammensetzen, so wie im Kapitel
↑ Datei-Pfade
dieser Seite gezeigt. Beispiel: |
Eine Internet-Adresse kann jedoch auch andere Teile enthalten.
Die Aufspaltung in die Bestandteile ist kompliziert, weil verschiedene
Separator-Zeichen verwendet werden und weil an verschiedenen Position
optionale Teile enthalten sein können. ♦ Details zum Aufbau einer kompletten Internet-URL-Adresse |
| Kapitel in Arbeit. | Kapitel in Arbeit. |
Datum & Zeit: Spalten und Zusammensetzen |
||||||||||||||||||||||||||||||||||||||||||||||
Datum & Zeit - InternAlle Kalkulations-Programme und VBA verwalten Datum und Zeit intern als Gleitkomma-Zahlen im → Format Y1900.
Live-Y1900: JETZT()=?• Eine Y1900-Zahl entspricht - abgesehen von einem notorischen M$-Fehler - der Anzahl der Tage seit 1900-01-01. • Die Zeit entspricht dem Nachkomma-Anzeil, d.h. jede Stunde = 1/24 = 0.04167 • Alle Kalkulations-Programme bieten Standard-Funktionen, um aus einem Y1900-Datum die Bestandteile (Jahr, Monat, Tag, Stunde, Minute, Sekunde) zu berechnen und umgekehrt daraus ein Datum zusammenzusetzen. • Sowohl Kalkulations-Programme als auch VBA geben ungefragt die Zeit der lokalen Zeitzone an und bieten derzeit leider keine Funktionen zur Umwandlung in die Weltzeit UTC oder in eine andere Zeitzone. ♦ Details zu Datum und Zeit, Y1900, Unix-Timestamp, Zeitzonen, Datum & Zeit Server (NTP), auf Linux, auf Windows |
Datum & Zeit - StringDie Anzeige einer beliebigen Zahl in einem Kalkulations-Programm wird durch das Format gesteuert. Das → Standard ISO-8601 Format ist als einziges international eindeutig und wird von LibreOffice und OpenOffice angeboten. Auf MS-Excel muss man je nach Version ein Benutzer-definiertes Format angeben:JJJJ-MM-TT hh:mm:ss
Das Live-Ergebnis der Funktion =JETZT(),
nach ISO-Standard formatiert:
YYYY-MM-TT hh:mm:ss
Ein Standard ISO_String ist besonders leicht zu verarbeiten: Alle Bestandteile haben eine fixe Länge und befinden sich an fixen Positionen. Visual Basic (VBA): Umwandlung eines Y1900-Datums in einen (ISO)-formatierten String: iso = Format(Now(), "yyyy-mm-dd HH:MM:SS")
|
|||||||||||||||||||||||||||||||||||||||||||||
|
Im Beispiel rechts wird das aktuelle Datum + Zeit angezeigt
und in die Bestandteile gespalten. • Die Zellen A1 und A2 enthalten sie gleiche Funktion, sind jedoch unterschiedlich formatiert (A1 nach ISO-Standard, A2 als Standard-Zahl) • Die Standard-Funktionen in Spalte B liefern das gleiche Ergebnis wie die VBA-Formeln in Spalte C (rechts werden in blauer Schrift die Daten angezeigt). |
|
|||||||||||||||||||||||||||||||||||||||||||||
Spaltung eines Standard-Datum-Strings:Diese Funktion hat nur geringen praktischen Wert, da man die gleichen Daten mit den Standard Kalkulations-Formeln erhält.• Die Funktion erwartet 2 Argumente: y1900...Eine Y1900 Gleitkomma-Zahl index...Ganze Zahl 0...5 zur Auswahl der gewünschten Elements. • Aus dem Datum y1900 wird mit der Standard VBA-Funktion Format() ein ISO-String erzeugt. • Der String iso wird an seinem Leerzeichen in das Array isoa mit den 2 Elementen Datum und Zeit gespalten. • Wenn index<3 wird ein Datum-Bestandteil gesucht. Das Element isoa(0) wird in 3 Teile gespalten und je nach index Jahr, Monat oder Tag zurückgegeben. • Wenn index>=3 wird ein Zeit-Bestandteil gesucht. Das Element isoa(1) wird in 3 Teile gespalten und je nach index Stunde, Minute oder Sekunde zurückgegeben. |
Visual Basic
(VBA) Funktion zur Aufspaltung eines
ISO-8601 Strings.
Function datim_split( _
Optional y1900 As Double = -1, _
Dim idt As IntegerOptional index As Integer = 0) As Integer Dim iso, isoa() As String
If y1900 < 0 Then y1900 = Now()
End Function
If index < 0 Or index > 5 Then index = 0 iso = Format(y1900, "yyyy-mm-dd HH:MM:SS") isoa = Split(iso, " ") If index < 3 Then
isoa = Split(isoa(0), "-")
idt = isoa(index)
isoa = Split(isoa(1), ":")
End Ifidt = isoa(index - 3 datim_split = idt |
|||||||||||||||||||||||||||||||||||||||||||||
|
Im Beispiel rechts werden alle 6 Datum+Zeit Elemente als Bereich
an die beiden Funktionen übergeben. • Funktion datim_join_y1900() gibt eine Y1900-Zahl zurück, die man als Datum und/oder Zeit formatieren und mit der man rechnen kann. • Funktion datim_join_iso() gibt einen Standard-String zurück. |
|
|||||||||||||||||||||||||||||||||||||||||||||
Berechnung von Y1900 aus den BestandteilenDie Funktion datim_join_y1900() erwartet einen Bereich datim_range von maximal 6 Zellen als Argument.• Der Bereich wird zeilenweise verarbeitet, d.h. die Teile können sich in einer Zeile oder in einer Spalte oder in einem rechteckigen Bereich befinden, sie müssen lediglich hierarchisch Jahr -> Sekunde angeordnet sein. Wenn der Bereich kleiner ist, dann werden Standardwerte verwendet. • In das Array idt der Datum+Zeit Elemente werden Standardwerte eingetragen. • Danach werden die Zellen des Bereichs datim_range in einer Schleife durchlaufen. Zulässige Daten werden in das Array idt übernommen, unzulässige durch die aktuellen Daten ersetzt. • Zuletzt wird das Ergebnis in der Gleitkomma-Variablen y1900 berechnet und zurückgegeben. |
Visual Basic (VBA) Funktion
zur Berechnung einer Y1900 Gleitkomma-Zahl aus den Bestandteilen von Datum und Zeit.
Function datim_join_y1900(datim_range As Range) As Double
Dim d, i, imax, idt(5) As Integer Dim y1900 As Double
idt(0) = Year(Now())
End Function
idt(1) = 1 idt(2) = 1 For i = 3 To 5 idt(i) = 0
Nextimax = datim_range.Count - 1 If imax > 5 Then imax = 5 For i = 0 To imax
d = Int(datim_range(i + 1).Value)
NextSelect Case i
Case 0
End SelectIf d < 1900 Then d = Year(Now())
Case 1
If d < 1 Or d > 12 Then d = Month(Now())
Case 2
If d < 1 Or d > 31 Then d = Day(Now())
Case 3
If d < 0 Or d > 23 Then d = Hour(Now())
Case 4
If d < 0 Or d > 59 Then d = Minute(Now())
Case 5
If d < 0 Or d > 59 Then d = Second(Now())
idt(i) = d y1900 = DateSerial(idt(0), idt(1), idt(2)) y1900 = y1900 + TimeSerial(idt(3), idt(4), idt(5)) datim_join_y1900 = y1900 |
|||||||||||||||||||||||||||||||||||||||||||||
Erzeugung eines ISO-Strings aus den ElementenDie Funktion datim_join_iso() erwartet einen Bereich datim_range von maximal 6 Zellen als Argument.• Der Bereich wird zeilenweise verarbeitet, so wie bei Funktion datim_join_y1900() im Absatz ↑ oberhalb. • In das Array idt der Datum+Zeit Elemente werden Standardwerte eingetragen. • Danach werden die Zellen des Bereichs datim_range in einer Schleife durchlaufen. Hier wurde auf eine Korrektur unzulässiger Daten verzichtet. • Da ein ISO-String 3 verschiedene Trennzeichen verwendet, wird der Ausgabe-String iso nicht mit Funktion Join() sondern schrittweise aus den Elementen von Array idt aufgebaut. |
Visual Basic (VBA) Funktion
zur Erzeugung eines ISO-8601 Strings aus den Bestandteilen von Datum und Zeit.
Function datim_join_iso(datim_range As Range) As String
Dim d, i, imax, idt(5) As Integer Dim iso As String
idt(0) = Year(Now())
End Function
idt(1) = 1 idt(2) = 1 For i = 3 To 5 idt(i) = 0
Nextimax = datim_range.Count - 1 If imax > 5 Then imax = 5 For i = 0 To imax
d = Int(datim_range(i + 1).Value)
Nextidt(i) = d iso = Right("0000" & CStr(idt(0)), 4) For i = 1 To 5
Select Case i
Next
Case Is < 3
End Selectiso = iso & "-"
Case 4
iso = iso & " "
Case Else
iso = iso & ":"
iso = iso & Right("00" & CStr(idt(i)), 2 datim_join_iso = iso |
|||||||||||||||||||||||||||||||||||||||||||||
|
Letzte Änderung dieser Seite: 2011-12-01 10:18:47
|