- The added line is THIS COLOR.
- The deleted line is THIS COLOR.
- Go to 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)
とするとドキュメントを閉じます。 -- [[はにゃ?]] &new{2004-01-23 (金) 03:01:03};
aaaa.sxc からマクロを起動の部分ですが,マクロの ThisComponent または CurrentController によってドキュメントオブジェクトが違ってきますので気をつけてください。これはマクロ本体がファイル中またはアプリケーションライブラリのどちらにあるかで挙動が変わってきます。
oDesktop からすべての OOo のフレームにアクセスすることができます。これについては ...
-早速のご回答、どうもありがとうございます。大変参考になります。ところで、「oDesktop からすべての OOo のフレームにアクセスすることができます」とは、マクロ起動前に手作業で開いておいたファイル(ウインドウ)にもアクセスできるということでしょうか? -- [[XD1]] &new{2004-01-23 (金) 11:10:54};
-【改行のためか、前半部分しか掲載されていないので、続きを】実は、外部データファイルが大きく、かつ複数のマクロで参照するため、Excelでは事前に外部データファイルを手作業で開いておいてからマクロを走らせています(そのようにプログラムを組んでいます)。これと同じことが OO Calc マクロでも出来ると大変便利です。勝手なお願いで恐縮ですが、こちらんついてもご教授いただければ幸いです。よろしくお願いします。 -- [[XD1]] &new{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>OOoBasic/Calc/obj/CurrentController]]
aFrames.getByIndex(i).getController().getModel() → [[Calc ThisComponent>OOoBasic/Calc/obj/ThisComponent]]
などとなります。
利用するファイルを手動ではなくて ''loadComponentFromUrl'' メソッドで開くようにするなら,それぞれのファイルをそれぞれ変数に割り当てたほうが簡単でいいと思いますが,コードの汎用性がなくなりますね。 -- [[はにゃ?]] &new{2004-01-23 (金) 22:56:05};
For 文の中を
MsgBox aFrames.getByIndex(i).Title
にするとタイトルバーに表示されている文字列が表示されます。
-どうもありがとうございます。まだよく理解できていない部分もありますが、これからトライしてみます。 -- [[XD1]] &new{2004-01-27 (火) 10:42:33};
-どうもありがとうございます。まだよく理解できていない部分もありますが、これからトライしてみます。 -- [[XD1]] &new{2004-01-27 (火) 10:43:26};
#comment