DOBON.NET DOBON.NETプログラミング掲示板過去ログ

vb .net Excel Open命令でメモリ例外エラー発生

環境/言語:[win2000 SP4 VB2005 Express Excel2000]
分類:[.NET]

こんにちわ。

【環境】/Windows 2000 SP4/ .NET 2.0/ VB2005 Expess Edition
        /Excel 2000 SP3 C/Sプログラムです。

 下記メモリ例外の原因を調査しましたが、分からず投稿しました。
 どなたか、ご教示頂ければ助かります。

【エラー内容】
今までは(ここ数日)は正常に動作していましたが、2日前から
下記コードを実行すると、ExcelのOpen命令でAccessViolationExceptionクラスの

 「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。
  他のメモリが壊れていることが考えられます。」

が必ず発生する様になりました。

【コード】
Imports excel
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Ex_App As New Excel.Application
        Dim Ex_Wbks As Excel.Workbooks = Ex_App.Workbooks
        Dim Ex_BkName As String

        Ex_BkName = "c:\ファイル名.xls"

        Dim Ex_Wbk As Excel.Workbook = Ex_Wbks.Open(Ex_BkName, ReadOnly:=True)

        Ex_App.Visible = True

        System.Runtime.InteropServices.Marshal.ReleaseComObject(Ex_Wbk)
        Ex_Wbk = Nothing
        System.Runtime.InteropServices.Marshal.ReleaseComObject(Ex_Wbks)
        Ex_Wbks = Nothing
        System.Runtime.InteropServices.Marshal.ReleaseComObject(Ex_App)
        Ex_App = Nothing

    End Sub

End Class

【発生の経緯】
 1.既存のプログラムをバージョンアップの為、プロジェクトフォルダごとコピー。
 2.コピーしたプロジェクトフォルダーを使用してVアップ作業。
 3.2日前にデバッグ時、上記メモリ例外エラーが発生

【エラー発生前に通常と異なる?ソースの変更】
 1.1つのフォームモジュールの中に2つのクラスを作成した。
   ※現在は1つのクラスにしている。

【調査して分かっている事】
 1.エラーが発生するVアップ版は、同一環境の他PCでも必ず発生する。
 2.コピー元(旧バージョン版)は、エラーが発生する環境のPCでも
   正常に動作する。
 3.エラーが発生するVアップ版は、XP Excel2003では正常に動作する。

【実施した事】
 1.VB2005 Express版の再インストール
 2.旧バージョン版のエラーが発生しないモジュール(○○.vb ○○.Designer.vb 
   ○○.resx)をエラーが発生するプロジェクトフォルダにコピーして実施→エラー
   発生

【例外の詳細】
System.AccessViolationException はハンドルされませんでした。
  Message="保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。"
  Source="Interop.Excel"
  StackTrace:
       場所 Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad)
       場所 ○○プログラム.Form1.Button1_Click(Object sender, EventArgs e) 場所 D:\userfiles\Visual Studio 2005(Vup3.0)\Projects\○○プログラム\○○プログラム\Form1.vb:行 11
       場所 System.Windows.Forms.Control.OnClick(EventArgs e)
       場所 System.Windows.Forms.Button.OnClick(EventArgs e)
       場所 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       場所 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       場所 System.Windows.Forms.Control.WndProc(Message& m)
       場所 System.Windows.Forms.ButtonBase.WndProc(Message& m)
       場所 System.Windows.Forms.Button.WndProc(Message& m)
       場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       場所 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       場所 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       場所 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       場所 System.Windows.Forms.Application.Run(ApplicationContext context)
       場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
       場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
       場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       場所 ○○プログラム.My.MyApplication.Main(String[] Args) 場所 17d14f5c-a337-4978-8281-53493378c1071.vb:行 81
       場所 System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
       場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       場所 System.Threading.ThreadHelper.ThreadStart()

  以上です。宜しくお願い致します。
■No27545に返信(ganganさんの記事)

参照設定しているExcelがファイルのバージョンより古いとか?

Excelのオブジェクト使うときは参照設定しないでCreateObjectを使用した
方がある程度のバージョン違いを吸収出来ます。
■No27545に返信(ganganさんの記事)
> 【環境】Excel 2000 SP3
> XP Excel2003では正常に動作する。
XP というのは Office の事でしょうか。Windows の事でしょうか。


> ExcelのOpen命令でAccessViolationException
エラーの直接の要因であるかどうかは分かりませんが、
Workbooks.Open メソッドは、Excel バージョンごとに違いがあります。
参照設定している場合は、タイプライブラリの差異に注意してください。

