[解決]EqualUnoObjects(Sheet1, Sheet1)=False

スプレッドシート (Calc) について
返信する
K.Tsunoda
記事: 71
登録日時: 11月 2, 2008, 6:44 pm
連絡する:

[解決]EqualUnoObjects(Sheet1, Sheet1)=False

投稿記事 by K.Tsunoda »

VBA での [ Is ]演算子が、OOo.Basicでは EqualUnoObjects 関数だと判ったので、
シートの親ドキュメントオブジェクトを探すために下記のコードを作ってみましたが NotFound にしかなりません。
(ブログ記事: http://blog.livedoor.jp/addinbox/archives/51244102.html

コード: 全て選択

Sub Main
Dim oActiveSheet As Object
Dim oComponents As Object
Dim oComponentsEnum As Object
Dim oComponent As Object
Dim i As Integer

  oActiveSheet = ThisComponent.CurrentController.ActiveSheet

  oComponents = StarDesktop.Components
  oComponentsEnum = oComponents.createEnumeration()
  While oComponentsEnum.hasMoreElements()
    oComponent = oComponentsEnum.nextElement()
    If (oComponent.ImplementationName = "ScModelObj") then
      For i = 0 to (oComponent.Sheets.Count - 1)
        If EqualUnoObjects(oActiveSheet, oComponent.Sheets(i)) Then
          MsgBox "Parent is " & oComponent.Title
          Exit Sub
        End If
      Next i
    End If
  Wend
  MsgBox "Parent is Notfound"
End Sub
テストしてみましたら、シートオブジェクトに対しては、どうやっても「イコール」とは見てくれないようです。

コード: 全て選択

Sub Main
Dim oDoc As Object
Dim oActiveSheet As Object
Dim oSheet1 As Object
Dim oSheet1a As Object
Dim oSheet1b As Object
Dim oSheet As Object
Dim oSheetsEnum As Object
Dim i As Integer
Dim j As Integer

oDoc = GetComponent("無題 1")     '(注)
MsgBox "Doc : " & EqualUnoObjects(ThisComponent, oDoc)  'ThisComponent=[無題 1]

With ThisComponent
  oActiveSheet = .CurrentController.ActiveSheet  'ActiveSheet=[Sheet1]
  oSheet1 = .Sheets.getByName("Sheet1")
End With
MsgBox "Sheet : " & EqualUnoObjects(oActiveSheet, oSheet1)

j = -1
With ThisComponent
  For i = 0 to (.Sheets.Count - 1)
    If EqualUnoObjects(oSheet1, .Sheets(i)) Then
      j = i
    End If
  Next i
End With
MsgBox "Sheet(n) : " & j

j = -1
i = -1
oSheetsEnum = ThisComponent.Sheets.createEnumeration()
While oSheetsEnum.hasMoreElements()
  i = i + 1
  oSheet = oSheetsEnum.nextElement()
  If EqualUnoObjects(oSheet1, oSheet) Then
    j = i
  End If
WEnd
MsgBox "SheetEnum : " & j

With ThisComponent
  oSheet1a = .Sheets.getByName("Sheet1")
  oSheet1b = .Sheets.getByName("Sheet1")
End With
MsgBox "Sheet ByName : " & EqualUnoObjects(oSheet1a, oSheet1b)

With ThisComponent
  oSheet1a = .Sheets.getByIndex(0)
  oSheet1b = .Sheets.getByIndex(0)
End With
MsgBox "Sheet ByIndex : " & EqualUnoObjects(oSheet1a, oSheet1b)
End Sub
(注) GetComponent は下記
http://blog.livedoor.jp/addinbox/archives/51192547.html

シートオブジェクト同士を比較するケースはバグなのでしょうか?
最後に編集したユーザー K.Tsunoda [ 9月 10, 2009, 3:46 pm ], 累計 1 回
K.Tsunoda
記事: 71
登録日時: 11月 2, 2008, 6:44 pm
連絡する:

Re: EqualUnoObjects(Sheet1, Sheet1)=False

投稿記事 by K.Tsunoda »

セルも駄目ですね。

コード: 全て選択

Sub Main
With ThisComponent
  oCell1 = .Sheets.getByIndex(0).getCellByPosition(0,0)
  oCell2 = .Sheets.getByIndex(0).getCellByPosition(0,0)
End With
MsgBox "Cell : " & EqualUnoObjects(oCell1, oCell2)
End Sub

さすがに下記なら True にはなりますね。
EqualUnoObjects( oSheet1a, oSheet1a )
EqualUnoObjects( oCell1, oCell1 )
K.Tsunoda
記事: 71
登録日時: 11月 2, 2008, 6:44 pm
連絡する:

Re: EqualUnoObjects(Sheet1, Sheet1)=False

投稿記事 by K.Tsunoda »

自己解決・・・・・ かな?

http://blog.livedoor.jp/addinbox/archives/51244102.html
この記事の後半部分で推測内容を解説しています。
A1:B1 ならば、先ず「A1セルへの参照」と「B1セルへの参照」をまとめた
集合体が作られ、この集合体オブジェクトへの参照がセル範囲オブジェクト
変数に格納されるというような仕組みなっている筈です。

「A1:B1のセル範囲参照を取得するクエリー」の実行結果オブジェクトへの
参照という見方をしても良いでしょう。

A1セル単体の場合も、こういう中の一部(偶々1セルだっただけ)だと考えれば、

oCell1 = .Sheets.getByIndex(0).getCellByPosition(0,0)
oCell2 = .Sheets.getByIndex(0).getCellByPosition(0,0)

が False になるのも頷けます。A1セルへの直の参照を取り出しているの
ではなく、「A1セルを取り出すクエリーを別個に実行したもの」と考えれば、
自ずと、そのクエリー結果のオブジェクトも【別個】に作られますから、比較
すれば当然 False ですね。

OOo.Calc では、シートもセルと同じ扱いにしてしまっているのでしょうね。
その為に、
'ActiveSheet=[Sheet1]
oActiveSheet = .CurrentController.ActiveSheet
oSheet1 = .Sheets.getByName("Sheet1")
では False なのでしょう。
比較調査で、Excel/VBA では Sheet については True になりましたから、余計残念です。
もう少しで、Sheet の親オブジェクトを探せたのに・・・・・
返信する

“Calc”に戻る