Top > OOobbs > 28
** [[OOobbs/28]] [#k0709a1b]
-''サマリ'': CellRangeについてのDataArray, getDataArray, setDataArrayの使い方
-''環境'': Calc
-''状態'': 解決
-''投稿者'': [[suou]]
-''投稿日'': 2004-06-23 (水) 18:25:41

*** 質問 [#k48886e3]
次のようなSubを書き実行させると、?ではErrorが表示されず、?で「オブジェクト変数は設定されていません」とErrorメッセージが出ます。LBoundもUBoundも正しく表示し、しかも、IsArray()の内側に入ってからErrorが出ます。したがって、aRAが配列を格納したことは分かります。セル範囲についてのDataArray、setDataArrayの使い方のサンプルを教えていただければ大変うれしいです。;
 Sub Test()
  Dim oSheet As Object
  Dim oRange As Object
  Dim aRA()
  oSheet = StarDesktop.CurrentComponent.CurrentController.ActiveSheet  '?
  oRange = oSheet.getCellRangeByPosition(11, 5841, 11,6645) '?
  aRA() = oRange.DataArray()  '?
  msgbox LBound(aRA()) & "|" & UBound(aRA())
  If IsArray(aRA()) then
   MsgBox aRA(0)  '?
  End If
 End Sub

どうも多次元配列の参照の仕方に問題があるような気がしてきました。下のプログラムでは参照できません。ExcelVBAでの二次元配列要素の参照はa()()の形でできるのですが、OOoBasicの場合はどうすればいいのでしょうか?どなたか教えて頂ければ大変有難いです。
 Sub Test()
 Dim a()
  a() = Array(Array(1,1),Array(2,1),Array(3,1),Array(4,1))
  If IsArray(a()) then
	msgbox a(0)(1)
  End If
 End Sub

*** 回答 [#p2c61d1a]
-こんな感じでいいはずなんですが,DataArray が戻す配列の時にはうまくいかないような器がします。

 Sub TestArray
   Dim aARRe(1,2) As String
   aARRe(1,1) = "main"
   MsgBox aARRe(1,1)
 End Sub

なぜなんでしょう?

暇なときに,他のドキュメントも探してみます。

-- [[はにゃ?]] &new{2004-07-09 (金) 00:48:55};
-次のようにマクロを書き換えたら出来ました。シート上のA1からC20にいろいろな値をまず入力し、その値を取込んだ上で行毎にすべてのセルの値を表示していきます。
 Sub MyTest()
  Dim oSheet, oCell As Object
  Dim nCurCol, nCurRow As Integer
  Dim oRange As Object
  Dim oData
  Dim oDataRow
  oSheet = ThisComponent.CurrentController.ActiveSheet  '?
  oRange = oSheet.getCellRangeByPosition(0, 0, 2, 19) '?
  oData = oRange.DataArray()  '?
  For nCurRow = LBound(oData) To UBound(oData)
   oDataRow = oData(nCurRow)
   For nCurCol = LBound(oDataRow) To UBound(oDataRow)
    msgbox oDataRow(nCurCol)
   Next
  Next
 End Sub
ここでのgetDataArray()使用上のポイントは、
?oDataRow=oData(行番号)とoDataRow(列番号)という2段構えでの配列へのアクセス方法をとっていること(ドキュメントでは"The outer sequence represents the rows and the inner sequence the columns of the array"と小書きがあり、これはこの2段構えのことかと今になって気づきましたが、これだけではどうすればいいか皆目見当が付きませんでした)
? Dim oData/Dim oDataRowという配列らしからぬ変数宣言
の2点にあるように思います。
なお、2段構えをはしょり、直接oData(nCurRow)(nCurCol)をもってoDataRow(nCurCol)に代替させることはできませんでした。ところで、上のSampleはこのHPでも紹介されているAndrew Pitonyakさんのhttp://www.pitonyak.org/oo.phpからダウンロードした OpenOffice.org Macro documentのなかのgetDataArray()の節に基づいて多少の変更を加えてあります。記して謝意を表します。6月以来の懸案が解決し、とてもうれしいです。これでいろいろなデータ処理のスピード・アップを図れそうです。
--[[suou]] &new{2004-11-04 (木) 10:54:14};
-setDataArrayの使い方のサンプルが漏れていました。
 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
-- [[suou]] &new{2004-11-06 (土) 19:44:52};

#comment

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