「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:0
総数:2232
現在:3


XLSファイルから他のXLSファイルのOBJを参照するには?

ページOpenOffice.org FAQの登録ページ
投稿者
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2010-03-24 13:32:05 (水)
OSXP-SP2
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

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に書き換えるという方向もアリだと思います。

お名前:
題名: