* 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