* XLSファイルから他のXLSファイルのOBJを参照するには? [#u90b98d5]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者||
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(低,faq03,priority)|
 |~状態|#listbox3(回答中,faq03,state)|
 |~カテゴリー|#listbox3(Calc 表計算,faq03,category)|
 |~投稿日|2010-03-24 13:32:05 (水)|
 |~OS|XP-SP2|
 |~依存するページ||
 |~バージョン|#listbox3(3.2.0,faq03,version)|
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#a3ba427c]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 EXCEL(VBA)で作成したマクロをOpenOfficeに移植しようとしています。~
 処理の内容としては~
 Aのファイル(起動元でマクロが埋め込まれています)から~
 Bのファイル(チェック対象)の中身を調査する物です。~
 
 ただ、VBAマクロのままですと対象のBファイルのオブジェクトが取得できません。~
 どうすればB側のオブジェクトを取得できるのでしょうか?~
 なお、VBAサポートを使用して動作させています。~
 
  ’起動部
  Public Function test()
 	On Error Resume Next
 	Dim visble As Boolean
 	dstWorkBookPath = "C:\test.xls"
 	visble = True
 	'★ここまで
 	'指定のブックを開く
 	Workbooks.Application.Visible = visble 'ここも効いていない
 	Workbooks.Application.DisplayAlerts = False
 	Workbooks.Open Filename:=dstWorkBookPath, UpdateLinks:=3 'ファイルは開くが・・・
 	'WorkBooksを取得
 	Set dstWorkBooks = Workbooks 'OBJが取得できていない?
 	'WorkBookを取得
 	Set dstWorkBook = Workbooks.Application.ActiveWorkbook
 	'WorkBookを取得名を取得
 	dstWorkBookName = dstWorkBook.name
 	'対象ファイルをCHKマクロを起動する
 	Call Check(logPath)
 	'Book開放
 	dstWorkBook.Close
 	Set dstWorkBook = Nothing
 	'Books開放
 	Workbooks(dstWorkBookName).Close
 	Set dstWorkBooks = Nothing
  End Function
  
  ’チェック側
  Function Check() As Integer
  '集計結果のチェック
     Dim wAry(3) As Integer
     Dim i As Integer
     Dim check As Integer
     
     On Error Resume Next
     
     q1 = 0
     
     wAry(0) = 81
     wAry(1) = 1
     wAry(2) = 22
     wAry(3) = 44
     
     With dstWorkBooks
         
         For i = 2 To 6
             If Sheets("結果").Cells(7, i).Value = wAry(i - 2) Then
                 check = check + 1
             End If
         Next
     
     End With
     
     If Err.Number <> 0 Then
         Exit Function
     End If
     
     chk1 = check
  
  End Function
 
 ----
 ***これはVBAで動作しますか? [#u0ed1982]
 >K.Tsunoda (2010-03-24 15:05:24 (水))~
 ~
 すみませんが、このマクロはVBAで問題なく動いているのでしょうか?~
 ~
 先ずは、VBAベースでの話として・・・~
 ~
 > Workbooks.Application.Visible = visble~
 > Workbooks.Application.DisplayAlerts = False~
 ExcelからAccessやWordにあるオブジェクトを操作するとかで、~
 ExcelのVBAから「オブジェクトの親のアプリケーション」を~
 指し示すような場合には[ OBJECT.Application.〜 ] という~
 使い方もするでしょうが、ここではExcelに対しての指示ですよね。~
 それならば単に~
 Application.Visible = visble~
 Application.DisplayAlerts = False~
 で充分です。~
 ~
 仮に「自分自身のブックの親アプリケーション」を明確に記述するならば~
 ThisWorkbook.Application.Visible = visble~
 ThisWorkbook.Application.DisplayAlerts = False~
 ですね(でも、普通は書きません)。~
 ~
 マクロ終了時に、Visible/DisplayAlerts をTrue に戻していないのも~
 問題です。~
 ~
 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜~
 また、[ visible ]という名前の変数ですが、Visibleプロパティの~
 名前と重なります。実害がないとしても変えた方が良いでしょう。~
 ~
 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜~
 > Workbooks.Open Filename:=dstWorkBookPath, UpdateLinks:=3 'ファイルは開くが・・・~
 > 'WorkBooksを取得~
 > Set dstWorkBooks = Workbooks 'OBJが取得できていない?~
 > 'WorkBookを取得~
 > Set dstWorkBook = Workbooks.Application.ActiveWorkbook~
 > 'WorkBookを取得名を取得~
 > dstWorkBookName = dstWorkBook.name~
 マクロで開くブックのオブジェクトを取得するなら下記です。~
 Dim dstWorkBook As Workbook~
 Set dstWorkBook = Workbooks.Open(Filename:=dstWorkBookPath, UpdateLinks:=3)~
 ~
 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜~
 > Call Check(logPath)~
 Check関数には引数定義はありません。~
 > Function Check() As Integer~
 ~
 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜~
 > 'Book開放~
 > dstWorkBook.Close~
 > Set dstWorkBook = Nothing~
 > 'Books開放~
 > Workbooks(dstWorkBookName).Close~
 > Set dstWorkBooks = Nothing~
 ブックを閉じるなら、前の2ステップだけです。~
 後の2ステップは必ずエラーになり無用です。~
 ~
 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜~
 > Function Check() As Integer~
 > Dim check As Integer~
 関数名と変数名が重複しています。~
 ~
 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜~
 > With dstWorkBooks~
 >   If Sheets("結果").Cells(7, i).Value = wAry(i - 2) Then~
 With句 で指定するならブックオブジェクトのdstWorkBookでしょうが、~
 どちらにしても、モジュールレベル変数でもなく、引数引継ぎでも~
 ないですから参照できていませんし、Sheets の前にピリオドが~
 ありませんから、With句の参照下でもありません。~
 ~
 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜~
 > chk1 = check~
 [ chk1 ]は定義されていませんし、最後のここにしか記述されて~
 いませんので、何の働きもしていません。~
 ~
 ~
 ここにある位の、ワークブックを開いてシート・セルを操作するだけなら、~
 【VBAで正常に動作するマクロ】ならば [ Option VBASupport 1 ]~
 を付ければ問題なく動作する筈です。~
 先ずは、それを確認してください。~
 
 //
 ***無題 [#y7249855]
 >tani (2010-03-24 17:05:27 (水))~
 ~
 ファイルを非表示で開きたい場合なんかはLoadComponentFromURLメソッドを利用しないといけないかもしれません。(試していないのでわかりませんが。)~
 ただ、その場合、VBAとOOo Basicのコードが混ざってとても気持ち悪いのと、コードが入っているファイルのフォーマットはxlsではなくodsに変更せざるをえないので、どうせならいっそのこと全部OOo Basicに書き換えるという方向もアリだと思います。~
 
 //
 #article