・開発環境には、複数の Office バージョンを導入しない。
・実行環境と開発環境の Office バージョンは統一させる。
・複数バージョンに対応させたい場合は、レイトバインドを使うか、
 型定義を自分で定義して使うか、バージョン別にアプリを作るかして対応。


========================================================================================
《Excel 5.0》
----------------------------------------------------------------------------------------
  <DispId(&H2AA)> _
  Function Open(Filename, UpdateLinks, ……, Converter)

========================================================================================
《Excel 97/2000》
----------------------------------------------------------------------------------------
  <DispId(&H2AA)> _
  Function Open(Filename, UpdateLinks, ……, Converter, AddToMru)

========================================================================================
《Excel 2002/2003/2007》
----------------------------------------------------------------------------------------
  <DispId(&H783)> _
  Function Open(Filename, UpdateLinks, ……, Converter, AddToMru, Local, CorruptLoad)

  <DispId(&H2AA), Hidden()> _
  Function _Open(Filename, UpdateLinks, ……, Converter, AddToMru)
■No27546に返信(shuさんの記事)
> ■No27545に返信(ganganさんの記事)
>
> 参照設定しているExcelがファイルのバージョンより古いとか?
>
> Excelのオブジェクト使うときは参照設定しないでCreateObjectを使用した
> 方がある程度のバージョン違いを吸収出来ます。
>

ganganです。

早速のご回答ありがとうございました。

参照設定を確認したところ、「Windows 2000 SP4、Excel 2000 SP3」の環境で、
「Windows XP SP3、Office Excel 2003」の「Interop.Excel.dll」を参照して
いた様です。

何度か、プロジェクトフォルダーをWindows XP環境下に移動して作業し、その後
Windows 2000環境下にプロジェクトフォルダーを再移動して作業しました。

Windows XP環境下にプロジェクトフォルダを移動したとき、参照設定を変更した記憶は無いのですが、どうしてプロジェクトフォルダ内の「Interop.Excel.dll」が、Excel 2003のdllに置き換わったのかわかりません。実際に、問題が解決した後、Win XP環境下にプロジェクトフォルダを移動してExcelオブジェクトを操作しようとしましたが、「FileLoadException はハンドルされませんでした」のメッセージが表示され動作しませんでした。

しかし、問題は解決しました。有難うございました。
解決済み!
■No27547に返信(魔界の仮面弁士さんの記事)
> ■No27545に返信(ganganさんの記事)
>>【環境】Excel 2000 SP3
>>XP Excel2003では正常に動作する。
> XP というのは Office の事でしょうか。Windows の事でしょうか。
>
>
>>ExcelのOpen命令でAccessViolationException
> エラーの直接の要因であるかどうかは分かりませんが、
> Workbooks.Open メソッドは、Excel バージョンごとに違いがあります。
> 参照設定している場合は、タイプライブラリの差異に注意してください。
>
> ・開発環境には、複数の Office バージョンを導入しない。
> ・実行環境と開発環境の Office バージョンは統一させる。
> ・複数バージョンに対応させたい場合は、レイトバインドを使うか、
>  型定義を自分で定義して使うか、バージョン別にアプリを作るかして対応。
>
>
> ========================================================================================
> 《Excel 5.0》
> ----------------------------------------------------------------------------------------
> <DispId(&H2AA)> _
> Function Open(Filename, UpdateLinks, ……, Converter)
>
> ========================================================================================
> 《Excel 97/2000》
> ----------------------------------------------------------------------------------------
> <DispId(&H2AA)> _
> Function Open(Filename, UpdateLinks, ……, Converter, AddToMru)
>
> ========================================================================================
> 《Excel 2002/2003/2007》
> ----------------------------------------------------------------------------------------
> <DispId(&H783)> _
> Function Open(Filename, UpdateLinks, ……, Converter, AddToMru, Local, CorruptLoad)
>
> <DispId(&H2AA), Hidden()> _
> Function _Open(Filename, UpdateLinks, ……, Converter, AddToMru)

ganganです。

親切なご回答有難うございました。

XP とはWindowsのことです。

毎回、魔界の仮面弁士さんの回答を見ていると、プログラムを開発する上での技術的な面だけでは無く、開発環境の基本的な事まで教えて頂き、大変勉強になっています。
今回は、確かに「・開発環境には、複数の Office バージョンを導入しない。・実行環境と開発環境の Office バージョンは統一させる。」に違反していました。

今後とも、ご指導の程宜しくお願いします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板