** [[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 |