Question

SE小林 on Wed, 20 Jan 2021 03:54:15


VB2019で、開いているExcelファイルのマクロを実行するプロジェクトを作成し、下記コードを実行するとSystem.IO.FileNotFoundException: エラーとなってしまいます。
VB2010で、まったく同じコードで、開いているExcelファイルのマクロを実行するプロジェクトを作成し、実行するとエラーになりません。
VB2019で、VB2010で作成したそのプロジェクトを読み込んで実行した場合は、VB2019でもエラーになりません。
参照マネージャーで、COM の Microsoft Excel 16.0 Object Library は追加してあります。
VB2019でプロジェクトを新規作成するにはほかに設定する必要があるでしょうか?

 また、Excelファイルのファイル名を

    ExFN = "VBからマクロ実行-2.xlsm"

の様に"-"(ハイフォン)の入ったファイル名にすると、エラー番号:1004 が発生します。
(VB2010で新規作成した場合も、VB2019で、VB2010で作成したプロジェクトを読み込んだ場合もエラーとなります。)

対処方法があるでしょうか?

ご教授お願いいたします。


Imports Microsoft.Office.Interop

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim objApp As New Excel.Application
        Dim MyWorkBook As Object
        Dim PT, ExFN, MacroNm As String

        PT = "C:\Test"
        ExFN = "VBからマクロ実行2.xlsm"
        MacroNm = "HelloWorld"

        'ExcelApliオブジェクト設定
        MyWorkBook = GetObject(PT + "\" + ExFN)
        objApp = MyWorkBook.Application

        On Error GoTo ER
        objApp.Run(ExFN + "!" + MacroNm)       'Excelファイルのマクロ "HelloWorld" 実行
NXT1:
        'オブジェクト解放
        If Not MyWorkBook Is Nothing Then
            System.Runtime.InteropServices.Marshal.ReleaseComObject(MyWorkBook)
            MyWorkBook = Nothing
        End If
        If Not objApp Is Nothing Then
            System.Runtime.InteropServices.Marshal.ReleaseComObject(objApp)
            objApp = Nothing
        End If
        Exit Sub
ER:
        MsgBox("エラー内容:" & Err.Description & vbCrLf & "エラー番号:" & Err.Number, vbOKOnly)
        On Error GoTo 0

        GoTo NXT1
    End Sub
End Class

Replies

佐祐理 on Wed, 20 Jan 2021 06:47:58


マイナスっぽい文字は大量にありますが、正しい文字を入力していますでしょうか? 質問文では U+002D ですかね。

SE小林 on Wed, 20 Jan 2021 06:56:35


Explorer からファイル名をコピーして貼り付けているので間違いないです。

魔界の仮面弁士 on Wed, 20 Jan 2021 07:12:12


実行環境の OS が、Windows 10 バージョン 2004 または 20H2 だったりはしませんか?

もしそうなら、NLS バージョン 6.3 による障害 かもしれません。


SE小林 on Wed, 20 Jan 2021 07:18:26


Windows 10 バージョン 2004です。

Windows 10 バージョン 1909のPCがありますので、そちらで確認してみます。

お馬鹿 on Wed, 20 Jan 2021 07:19:30


FileNotFound エラーが、どのファイルに対するモノなのかは確認されたのでしょうか?
Excel ファイル名に依存して現象が変化するのだとしても、FileNotFound が Excel ファイルによるとは限らないと思います。

SE小林 on Wed, 20 Jan 2021 07:32:55


>FileNotFound エラーが、どのファイルに対するモノなのかは確認されたのでしょうか?
>Excel ファイル名に依存して現象が変化するのだとしても、FileNotFound が Excel ファイルによるとは限らないと思います。

objApp.Run(ExFN + "!" + MacroNm)       'Excel実績登録ファイルのマクロ "HelloWorld" 実行

の所でエラー番号:1004 が発生しているのですから、

        MyWorkBook = GetObject(PT + "\" + ExFN)
        objApp = MyWorkBook.Application

で設定したobjAppのオブジェクトの

ExFN = "VBからマクロ実行-2.xlsm"

のファイルだと思います。

FileNotFoundが発生するのはVB2019で新規プロジェクトを作成した時で、

"-"(ハイフォン)の入ったファイル名で発生するエラーはFileNotFoundではなく、エラー番号:1004です。

SE小林 on Wed, 20 Jan 2021 07:45:55


Windows 10 バージョン 1909のPCで確認したところ、

ExFN = "VBからマクロ実行-2.xlsm"でエラー番号:1004発生しました。

ExFN = "VBからマクロ実行2.xlsm"ではエラー番号:1004発生しません。

お馬鹿 on Wed, 20 Jan 2021 07:49:57


"WinDbg Preview" で TTD ログを採取し、FileNotFound がホントに Excel ファイルに対するものなのか、きちんと確認されることをお勧めします。
-----------------------------------------
Time Travel Debugging - Record a trace
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/debugger/time-travel-debugging-record

Time Travel Debugging - Replay a trace
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/debugger/time-travel-debugging-replay
-----------------------------------------

SE小林 on Thu, 21 Jan 2021 00:17:07


"WinDbg Preview" の情報ありがとうございました。

インストールして実行してみたところ、

「OLEAUT32.dll ライブラリは登録されていません。」とメッセージが出ました。

oleaut32.dllは、WindowsフォルダのSysWOW64フォルダにもSystem32フォルダにもあります。

使用しているExcelのバージョンはMicrosoft Office Home and Buisiness Premium のバージョン2012で32bit版です。

プロジェクトのプロパティでターゲットCPUを x64、x86 どちらにしてもSystem.IO.FileNotFoundException: エラーが出ます。

Windows10 64bit では、32bit版Excelのマクロを実行できないのでしょうか?

お馬鹿 on Fri, 22 Jan 2021 00:24:07


> インストールして実行してみたところ、
>「OLEAUT32.dll ライブラリは登録されていません。」
> とメッセージが出ました。

上記メッセージは、"FileNotFoundException" の「前」と「後」のどちらで発生するのでしょうか?
(あるいは "FileNotFoundException" は起きない?)
あと、"FileNotFoundException" メッセージが表示される直前に、デバッガにブレークインするのでしょうか?

"FileNotFoundException" と「ライブラリは登録されていません。」では、エラーの種類が異なっているような気がします。
なので、"FileNotFoundException" と「ライブラリは登録されていません。」が同一原因で表示されているのか、切り分ける必要があると思います。

とりあえず、現象発生時に Excel プロセス内にロードされている DLL と、スレッド状態を確認したいので、デバッガ上で下記コマンドを実行しその出力結果を提示してもらえますか?
+++++++++++++++++++++++++++++
<実行するコマンド>
vertarget
!peb
~*kvn
+++++++++++++++++++++++++++++

SE小林 on Fri, 22 Jan 2021 00:29:45


Office 64bit版を再インストールしてやってみましたが、System.IO.FileNotFoundException: エラーが出ます。

VB2012、VB2017で新規プロジェクトを作成してやってみましたが、System.IO.FileNotFoundException: エラーは出ません。

同じ手順、同じコードでプロジェクトを作成してビルドしましたが、VB2010,VB2012,VB2017で新規プロジェクトを作成した場合,VB2019で、VB2010で作成したプロジェクトを読み込んでビルドした場合は、System.IO.FileNotFoundException: エラーは出ないのに、VB2019で新規プロジェクト作成した時だけSystem.IO.FileNotFoundException: エラーが出ます。

Windows10 バージョン20H2,2004,1909の3台で試しました。

VB2019に問題があるとしか考えられません。VB2019を使うのは諦めます。

 "-"(ハイフォン)の入ったファイル名でエラー番号:1004が発生するというのは、別の問題で、VB2010,VB2012,VB2017で新規プロジェクトを作成した場合,VB2019で、VB2010で作成したプロジェクトを読み込んでビルドした場合すべてでエラー番号:1004が発生します。

エクセルのファイル名に"-"(ハイフォン)を使わないようにします。

皆さんのご助言に感謝します。

SE小林 on Fri, 22 Jan 2021 02:11:58


System.IO.FileNotFoundException: エラーが発生するのは、VB2019上でデバッグを行っているときに出るエラーで、VB2019プロジェクトのDebugフォルダの中にある実行ファイルを実行してエラーが出たときのエラーメッセージは下記です。

Could not load file assembly 'office, Version=15.0.0.0,

Culture=neutral, PublicKeyToken=71e9bce111e9429c',指定されたファイルが見つかりません。

上記エラーが出てからメッセージを閉じると、

「OLEAUT32.dll ライブラリは登録されていません。」とメッセージが出ます。

vertarget
!peb

~*kvn

を実行すると、下記dllがリストアップされます。

ntdll.dll
KERNEL32.DLL
KERNELBASE.dll
USER32.dll
win32u.dll
GDI32.dll
gdi32full.dll
msvcp_win.dll
ucrtbase.dll
SHELL32.dll
ADVAPI32.dll
msvcrt.dll
sechost.dll
RPCRT4.dll

WinDbgは初めて使うので、スレッド状態を表すのがどの情報なのかわかりません。

申し訳ありませんが、これ以上の問題追及は業務に支障がきたしますのでこれまでとしたいと思います。

SE小林 on Fri, 22 Jan 2021 04:42:27


もう一つだけ情報を発信しますと、

はじめはどこでSystem.IO.FileNotFoundException: エラーが発生しているのかわかりませんでしたが、

VB2019の[オプション]の[デバッグ]で、’マイコードのみを有効にする’のチェックを外してデバッグすると、

NativeWindowクラスの

下記の所でSystem.IO.FileNotFoundException: エラーが発生しています。

        private IntPtr Callback(IntPtr hWnd, User32.WM msg, IntPtr wparam, IntPtr lparam)
        {
            // Note: if you change this code be sure to change the
            // corresponding code in DebuggableCallback below!

            Message m = Message.Create(hWnd, msg, wparam, lparam);

            try
            {
                if (_weakThisPtr.IsAlive && _weakThisPtr.Target != null)
                {
                    WndProc(ref m);
                }
                else
                {
                    DefWndProc(ref m);
                }
            }
            catch (Exception e)
            {
                if (WndProcShouldBeDebuggable)
                {
                    throw;       <---ここで発生しています。
                }
                OnThreadException(e);
            }
            finally
            {
                if (msg == User32.WM.NCDESTROY)
                {
                    ReleaseHandle(handleValid: false);
                }

                if (msg == User32.RegisteredMessage.WM_UIUNSUBCLASS)
                {
                    ReleaseHandle(handleValid: true);
                }
            }

            return m.Result;
        }