XLSファイルから他のXLSファイルのOBJを参照するには? †
ページ | OpenOffice.org FAQの登録ページ |
---|---|
投稿者 | |
分類 | |
優先順位 | |
状態 | |
カテゴリー | |
投稿日 | 2010-03-24 13:32:05 (水) |
OS | XP-SP2 |
依存するページ | |
バージョン |
メッセージ †
回答ページでは行末に「~」を付加する必要はありません |
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で動作しますか? †
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 ]
を付ければ問題なく動作する筈です。
先ずは、それを確認してください。
無題 †
tani (2010-03-24 17:05:27 (水))
ファイルを非表示で開きたい場合なんかはLoadComponentFromURLメソッドを利用しないといけないかもしれません。(試していないのでわかりませんが。)
ただ、その場合、VBAとOOo Basicのコードが混ざってとても気持ち悪いのと、コードが入っているファイルのフォーマットはxlsではなくodsに変更せざるをえないので、どうせならいっそのこと全部OOo Basicに書き換えるという方向もアリだと思います。