Top > OOobbs > 5

OOobbs/5

  • サマリ: Window の選択をするには?
  • 環境: Calc
  • 状態: 解決
  • 投稿者: XD1?
  • 投稿日: 2004-01-22 (木) 12:53:47

質問

 はじめまして。Excel97+MS Visual Basic ver5(←古い)から、できるなら OpenOfficeへ乗り換えようとしている者です。このサイトにて、シートの選択、 セルの選択も含め、かなりのことが分かりました。しかし、Windowの選択が良く 分かりません。

 例えば aaaa.sxc からマクロを起動し、data1.sxc という外部データを LoadComponentFromUrl にて開くと、フォーカスが data1.sxc に移ります(これは、 CurrentComponent が data1.sxc に移るとでも言うべきなのでしょうか)。 その後、フォーカスを aaaa.sxc に戻すには、どうすればよいのでしょうか。 aaaa.sxc のウインドウが選択状態になればいいのです。ちなみに、Visual Basic では、     Windows("aaaa.xls").Activate の一文でこれを行うことが出来ます。これに相当するキーワードを知りたいのです。

 よろしくご教授お願いします。

(環境 日本語 Win Me, CUP Intel Celeron 2000MHz)

回答

例としてのマクロを実行するドキュメント aaaa.sxc のドキュメントオブジェクトを getCurrentComponent で取得して使用します。

まずは,次のようにして oDoc を aaaa.sxc のドキュメントオブジェクトとして取得しておきます (data.sxc を読み込む前に) 。そして,最後の三行でフレームを前面に持ってきます。一度取得した oDoc は aaaa.sxc のドキュメントオブジェクトのままになっています。

Sub test
Dim oDoc As Object, oController As Object
Dim oFrame As Object, oContainerWindow As Object
Dim oDesktop As Object, oDataDoc As Object
Dim mArg()

  oDesktop = CreateUnoService("com.sun.star.frame.Desktop")

  oDoc = oDesktop.CurrentComponent
  oController = oDoc.getCurrentController()

  oDataDoc = oDesktop.loadComponentFromUrl( _ 
       "file:///C:/usr/local/test.sxc", "_blank", 0, mArg() )
  
  oFrame = oController.getFrame()
  oContainerWindow = oFrame.getContainerWindow()
  oContainerWindow.toFront()
End Sub

上のコードの最後の方はまだドキュメントを作成していないので説明がありませんが,順に作成することにします。

データ用のファイルを読み込むだけで見る必要がないのなら,隠した状態でドキュメントを開くといいかもしれません。 loadComponentFromUrl メソッドの mArg() 引数に Hidden プロパティーを指定します。

Dim mArg(0) As New com.sun.star.beans.PropertyValue

 mArg(0).Name = "Hidden"
 mArg(0).Value = false

代わりにこれを使用するとファイルを読み込んでもウィンドウが表示されません。使用した後はファイルを閉じないと開きっぱなしになってしまいますが。

開いたファイルを閉じるには close メソッドを使用するといいです。上のコードのものなら,

oDataDoc.close(true)

とするとドキュメントを閉じます。 -- はにゃ?? 2004-01-23 (金) 03:01:03

aaaa.sxc からマクロを起動の部分ですが,マクロの ThisComponent または CurrentController によってドキュメントオブジェクトが違ってきますので気をつけてください。これはマクロ本体がファイル中またはアプリケーションライブラリのどちらにあるかで挙動が変わってきます。

oDesktop からすべての OOo のフレームにアクセスすることができます。これについては ...

  • 早速のご回答、どうもありがとうございます。大変参考になります。ところで、「oDesktop からすべての OOo のフレームにアクセスすることができます」とは、マクロ起動前に手作業で開いておいたファイル(ウインドウ)にもアクセスできるということでしょうか? -- XD1? 2004-01-23 (金) 11:10:54
  • 【改行のためか、前半部分しか掲載されていないので、続きを】実は、外部データファイルが大きく、かつ複数のマクロで参照するため、Excelでは事前に外部データファイルを手作業で開いておいてからマクロを走らせています(そのようにプログラムを組んでいます)。これと同じことが OO Calc マクロでも出来ると大変便利です。勝手なお願いで恐縮ですが、こちらんついてもご教授いただければ幸いです。よろしくお願いします。 -- XD1? 2004-01-23 (金) 11:12:31

ということで,続きですが,

Sub test_2
Dim oDesktop As Object
Dim oFrames As Object

  oDesktop = createUnoService("com.sun.star.frame.Desktop")
  oFrames = oDesktop.getFrames()
  
  For i = 0 To aFrames.getCount() -1
    MsgBox aFrames.getByIndex(i).getController().getModel().getURL()
  Next i
End Sub

を実行すると今の OOo のすべての開いているフレームのドキュメントの Url を順に表示します。ここで aFrames.getByIndex(i).getController().getModel() で取得することができるオブジェクトはファイルそれぞれのドキュメントオブジェクトと同じものです (上のほうのコードで言うところの oDoc 変数にしまわれているオブジェクト)。

開いているファイルをどのようにして使用するのか分かりませんが,上のようにすることでアクセスすることができます。aFrames, aFrames.getByIndex(i), ....getController(), ....getModel() で取得することができるのはすべてオブジェクトなので, DbgInfo2sheet などで調べてみるのもいいかもしれません。

Calc でなら,

aFrames.getByIndex(i).getController() → Calc CurrentController?

aFrames.getByIndex(i).getController().getModel() → Calc ThisComponent?

などとなります。

利用するファイルを手動ではなくて loadComponentFromUrl メソッドで開くようにするなら,それぞれのファイルをそれぞれ変数に割り当てたほうが簡単でいいと思いますが,コードの汎用性がなくなりますね。 -- はにゃ?? 2004-01-23 (金) 22:56:05

For 文の中を

MsgBox aFrames.getByIndex(i).Title

にするとタイトルバーに表示されている文字列が表示されます。

  • どうもありがとうございます。まだよく理解できていない部分もありますが、これからトライしてみます。 -- XD1? 2004-01-27 (火) 10:42:33
  • どうもありがとうございます。まだよく理解できていない部分もありますが、これからトライしてみます。 -- XD1? 2004-01-27 (火) 10:43:26


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