過去ログ

                                Page     615
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼配列(Split)に関して  jin 03/1/27(月) 20:08
   ┗Re:配列(Split)に関して  Hirofumi 03/1/27(月) 20:25
      ┗Re:配列(Split)に関して  jin 03/1/27(月) 20:32
         ┗Re:配列(Split)に関して  Hirofumi 03/1/27(月) 21:02

 ───────────────────────────────────────
 ■題名 : 配列(Split)に関して
 ■名前 : jin
 ■日付 : 03/1/27(月) 20:08
 -------------------------------------------------------------------------
   お願いします〜〜m(_ _)m

データの取り込み処理を作成しておりまして、csvファイルをline input を用いて配列に入れてからsplit関数を使ってカンマ区切り(、)ごとにデータを区切っております。
再配列とでもいうかのような処理を行っていたところ、EXCEL2000では稼動して、
EXCEL97では稼動できませんでした。
このSplit関数にきり変わる、EXCEL97でも使用可能な関数がありませんか?
どうかお願いします。
非常に困ってます。
宜しくお願いします。
 ───────────────────────────────────────  ■題名 : Re:配列(Split)に関して  ■名前 : Hirofumi <hirofumi@venus.dti.ne.jp>  ■日付 : 03/1/27(月) 20:25  -------------------------------------------------------------------------
   >このSplit関数にきり変わる、EXCEL97でも使用可能な関数がありませんか?

Excel97には、有りません
ただし、VBAで似た様な物を作る事は可能です
以下に私のコードを書いておきます、ただし処理速度は遅いので宜しく
バグが有ったらゴメン

例1、CSVの切り出し専用、ダブルクォーツ等も行う

Public Function SplitLine(ByVal strLine As String, _
          Optional strDelimiter As String = ",", _
          Optional strQuote As String = """", _
          Optional strRet As String = vbCrLf, _
          Optional blnMultiLine As Boolean = False) As Variant

'      strLine     :分割元と成る文字列
'      strDelimiter  :区切り文字
'      SplitLine    :戻り値、切り出された文字配列

  Dim lngDPos As Long
  Dim vntData() As Variant
  Dim lngStart As Long
  Dim i As Long
  Dim strField As String
  Dim lngLength As Long
  
  i = 1
  lngStart = 1
  lngLength = Len(strLine)
  blnMultiLine = False
  
  Do
    ReDim Preserve vntData(1 To 1, 1 To i)
    If Mid(strLine, lngStart, 1) <> strQuote Then
      lngDPos = InStr(lngStart, strLine, strDelimiter, _
                          vbBinaryCompare)
      If lngDPos > 0 Then
        strField = Mid(strLine, lngStart, lngDPos - lngStart)
        lngStart = lngDPos + 1
      Else
        strField = Mid(strLine, lngStart)
        lngStart = lngLength + 1
      End If
    Else
      lngStart = lngStart + 1
      Do
        lngDPos = InStr(lngStart, strLine, strQuote, _
                          vbBinaryCompare)
        If lngDPos > 0 Then
          strField = strField & Mid(strLine, lngStart, _
                          lngDPos - lngStart)
          lngStart = lngDPos + 1
          Select Case Mid(strLine, lngStart, 1)
            Case ""
              Exit Do
            Case strDelimiter
              lngStart = lngStart + 1
              Exit Do
            Case strQuote
              lngStart = lngStart + 1
              strField = strField & strQuote
          End Select
        Else
          blnMultiLine = True
          strField = Mid(strLine, lngStart) & strRet
          lngStart = lngLength + 1
          Exit Do
        End If
      Loop
    End If
    vntData(1, i) = strField
    strField = ""
    i = i + 1
  Loop Until lngLength < lngStart
  
  SplitLine = vntData()
  
End Function

例2、Split関数の真似

Public Function Split97(ByVal vntLine As Variant, _
              Optional ByVal strDelimiter As String = ",", _
              Optional ByVal lngLimit As Long = -1, _
              Optional ByVal intCompare As Integer _
                      = vbBinaryCompare) As Variant

'  vntLine   必ず指定 文字列と区切り文字を含んだ文字列式を指定
'        引数 vntLine が長さ 0 の文字列 ("") である場合、Split97 関数は""をかえす
'  strDelimiter 省略可能 文字列の区切りを識別する文字を指定
'        引数 strDelimiter を省略すると、区切り文字に"," を使用
'        引数 strDelimiter が長さ 0 の文字列 ("") である場合は、
'        引数 vntLine 全体の文字列を含む単一の要素の配列を返す
'  lngLimit   省略可能 返す配列の要素数を指定 -1 を指定すると、すべての文字列を含んだ配列を返す
'  intCompare  省略可能 文字列式を評価するときに使用する文字列比較のモードを表す数値を指定

  Dim i As Long
  Dim vntData() As Variant
  Dim lngPos As Long
  Dim lngRead As Long
  Dim intDelLen As Integer
  Dim lngLineLen As Long
  
  If intCompare <> vbBinaryCompare Then
    intCompare = vbTextCompare
  End If
  If strDelimiter = "" Then
    ReDim vntData(0)
    vntData(0) = vntLine
    Split97 = vntData
    Exit Function
  End If
  If vntLine = "" Then
    Split97 = ""
    Exit Function
  End If
  intDelLen = Len(strDelimiter)
  lngLineLen = Len(vntLine)
  
  lngRead = 1
  i = 0
  Do Until lngRead > lngLineLen
    ReDim Preserve vntData(i)
    lngPos = InStr(lngRead, vntLine, strDelimiter, intCompare)
    If lngPos = 0 Or i = lngLimit Then
      vntData(i) = Mid(vntLine, lngRead)
      lngRead = lngLineLen + 1
    Else
      vntData(i) = Mid(vntLine, lngRead, lngPos - lngRead)
      lngRead = lngPos + intDelLen
    End If
    i = i + 1
  Loop
  
  Split97 = vntData
  
End Function
 ───────────────────────────────────────  ■題名 : Re:配列(Split)に関して  ■名前 : jin  ■日付 : 03/1/27(月) 20:32  -------------------------------------------------------------------------
   ▼Hirofumi さん:
>>このSplit関数にきり変わる、EXCEL97でも使用可能な関数がありませんか?
>
>Excel97には、有りません
>ただし、VBAで似た様な物を作る事は可能です
>以下に私のコードを書いておきます、ただし処理速度は遅いので宜しく
>バグが有ったらゴメン
>
そうですか〜97にはありませんか〜
残念ですが、しょうがありません。
すみません。
コードを参考にがんばってみます!
ありがとうございます。
とってもはやいレスで驚いてます。
 ───────────────────────────────────────  ■題名 : Re:配列(Split)に関して  ■名前 : Hirofumi <hirofumi@venus.dti.ne.jp>  ■日付 : 03/1/27(月) 21:02  -------------------------------------------------------------------------
   書き忘れましたが、本来のCSVデータを処理するならSplit関数では無理が有ると思います
何故なら、CSVで文字列の中にカンマ、ダブルクォーツが有る場合(ダブルクォーツで囲まれた文字列)等もSplitではフィールドに分けてしまいますし、ダブルクォーツで囲まれた文字列のダブルクォーツ自身も削除してくれません
よって、私自身は、例1のFunctionをExcel2000でも使っています
また、例2は少し、凝りすぎでエラーに成りそうなものを片っ端から除いています
そこら辺の必要が無い所を省略すれば少しは早くなると思います
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 615