シートにあるセル範囲をユーザー関数を含んだ数式で名前定義するには?

  • LibreOffice5 または 6 Basic (WINDOWS-10 バージョン 1909)

アクティブシート名を取得するユーザー関数を組み込んで
シートにあるセル範囲を名前定義した時に
そのデータをBASIC で取り込むには?

(問題例)

◆シート名 = 「経費2019」「経費2020」「経費2021」・・・
で各シートの X1:Z2に 2行3列のデータがある。

◆アクティブシート名を取得する関数

Function GetSheet() As String  
dim document as Object  
set document = iif(GetSolarVersion < 60000 ,StarDesktop.CurrentComponent, ThisComponent)  
dim oSheet as Object	
oSheet = document.CurrentController.Activesheet  
GetSheet = oSheet.Name    
End Function

◆名前定義の管理ウインドウ

(シート(S)―名前付きの範囲または式(N)―管理(M) で開き
「dttb」と定義した

dttb = GetSheet()&"."&$X$1:$Z$2

上記のように設定して以下のテストプログラム(VRTEST6)の シンングルステップ(F8キー)で進めた

Sub VRTEST6()

dim VR as object  
VR = ThisComponent.CurrentController.Activesheet  
W = VR.getCellByPosition(30,3)

a = "C_2"   
b = "G"

ReferredCells = ThisComponent.NamedRanges.getByName("dttb").getReferredCells()    ’・・・(A)  
tb = ReferredCells.DataArray
	
for j = 0 to ubound(tb)  
if tb(j)(0) = a then exit for  
next
		
boe = tb(j)(1)   
eoe = tb(j)(2)   
adrs = b + boe + ":" + b + eoe
		
W.SetFormula("=" & a)  
c = W.String & adrs  
End sub

セル範囲 X1:Z2 には 画像(上)=略のように定義されてます。

ステップ(A)の次行まで進めた処で
オブザーバーウインドウに「ReferredCells」と入力し
変数「ReferredCells」を確認すると、
値=Null, 種類=Variant/Object としか,返ってきません。

比較として (A)行の「dttb」の代わりに
正しい名前定義である “dtb” (=$経費2020.$X$1:$Z$2)で定義すると
ReferredCells.DataArrayには、画像(下)=記述 のような
階層のテーブルデータが返ります。

X1="HI-YO"   
Y1=596   
Z1=685   

X2="CREDIT"   
Y2=264   
Z2=457   

X1,X2のデータはそれぞれ文字列です。

:heavy_multiplication_x:どこが、どのように間違いなのでしょうか?、

GetSheetルーチンか?
名前定義の仕方か?
直接の名前定義しか受容されてなく、間接指定はダメなのか?
など

一応、任意セルに「=GetSheet()」 とすると
シート名は 返ります

直接の名前定義しか受容されてなく、間接指定はダメなのか?

1 Like

一つのブック(document)に同じ形式のシート(経費2019」「経費2020」「経費2021」・・・)
で構成されており、そのX1:Z2に別documen(HI-YO=費用帳,CREDIT=クレジット管理)での
明細データの年毎の記録範開始,同終了位置を取り込むようになってます。
よって、ある年の経費シート(上記3種類以上ののどれか)をクリックしたときに
dttbで定義されたユーザー定義関数を含む名前からX!:Z2のデータを読み取りたいのですが。

お尋ねになっている、ユーザー関数で取得したシート名を使って「範囲名で参照しているシート」を可変にする方法は見つかりませんでした。ので的確な回答になっていません。

単純なActiveシートのセル値参照・取得でしたら、以下のマクロをよく使っていますので参考にしてください。

配列に対応した範囲スタイルでの取得が難しいので、一度値を取得した後、配列にセットする方法も一考かと思いました。

Sub AsheetcellData

	Dim oSheet as Object
	Dim SheetName as String

    oSheet = ThisComponent.CurrentController.ActiveSheet
    SheetName = oSheet.Name
    
	Dim ataiX1 as String        '型を指定してください
	Dim ataiX2 as String
	Dim ataiY1 as String
	Dim ataiY2 as String

	oThisCompo = ThisComponent.Sheets.getByName(SheetName)
	ataiX1 = oThisCompo.getCellRangeByName("X1").string  '型を指定します 数値 value   式 formula
	ataiX2 = oThisCompo.getCellRangeByName("X2").string
	ataiY1 = oThisCompo.getCellRangeByName("Y1").value
	ataiY2 = oThisCompo.getCellRangeByName("Y2").formula
	
	MsgBox ataiX1
	MsgBox ataiX2
	MsgBox ataiY1
	MsgBox ataiY2

End sub
1 Like

残念ながら、
求める意図、いささかズレてるように思います。私の意図は、
シートクリック、
名前定義dttbの内容が変化(ユーザー関数が担当)
それから引き出されるセル範囲を取得
です。

いずれにしろ LibreOfficeマクロは難解ですね。
com.sun.star・・・の全体関係も理解できないし

投稿着手、ありがとうございました。