OOobbs/55
質問
OpenOffice1.0.2を使っています。 csvファイルを1行ずつカンマで区切って、配列にしたいのですが、 どうやらsplit関数が使えないようなのです。 なにか他に手は無いのでしょうか? 回答
(Split 関数に関してはさまざまなところで,「ないけどどうしたらいいんだ?」といった議論が繰り広げられ ...) Split 関数は OpenOffice.org 1.0 系では使用できませんが,実は OpenOffice.org 1.1 系では新たに組み込まれています。Join 関数も同様です。しかし,バージョンが違うと使用できなくなるマクロを書くよりは互換性のあるほうが好ましいですし,事情によって新しいバージョンに更新できない場合などには仕方がありません。 OOoBasic/Macros/mycalc のマクロ DivideWithComma でも split 関数を使用せずに文字列を分割しています。 配列として戻すときには,
配列の要素数が非常に多いときには,始めの要素数を数える方法は時間がかかりそうです。次に示したコードは要素数を数え上げて行う方法を使っています。 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 は配列を戻すことができます。型の指定などを行うとエラーとなります。
|