「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:0
総数:2745
現在:2


vMyBUF()() 型の変数を設定する方法-setFormulaArray-の関係から

ページOpenOffice.org FAQの登録ページ
投稿者mr_happy
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2011-05-08 09:59:49 (日)
OSWin7
依存するページfaq/6/205, faq/6/211
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

お世話になります。 vMyBUF(10)(4) 型の配列変数はどのように宣言すれば使えるのでしょうか? いろいろやってみてはいるのですがうまくゆきません。
どなたか教えてください。

Dim vBuf
vBuf = oRSheet.getCellRangeByName("B1:E10").getFormulaArray

これは vBuf(x)(y) の型のオブジェクトの配列変数となり、x,yの値でそれぞれのセル値となります。

この型と同じ配列を次のように宣言してもエラーとなります。

Dim vMyBUF
〜
ReDim vMyBUF(10)(4)    ' ここでエラー
または
Dim vMyBUF()()         ' ここでエラー

となり、使用することが出来ません。

使い方としては例えば

vMyBUF(y)(x) = vBuf(y)(x) * 5

の様にgetFormulaArrayやgetDataArrayで得たデータを 別に宣言した配列変数に代入して
setFormulaArray(vMyBUF) を使い一括してセルに書き込みたいわけです。

今のところは

vMyBUF = vBuf

として vMyBUF の値を消去して使う方法を考えていますが、 どうも気に食わなくて・・・

尚、書き込みに際し、書き込みたい最初のアドレスとvMyBUF に作られた配列から

Sub f_GetXY(oOneRng, vMyBUF, x1, y1, x2, y2)
   Dim oOneAdr
   
   oOneAdr = oOneRng.getRangeAddress()
   x1 = oOneAdr.StartColumn  
   y1 = oOneAdr.StartRow
   x2 = Ubound(vMyBUF(0)) + x1
   y2 = Ubound(vMyBUF)    + y1  
End Sub

として、setCellRangeByPosition(x1, y1, x2, y2)を得ています。 よろしくお願いします。


二次元配列の問題ですよね

M.Kamataki (2011-05-09 11:39:31 (月))

以下のOOoBasicサイトのご質問と同じでしょうか。

CellRangeについてのDataArray, getDataArray, setDataArrayの使い方
http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOobbs%2F28

zDRは必要ですか。 またyDRへの代入をForなど使えないでしょうか

mr_happy (2011-05-14 20:41:53 (土))

M.Kamatakiさん いつもありがとうございます。
早速見て、いろいろやってみました。
その頁の最後にあるマクロが以下です。

Sub MyTest2()
	Dim oSheet As Object
	Dim oRange, yCursor As object
	Dim zDR() as object
	Dim yDR(3)
	oSheet = ThisComponent.CurrentController.ActiveSheet
	For i=0 to 3
		yDR(i) = Array("A" & CStr(i), "B" & CStr(i)) 
	Next i
	zDR() = Array(yDR(0),yDR(1),yDR(2),yDR(3))
	yCursor = oSheet.getCellRangeByPosition(1, 1, 2, 4)
	yCursor.setDataArray(zDR())
End Sub

,海涼罎如yDR も zDR も全く同じ内容で、どちらを使ってもうまくゆきました。~
ならば、zDR() = Array(yDR(0),yDR(1),yDR(2),yDR(3)) は不要だと思いますがこの辺はどうなのでしょうか?
yDR(i) = Array("A" & CStr(i), "B" & CStr(i)) ~
この例ではyDRの右辺の項が2つ(2行分)ですが、もっと多くなると(数十行)大変なことになります。ここのところの実際のデータが3行分の例で~

yDR(i) = Array(Hairetu(i,k), Hairetu(i,k+1), Hairetu(i,k+2))

だとした時、この右辺を For Next など使い繋げることはできないのでしょうか? 例えば

For i=0 To 3
    For k=0 To 2
        yDR(i) = Array(Hairetu(i,k))
    Next
Next

のような方法で。
自分ではいろいろ工夫してみたのですがうまくゆきません。
アドバイスをお願いします。

Dim で定義した多次元配列とUNOからの配列

はにゃ? (2011-05-15 01:40:47 (日))

OOo Basic ではDim a(5,3) などとして定義した配列は UNO で利用される多次元配列とは違うものです。そして、getDataArray メソッドの返り値の配列は配列内に配列が入っているだけです。OOo Basic ではこの配列の定義方法を提供していません。

次のような感じにFor分を入れ子にするとどうでしょうか。

n = 5
Dim a(3) As Variant
Dim b() As Variant
For i = 0 To 3 step 1
  ReDim b(5)
  For k = 0 To n step 1
    b(k) = i * k
  Next
  a(i) = b
Next

出来ました!

mr_happy (2011-05-15 08:23:21 (日))

はにゃ? さん、出来ました。ありがとうございます。

この形もやってみてはいたのですが、その時はうまくゆきませんでした。
理由がわかりました。
上記の例で言えば、aとbの変数の型で、両方ともVariantにしておけば大丈夫なようで、私はどうやらどちらかまたは両方をObject型にしていたようです。

ここで完了にします! また何かあったらお願いします。

「参照問題」と、完成したテスト用マクロ

mr_happy (2011-05-17 09:39:15 (火))

vWData()()型の配列変数が宣言できず皆さんのアドバイスから~
とりあえず完成にしておいたこのQA、~
実は思わぬところに落とし穴がありその取り組みをしました。~
それは下記マクロ中の vWData(y) = f_DrctIn(vXBuf, xMx) の部分で~
もともとは vWData(y) = vXBuf でしたがこれだと~
vWData(0), vWData(1), vWData(2)・・・・はすべて同じ文字になってしまいます。~
これは角田さんが指摘していた参照問題だと考え、一旦関数に入れクリアーしました。~
関数に入れなくても同じことをやれば大丈夫でしたが、関数に入れることで~
vFcBuf がいつも新鮮だと考えて使いました。~
この場を借りて参考にさせていただいたことに感謝します。~
そのHP http://blog.livedoor.jp/addinbox/

Sub f_TestMain
   Dim oRSheet, oRRange, oWSheet, oWRange, oWOneDoc
   Dim vRData(), vWData(), vXBuf()
   Dim x, y, x1, y1, x2, y2, yMx, xMx
   
   oWSheet = ThisComponent.getSheets.getByName("Sheet2")
   'oWSheet.getCellRangeByName("A5:G25").clearContents(31)           
   oWOneDoc = oWSheet.getCellRangeByName("C2")
   oRSheet = ThisComponent.getSheets.getByName("Sheet1")
   oRRange = oRSheet.getCellRangeByName("A5:G25")    
   vRData  = Range.getFormulaArray     
                                          
   xMx=UBound(vRData(0))
   yMx=UBound(vRData)
   ReDim vXBuf(xMx)
   ReDim vWData(yMx)
   For y = 0 to yMx                                   
       For x = 0 To xMx
           vXBuf(x) = vRData(y)(x)
       Next
       vWData(y) = f_DrctIn(vXBuf, xMx)
   Next                                                          
   Call f_GetXY(oWOneDoc, vWData, x1, y1, x2, y2) 
   oWRange = oWSheet.getCellRangeByPosition(x1, y1, x2, y2)
   oWRange.setFormulaArray(vWData)  
End Sub
Function f_DrctIn(vXBuf, xMx) As Variant
   Dim vFcBuf
    
   vFcBuf = vXBuf
   ReDim Preserve vFcBuf(0 to xMx)
   f_DrctIn = vFcBuf
End Function
Sub f_GetXY(oOneDoc, vMyBUF, x1, y1, x2, y2)
   Dim oOneAdr
   
   oOneAdr = oOneDoc.getRangeAddress()
   x1 = oOneAdr.StartColumn  
   y1 = oOneAdr.StartRow
   x2 = Ubound(vMyBUF(0)) + x1
   y2 = Ubound(vMyBUF)    + y1  
End Sub

改めてみなさんありがとうございました。

お名前:
題名: