Top > OOobbs > 42

OOobbs/42 Edit

  • サマリ: 文字列を式として認識させる方法
  • 環境: Calc
  • 状態: 未解決
  • 投稿者: suou?
  • 投稿日: 2004-11-15 (月) 09:21:46

質問 Edit

いつも丁寧に教えて頂きありがとうございます。 さて、文字列をマクロで作った後、これをマクロ中で式として認識させる方法はありますか? 例えば、 yDR(0)=Array(0,10)、 yDR(1)=Array(1,11)、 yDR(2)=Array(2,12)、 yDR(3)=Array(3,13) のような配列であるとき、

Sub Test()
 dim a as string
 n = 3
 a= "Array("
 For i = 0 to n
  a = a & iif(i=0, "", ",") & "yDR(" & CStr(i) & ")"
 Next i
 a = a & ")"
End Sub

を実行すると、aには"Array(yDR(0), yDR(1), yDR(2), yDR(3))"という文字列が代入されます。その上で、z=Array(?a?)としたとき、これが z=Array(Array(yDR(0), yDR(1), yDR(2), yDR(3)))と同等となるような文字列を式に変換してくれる??に相当するものがあれば、とても便利です。確か、dBASE(古くてすいません)では&Aのように文字Aの前に&を前置すると文字Aそのものではなく文字Aに代入されている式なり文字列を表現するような変換が出来たように記憶しているのですが、OOoBasicではそんな変換をしてくれるものはないでしょうか?ちょっとdBaseの"&"とは意味合いが違うかもしれませんが、教えて頂ければありがたく思います。

回答 Edit

  • 便利そうな関数ですが,OOoBasic で同じようなものは聞いたことがありません。 あれば OpenOffice.org のヘルプに載っていそうです。

ざんねんです。

話はすこし変わりますが,FindObject 関数,FindPropertyObject 関数 といった関数もあるようです。

新しいモジュールを動的に定義して関数を作成して呼び出すことでできそうですが,確かうまくいったような ... ? いかなかったかな ?

  • はにゃ?? 2004-11-20 (土) 23:34:59
  • 「新しいモジュールを動的に定義して関数を作成して呼び出す」をヒントにしたいのですが、簡単なサンプルを示して頂けますか? -- suou? 2004-11-21 (日) 08:25:33
  • では,簡単なサンプルを示します。-- はにゃ?? 2004-11-21 (日) 12:20:52

次の例では,Sub Main はドキュメントの BasicLibrary の "Standard" にあります。また,新しく "Standard" ライブラリに "NewModule" というモジュールを作成します。そのときに sCode 変数の中の文字列をモジュール中のコードとして記入します。新しく作成した "NewModule" の中には Sub NewSub を定義しておき,Sub Main の中から NewModule.NewSub といったような形で呼び出します。

Sub Main
Dim oDoc As Object, oLibraries As Object
Dim oLib As Object
Dim sLibName As String, sModName As String
Dim sCode As String
Dim sLF As String', sDQ As String
  
  sLF = Chr(10)
  'sDQ = Chr(34) ' Chr(34) == " charactor
  sModName = "NewModule"
  sLibName = "Standard"
  sCode = "Sub NewSub" & sLF & _
  	"  MsgBox " & """New Module!""" & sLF & _
  	"End Sub"

  oDoc = ThisComponent
  oLibraries = oDoc.BasicLibraries
  
  If oLibraries.hasByName(sLibName) Then
    oLib = oLibraries.getByName(sLibName)
    
    If oLib.hasByName(sModName) Then
      oLib.replaceByName(sModName,sCode)
    Else
      oLib.insertByName(sModName, sCode)
    End If

    NewModule.NewSub
  End If
End Sub

このコードを実行すると,新しく "NewModule" モジュールが作成されて MsgBox に "New Module!" と表示されます。このときの "NewModule" モジュール中のコードは次のようになっています。

Sub NewSub
  MsgBox "New Module!"
End Sub

動的に作成したコードは,Sub Main を実行しても IDE 中にはすぐには表示されません。表示させるには表示しているライブラリを一度別のライブラリに変更してみてください。

動的に追加するモジュールに入力するコードを作成するときには,次の点に注意す売る必要があります。

  • 改行をわざわざ Chr(10) などで入れる
  • 文字列は " (ダブルクォテーション) で正しく囲う 二つ目の文字列については,上の Sub Main 中の次の部分のようにするか,
      	"  MsgBox " & """New Module!""" & sLF & _
    または
           "  MsgBox " & Chr(34) & "New Module!" & Chr(34) & sLF " _
    のように別に " を入れてやります。" を三つ """ のようにすると表示されます。Sub Main の中では変数 sDQ を定義して sDQ = Chr(34) としようかと思ったのですが,コメントアウトしてあります。

また,ライブラリを取得するときや,モジュールを削除,追加,置換するときにはできるだけ hasByName メソッドを使ってライブラリやモジュールの有無を確認した方がいいと思います。以前このようにライブラリを削除,追加を試していたときにはごちゃごちゃして大変だったような気がします。

BasicLibraries? および Library? を参考にしてください。

ここでは,Sub で試しましたが Function でも同じように動作します。

動的なライブラリの追加削除は「次回以降の OOoBasic マクロの起動時のためのデータの保存」などにも使用することができます。たとえば,15 panels ではパネルを動かした回数や時間や設定を Settings モジュールを生成して,値を戻す Function として保存しています。配列を戻すような Function も定義しています。

Function を

Function Settings_TimeScoreShifted()
Settings_TimeScoreShifted = Array( 85, 115, 110, 250, 350 )
End Function

と定義して,

nNumT() = Settings_TimeScoreShifted()

と取得することで配列として変数 nNumT に受け取ることができます。

  • サンプルMainを試したところうまくいきました。Functionを動的に作ることもできました。Arrayの中身が定数の場合はうまくいきそうです。しかし、Arrayの中身に別のArrayを入れようとする場合にはいま一工夫が必要になりそうです。工夫してみます。丁寧な御説明ありがとうございました。 -- suou? 2004-11-21 (日) 17:40:38


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