Top > OOobbs > 55

OOobbs/55 Edit

  • サマリ: VBAのsplitに対応する関数を知りたい
  • 環境: Calc
  • 状態: 解決
  • 投稿者: kh?
  • 投稿日: 2005-04-08 (金) 13:17:00

質問 Edit

OpenOffice1.0.2を使っています。

 csvファイルを1行ずつカンマで区切って、配列にしたいのですが、 どうやらsplit関数が使えないようなのです。

なにか他に手は無いのでしょうか?

回答 Edit

  • この Split 関数がないために,コンマ区切りを自分で Mid, InStr 関数を使って同じような処理を行わせる必要があります。

(Split 関数に関してはさまざまなところで,「ないけどどうしたらいいんだ?」といった議論が繰り広げられ ...)

Split 関数は OpenOffice.org 1.0 系では使用できませんが,実は OpenOffice.org 1.1 系では新たに組み込まれています。Join 関数も同様です。しかし,バージョンが違うと使用できなくなるマクロを書くよりは互換性のあるほうが好ましいですし,事情によって新しいバージョンに更新できない場合などには仕方がありません。

OOoBasic/Macros/mycalc のマクロ DivideWithComma でも split 関数を使用せずに文字列を分割しています。

配列として戻すときには,

  • 要素数を数える
  • ReDim Preserve を使用して配列の要素数を定義しなおす 方法のどちらかを使用して配列の要素数を正しくしてやる必要があります。これも配列の要素を操作する関数がないせいです。

配列の要素数が非常に多いときには,始めの要素数を数える方法は時間がかかりそうです。次に示したコードは要素数を数え上げて行う方法を使っています。

Function StringtoArray( sDiv As String, sSep As String)
Dim i As Integer, nPos As Integer, nPlace As Integer, nNum As Integer
Dim nSep As Integer
  nSep = Len(sSep)
  nPos = 1
  While nPos <> 0
    nPos = InStr(nPos, sDiv, sSep)
    If nPos <> 0 Then
      nNum = nNum + 1
      nPos = nPos + nSep
    End If
  WEnd
  Dim sLocArr(nNum)
  If nNum <> 0 Then
    nPos = 1
    nPlace = 1
    While nPlace <> 0
      nPlace = InStr(nPos, sDiv, sSep)
      sLocArr(i) = Mid(sDiv, nPos, nPlace -nPos)
      nPos = nPlace + nSep
      i = i + 1
    WEnd
    StringtoArray = sLocArr()
  Else
    Dim nDLen As Integer
    nDLen = Len(sDiv)
    If InStr(sDiv, sSep) <> nDLen Then
      sLocArr(0) = sDiv
      StringtoArray = sLocArr()
    End If
  End If
End Function

もう一つの方法の ReDim Preserve を使う方法では,配列に要素を入れていきながら要素数を数え上げ,配列の要素数が足りなくなると配列の要素数を変更します。

ReDim ステートメントを使用することで配列の要素数を変更して配列を再定義できます。このとき,変数に保持されていた値が全て破棄されてしまいます。変数のデータを保持したまま変数を再定義するときには Preserve を付け加えます。

たとえば次のようにします。

ReDim Preserve sLocCategorized( nLocCounter - 1 ) As String

始めにある程度の要素数を持った配列を定義しておいて,順に要素に値を入れていきます。要素数が足りなくなったら,ReDim Preserve を使用して要素数を増やしてやります。要素数が余ったときにも要素数を配列の保持するデータ要素数に再定義しなおします。

OpenOffice.org Basic の Function を定義する際に,戻り値の型を明示的に記述せずにおきます。そして,関数の最後に関数が戻す値として配列変数を戻すようにすることで定義した Function は配列を戻すことができます。型の指定などを行うとエラーとなります。

  • はにゃ?? 2005-04-09 (土) 01:37:56
  • こんなに親切に教えていただき、ありがとうございます。おかげで、完成させることができました。 -- kh? 2005-04-11 (月) 09:11:29


Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes