Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
492to496
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
492to496
492to496
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Excel2003 und 97 (Befehl "Split")

Excel2003 und 97 (Befehl "Split")
01.10.2004 07:09:11
chris b
Hallo VBALer,
habe ein kleines Problem,und zwar benutze ich momentan Excel2003 und habe darunter ein Makro das auch funktioniert.
Aber führe ich diese bei Excel97 aus kommt bei dieser Zeile ein fehler.
s() = Split(s1, vbCrLf)
Das Programm meckert das er Split nicht kennt.Diese Befehl liest Zeilenweiße in S() ein. Wie kann ich diesen Befehl in Excel 2003 zum laufen bringen?
Danke für eure Hilfe Christian !!

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Excel2003 und 97 (Befehl "Split")
01.10.2004 10:57:21
Axel
Hallo Christian,
die Funktion Split() gibt es ebenso wie einige andere (Join(), Replace(), InStrRev()) erst seit Excel 2000, respektive VBA6.
Hier ein Workaround, der Split() als selbstgeschriebene Funktion nachbildet.
Du kannst den Code 1:1 übernehmen. Durch die Einschränkung für die bedingte Compilierung wird die Funktion ab Excel2000 aufwärts nicht kompiliert und es kommt daher auch zu keinen Namenskonflikten.
Bitte beachten, dass unter Excel97 keine String-Arrays() zugewiesen werden können, ggf. mußt du da deinen eigenen Code etwas anpassen.
Gruß
Axel


#If VBA6 = 0 Then
Public Function Split( _
   ByVal Expression As String, _
   Optional ByVal Delimiter As Variant = " ", _
   Optional ByVal Limit As Long = -1, _
   Optional ByVal Compare As Integer = vbBinaryCompare _
   ) As Variant
   
   ' die eigentlich korrekte Deklaration des letzten Elementes Compare vom
   ' Typ vbCompareMethod (bereits unter Excel 97 bekannt) führt
   ' zu einem Fehler "Automatisierungstyp in Visual Basic nicht unterstützt"
   ' Deswegen wird Compare hier als integer-Typ deklariert
   
   ' Das in der Originalversion verwendete optionale Argument Compare
   ' zur Festlegung der Vergleichsmethode wird hier nicht verwendet
   
   Const C_DIMSIZE As Long = 128
   
   Dim astr() As String  ' Array, dass zurückgegeben wird
   Dim lngLimit As Long
   Dim As Integer, intLastPos As Integer, intPos As Integer
   
   If (Len(Delimiter) = 0) Then
      
      ' gemäß Konvention:
      ' Wenn delimiter eine Zeichenfolge der Länge Null ist, wird ein aus einem
      ' Element bestehendes Datenfeld, das die gesamte Zeichenfolge von expression
      ' enthält, zurückgegeben.
         
      ReDim astr(0)
      astr(0) = Expression
     
   Else
   
      ' max. Anzahl setzen
      ' da der Funktionsparameter Limit hier geändert wird, und
      ' die Syntax der Originalfunktion (ByRef statt ByVal) beibehalten bleiben
      ' soll, wird hier eine lokale Variable verwendet
      ' -1 da der erste Index des Array = 0 und nicht 1 ist
      Select Case Limit
         Case -1
            ' -1 ist der Default-Wert und bedeutet alle Teilstrings sollen
            ' zurückgegeben werden
            lngLimit = 99999
         
         Case Is < 1:
            ' falsches Limit angegeben
            ' die Behandlung der Übergabe des Wertes 0 in der Originalfunktion,
            ' nämlich ein Array der Dimension(-1) zurückzugeben, kann hier nicht
            ' simuliert werden
            Err.Raise 5
            
         Case Else
            lngLimit = Limit - 1
            ' Limit -1 da der erste Index des Array = 0 und nicht 1 ist
      End Select
      
      Do
         ' Position des Trennzeichens/-Strings finden
         ' dabei Start der Suche nach letztem gefundenen Trenner beginnen
         intPos = InStr(intPos + 1, Expression, Delimiter)
         
         ' Trennzeichen-/String gefunden und Limit noch nicht erreicht
         If (intPos > 0 And i < lngLimit) Then
            
            ' Array (neu) dimensionieren
            If (i Mod C_DIMSIZE = 0) Then ReDim Preserve astr(i + C_DIMSIZE)
            
            ' Teilbereich zuweisen
            astr(i) = Mid(Expression, intLastPos + IIf(i = 0, 1, Len(Delimiter)), _
                          intPos - intLastPos - IIf(i = 0, 1, Len(Delimiter)))
            
            ' Position merken
            intLastPos = intPos
            
         ' keine (weiteren) Trennzeichen-/Strings enthalten
         ' oder aber das Limit erreicht
         Else
            ' Array gg. neu dimensionieren
            If (i Mod C_DIMSIZE = 0) Then ReDim Preserve astr(i + C_DIMSIZE)
         
            ' dann den Rest zuweisen
            astr(i) = Right(Expression, Len(Expression) - intLastPos - _
                           (Len(Delimiter) - 1))
                      
            ' Array auf korrekte Größe dimensionieren
            ReDim Preserve astr(i)
            
         End If
         
         i = i + 1
         
      ' Schleife solange laufen lassen wie Trenner gefunden werden
      ' und das Limit noch nicht überschritten ist
      Loop While (intPos And i <= lngLimit)
   End If
   
   ' Array zurückgeben
   Split = astr
End Function
#End If

     Code eingefügt mit Syntaxhighlighter 2.5

Anzeige
AW: Excel2003 und 97 (Befehl "Split")
01.10.2004 12:58:13
Chris b
Hallo Axel,vielen Dank für deine Supertolle Hilfe !!
Kann der Code zwar erst wieder am Mo testen weil ich momentan wieder bei Office 2000 Bin aber bin mir sicher das es klappt ! Danke und schönes We grüße Christian

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige