Excel-VBAでDSOFile.dllを使用する方法

このQ&Aのポイント
  • エクセルの「ユーザー設定のドキュメントプロパティ」を取得するためには、Microsoftが作成し無償で公開しているDSOFile.dllをインストールする必要があります。
  • DSOFile.dllをダウンロードし、参照設定を行った後、Excel-VBAコード内でオブジェクトを作成して使用することができます。
  • Windows Vistaの場合でも、Excel 2007でのVBAプロジェクトでDSOFile.dllを使用することができます。
回答を見る
  • ベストアンサー

Excel-VBAでDSOFile.dll使える?

エクセルの「ユーザー設定のドキュメントプロパティ」を取得するには、Microsoftが作成し無償で公開しているDsofile.dllをインストールすれば可能との事なので、以下のページからダウンロードして、インストールしました。 Microsoft Developer Support OLE File Property Reader 2.1 Sample (KB 224351) http://www.microsoft.com/downloads/en/details.aspx?FamilyId=9BA6FAC6-520B-4A0A-878A-53EC8300C4C2&displaylang=en <現象> 参照設定「DSO OLE Document Properties Reader 2.1」の後、 次のを実行したのですが「実行エラー438」が発生!? Sub Test01() Dim DSO As Object Set DSO = CreateObject("DSOFile.OleDocumentProperties") DSO.Open "D:\Test1\Book01.xls" MsgBox DSO.BuiltinDocumentProperties("Author") '←実行エラー DSO.Close Set DSO = Nothing End Sub <質問> OS:WinVista(Excel2007-VBA)でDSOFile.dllは使えますか? ご教授よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

言っておくけど、Q6708610とDSO.dllで使っているオブジェクトは異なる物、だからね。 実際そのサンプルに含まれるコード(多分読んでないんだろうなあ)にはBuiltinDocumentPropertiesなどというものは一切使われていない。 参考にした http://technet.microsoft.com/ja-jp/scriptcenter/ff191274 も同様だ。まったくそんなものはない! #一応MS Officeがない環境を考え、Windows XP + VBScriptで検証した。 (マシンがないからそのような環境を作ってテスト、はしてない。なのでVista+MS Office 2007の状況は知らない) '================================ Dim DSO ' VBScriptから As Objectとか型指定はできないみたい。 ' ちなみに、VB6やVBAで参照設定するなら、型名としてちゃんと使えるから、 '遅延バインディングとか要らないと思うよ(VBSは参照設定無理だし型指定もできないけど) Set DSO = WScript.CreateObject("DSOFile.OleDocumentProperties") 'どうも、Excel等が既にこのファイルを読んでいるときに、開こうとするとファイル名等が正しくても、「パスまたはファイル名が無効」みたいなことを言われる。正当な理由があるならエラーになるのは別に構わないんだけど、エラーメッセージくらい正しく出して欲しいものだ。 DSO.Open "D:\Book1.xls" '今回はValueとか付けないみたいです。付けたら怒られたので。厳密に調べたかったら、VB6やVBAのオブジェクトブラウザでも使いましょう。 '何か「ドキュメントがない」んですよね。ひどい事に。 MsgBox DSO.SummaryProperties.Author DSO.Close Set DSO = Nothing '============================== とか実行したら、xlsファイルの作成者名として、xlsを作成したマシンのユーザー名であるOwnerが表示された。

sakuraww
質問者

お礼

himajin100000さんお世話になっております。 Dsofile 語られざる物語 http://technet.microsoft.com/ja-jp/scriptcenter/ff191274 を拝見しました(読ませていただきました)…納得。 露骨にファイルを開かないでプロパティ情報値を取得(設定)できる事を理解しました。 お陰様で私の望んでいた事が全て叶いました。 本当にお世話になりました。 <参考> 試行結果:下記は何れも動作しました。 WinXP (Excel2003.xls-VBA) Dsofile.dllを参照設定 WinVista(Excel2007.xls-VBA) Dsofile.dllを参照設定 Sub Dsofile値表示() Dim wTarget As String wTarget = Application.GetOpenFilename("Excel Files(*.xls*), *.xls*") If wTarget = "False" Then Exit Sub Dim objFile As Object Set objFile = CreateObject("DsoFile.OleDocumentProperties") objFile.Open (wTarget) MsgBox "Author: " & objFile.SummaryProperties.Author '←作者 Set objFile = Nothing End Sub

その他の回答 (1)

  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.1

DSOFile.dll は、Excel を使わずに「ユーザー設定のドキュメントプロパティ」を取得するためのものです。 それを Excel から使うというのはどういうことでしょう。 Excel からなら、そんなもの必要ありません。

sakuraww
質問者

補足

目的は、当該Excelから他のExcelファイルの「ユーザー設定のドキュメントプロパティ」を取得又は設定したい。且つ、他のExcelファイルを開かないでこれを行いたい。 私のパソコン環境にはVB等の開発環境を用意していません。依ってExcel-VBAによる便利ツールを作成し作業の効率化を試みています。 そこで、掲題の「DSOFile.dll」を適用すれば画期的な威力を発揮してくれるのではと期待しているわけです。的外れでしょうか!?。。。 何れにしろ「実行エラー」が解消できれば幸いです。 ご教授宜しくお願いいたします。

関連するQ&A

  • C++のDLLが見つからないVBAから見つからない

    こんにちは。質問させてください。 Visual C++ 2008 Express Editionで自作DLLを作成しました。 このDLLが、開発環境(WindowsXP、Excel2002)の Excelマクロで呼び出したところ、うまく動いたのですが、 WindowsVista、Excel2007のPCで同じマクロを実行すると 実行時エラー '53' ファイルが見つかりません [ファイル名] というエラーが出て実行できません。 どちらの環境でもDLLファイルはフルパスで指定していて ファイルはちゃんと存在しています。 原因が、Vistaなのか、Excel2007なのか またはその他の要因なのか、わからずに悩んでいます。 どなたか心当たりがある方がいらっしゃいましたらご教授願います。 よろしくお願いします。 その他詳細 ・DLLはdefファイルを使ってEXPORTしました。 ・Vistaのユーザーアカウント制限をoffにしてます。 ・Declear部分のソースコードは Declare Sub Prepare Lib "C:\test\API_test.dll" (ByVal FileName As String)です。

  • DLL作成後VBAで使用しようとするとエラーが出ます

    エントリxxがDLLファイルyy内に見つかりません。とエラーが出ます。 複雑な処理をCでやろうとして基本的な箱を作ろうとしたのですがうまくいきません。どなたか教えていただけないでしょうか? C側 #define DLL_EXPORT __declspec(dllexport) extern "C" { DLL_EXPORT void kinou(int a); } void kinou(int a) { //処理 } 呼び出し規約はstdcallしています。 VBA側 Declare Sub kinou Lib ".\test.dll[ (フルリンクしています)] " (ByVal a As Integer) Sub test() Call tasu(10) End Sub

  • 配列をDLLの戻り値としてVBAで受け取る書き方

    vbdll.dll: int * __stdcall arr() { int a[] = {1,2,3}; return a; } vba: Declare Function arr Lib "C:\temp\vbdll.dll" () As Long() Sub test() Dim ccc() As Long ccc = arr Debug.Print ccc(0) End Sub インデックスが有効範囲にありませんになります 配列をDLLの戻り値としてVBAで受け取る書き方を教えてください? 何卒、ご教授お願いします。

  • エクセルVBA実行時のエラー:DLLファイルが見つ

    タイトル:エクセルVBA実行時のエラー:DLLファイルが見つかりません  質問させていただきます。どうぞよろしくお願いいたします。 環境:PC1~3の全てが、Excel2010、Win7になります。 初めてVBAから読み込むためのDLLファイルを作成いたしました。    PC1上で動作確認できている2つのファイル(Test4.dll(VC++2013にて作成)と それを呼び出すVBAのついたエクセルファイル)を、 PC2とPC3に移動し、VBAを実行しましたところ 何故かPC3でのみ下記エラーが発生いたします。 >実行時エラー'53' >ファイルが見つかりません。Test4.dll ・2つのファイルは同じフォルダ内で実行しております。 ・VBAのカレントパスは   ChDrive Left(ThisWorkbook.Path, 1)   ChDir ThisWorkbook.Path で変更しております。  試しにC:\Windows\System32と C:\Windows\SysWow64にも Test4.dllをコピペしてみましたが、同じエラーが出てまいります。 ・PC3のみ違うところを探してみましたが、思いつくのは下記くらいでございます。   1.VSが入っておりませんでした。(必要なのでしょうか??)   2.実行しているパスが違います。     PC1とPC2の実行パス:      D:\Users\Administrator\Documents\VBA_TEST     PC3の実行パス:      D:\Documents\VBA_TEST              もし何か原因として思いつかれる事がございましたらお教えいただけないでしょうか。 お詳しい方がいらっしゃいましたら何卒よろしくお願いいたします。

  • VC++で作成したDLLについて

    すみません、 VC++6.0で作成したDLLについて教えていただきたいのですが。 TEST_A.DLLというDLLと、TEST_B.DLLというDLLファイルを作成したとして これをC:\TEST\DLL\に格納してるとします。 このとき、TEST_B.DLLからはTEST_A.DLLの関数を呼び出しています。 次に、TEST_B.DLLの関数を使用しているTEST.EXEという実行ファイルを VB6.0で作成します。 このファイルをC:\TEST\EXE\に格納します。 そして、TEST.EXEを実行すると、 「TEST_B.EDLLが見付かりません」と言って怒られてしまいます。 VBでは、TEST_B.DLLをフルパスで指定しております。 しかし、TEST_A.DLLをEXEと同じ場所に置いてあげると 正常に動きます。 これは、TEST_B.DLLからTEST_A.DLLが見えていないということなのでしょうか? TEST_B.DLLの設定がおかしいのでしょうか? それとも、TEST.EXEでもTEST_A.DLLをフルパス指定してあげないといけないのでしょうか? ちなみに今回、プロジェクトマネージャーから「環境変数(PATH)の設定はしたくない」と言われていますので、PATHの指定はしてません。 すみませんが、どなたか教えていただけますでしょうか?

  • 「Microsoft Excel - 」を表示させ

    「Microsoft Excel - 」を表示させない方法はありますか? Sub t1() ActiveWindow.Caption = "test" End Sub をすると、 「Microsoft Excel - test」になってしまいます。 タスクバーには「test」だけを表示させたいのですが、 「Microsoft Excel - 」があるせいで、testまで表示されません。 Sub t2() Debug.Print ActiveWindow.Caption End Sub を実行しても、testしか取得されないから、 「Microsoft Excel - 」を消すことは無理なのでしょうか?

  • VBAで、VBProjectへのアクセスのための設定について教えてください。

    Excelで、下記のようなマクロを作成し動かしたころ、 「実行時エラー'6068'  Visual Basic Projectへのプログラム的なアクセスは信頼されません」 というエラーが出てしまいます。 どのように対処すれば動作するようになるのでしょうか。ご教示ください。よろしくお願いいたします。 【環境】 Windows XP & Office2003 【設定など】 Excel:[ツール]-[マクロ]-[セキュリティ]で、  「Visual Basic プロジェクトへのアクセスを信頼する」にチェック VBエディタ:[ツール]-[参照設定]で、以下の参照を追加  Microsoft Visual Basic for Applications Extensibility 5.3  Microsoft Word 11.0 Object Library 【作ろうとしているマクロ】 (1)マクロを含んだWordファイルを開く (2)Wordファイルのプロパティや、マクロのプログラムの行数などの値を取得 (3)Excelのシートに取得した値を入力 【作ったマクロ】 Sub test() Dim objWord As Object Set objWord = CreateObject("Word.Application") flname = "(フルパスでのファイル名)" With objWord .Visible = False .Documents.Open Filename:=flname, _ ReadOnly:=True, _ OpenAndRepair:=False With objWord.Documents aaa = .Item(1).BuiltinDocumentProperties(1).Value Worksheets("test").Cells(1, 1).Value = aaa 'ここまでは正常に動作します。 bbb = .Item(1).VBProject.VBComponents(1).CodeModule.CountOfLines 'ここで実行時エラーが出ます。 Worksheets("test").Cells(1, 1).Value = bbb .Item(1).Close SaveChanges:=wdDoNotSaveChanges End With End With objWord.Quit Set objWord = Nothing End Sub 以上です。 どうか、よろしくお願いいたします。

  • エクセルVBA:valueプロパティについて(省略可能?)

    VBA初心者です。よろしくお願いします。 例として、アクティブシートにA1=10,A2=20と入力されているとき、 次の”test01誤”プロシージャーを実行すると、A3が「30」となるわけですが、うっかり、valueプロパティを書きもらしていることに気がつきました。本来なら、”test01正”のように書くべきところだったのでしょう。しかしエラーがでることなく結果が正しくでるということは、valueプロパティは省力可能と理解していいのでしょうか?省略すると、プログラム上問題を起こす可能性があるのでしょうか? よろしくご指導ください。 Sub test01誤() Range("A3") = "=A1+A2" End Sub Sub test01正() Range("A3") .value= "=A1+A2" End Sub

  • VBAからDLLをCALLしたいのですが

    仕事上今まで蓄積されているFortranプログラムを効率よく使いたくDLL,VB,VBAにチャレンジしていますが, Intel(R) Fortran Compiler9.0で作成したDLLをEXCELのVBAからCALLしたところ 実行時エラー'49' DLLが正しく呼び出せません のエラーが表示されました。 このDLLはVisual Basic .NETで作成したVBからは正しくCALLできています。 色々原因を調べているのですがVBAからDLLの呼び出しとDLL内の計算は正しく行われておりDLLからVBAに戻るときにエラーになっているようです。 テストを行っているFortranとVBAのソースは以下です。VBAでDLLをCALL出来るように解決いたしたくご教授願お願いいたします。 (1)---- Fortran ソース --------------------------- subroutine DLL1(Q,QQ,QQQ) ! Expose subroutine DLL1 to users of this DLL ! !DEC$ ATTRIBUTES DLLEXPORT::DLL1 !DEC$ ATTRIBUTES ALIAS:'DLL1'::DLL1 ! Variables ! Body of DLL1 real*4 Q,QQ,QQQ QQ = Q*2 QQQ = Q**3 end subroutine DLL1 (2)----------- VBA ソース -------------------- Private Q As Single Private QQ As Single Private QQQ As Single Declare Sub DLL1 Lib "DLL1.dll" (ByRef Q As Single, ByRef QQ As Single, ByRef QQQ As Single) Sub Macro1() ChDrive ActiveWorkbook.Path ChDir ActiveWorkbook.Path Q = 2# Call DLL1(Q, QQ, QQQ) Cells(5, 2) = Format(Q, "#####.#0") Cells(6, 2) = Format(QQ, "#####.#0") Cells(7, 2) = Format(QQQ, "#####.#0") End Sub

  • IronPython でのDLL の使用について

    Visual Basic 2010 でDLLを作成し,IronPython 2.6 で使用したいのですがエラーが出て動きません。 何かアドバイスがありましたらお願いします。 ・DLLの作成 Visual Basic の新規プロジェクトを”クラスライブラリ”として作成 (.NET Framework 2.0) Public Class aaa Public Sub bbb() MsgBox("AAA") End Sub End Class ・IronPython での呼び出し側 import os import clr import sys clr.AddReferenceByPartialName("Microsoft.VisualBasic") from Microsoft.VisualBasic import Interaction sys.path.append(os.path.dirname(os.path.abspath(__file__))) clr.AddReferenceToFile("test_VB.dll") import test_VB aa = test_VB.aaa aa.bbb() 実行すると, TypeError: bbb() takes exactly 1 argument (0 given) となってしまいます。 bbb()定義時には何も引数を指定していないのですが, 何を渡せばいいでしょうか? よろしくお願いします。