2

VBA (Access 2002 から) を使用して Excel 2007 の新しいインスタンスを作成する際に問題があります。

最初は問題を誤解していて、思ったよりも複雑です。

Set myXL = CreateObject("Excel.Application")

新しいプロセスを作成します (そうではないと思っていました) が、それでも奇妙なことが起こっています。OLE を使用して Excel ファイルを SQL Server データベースに保存しています。

これは、Excel ファイルをフォームにバインドする関数です。

Public Function OpenExcelObjFrame() As BoundObjectFrame
    Dim myXL As Object

    Set myXL = CreateObject("Excel.Application") '#1

    Set gTempWorkbook = myXL.Workbooks.Add
    myXL.Visible = True               '#2

    DoCmd.OpenForm "Excel_OBJ"
    Forms("Excel_OBJ").Visible = False
    Forms("Excel_OBJ").RecordSource = "SELECT Excel_File FROM Excel_File_Obj;"
    Set OpenExcelObjFrame = Forms("Excel_OBJ").Excel_File
End Function

コンテキスト:

Dim tExcelObjFrame As BoundObjectFrame
Set tExcelObjFrame = OpenExcelObjFrame()

tExcelObjFrame.Verb = acOLEVerbOpen
tExcelObjFrame.Action = acOLEActivate '#3

ad 1 2 番目のプロセスの excel.exe が開始します

広告 2 2番目のプロセスで何が起こっているかを確認するために、この行を追加しました

広告 3 OLE はファイルを既存の Excel インスタンスにバインドし、2 番目のプロセスはここで強制終了されます:/

問題は次のとおりです。

  1. tExcelObjFrame.Action = acOLEActivate が 2 番目のプロセスを強制終了する理由

  2. 2番目のプロセスでオブジェクトフレームにExcelファイルを強制的にアクティブにする方法

編集

ここで部分的な説明を見つけました(明確な解決策はありません):

http://www.xtremebbtalk.com/showthread.php?t=292170

  1. Excel のインスタンスが実行されていない場合、オブジェクトに直接またはプログラムを通じてアクセスすると、OLE によって Excel のインスタンスが作成されます。
  2. Excel のインスタンスが既に実行されている場合、これは OLE オブジェクトによって使用されるインスタンスです。

問題は、OLE オブジェクトが間違った Excel インスタンスを選択することです。問題は、OLE を特定のインスタンスに向ける方法があるかどうかです。

ここで説明されている同じ問題(解決策はありません):

http://groups.google.com/group/microsoft.public.win32.programmer.ole/browse_thread/thread/9c4cde2a79453037

4

3 に答える 3

1

更新:
ワークステーションで既存のコードを試してみました。

Set myXL = CreateObject("Excel.Application")

あなたが要求しているように動作するようです。
プロセスを 1 つ開いてから、その行を実行すると、別のプロセスが作成されます。

もう少し調べてみたところ、これは Excel 2007 のちょっとした癖であることがわかりました。
私が調べたすべてのことから、Windowsファイルの種類(一番下までスクロール) またはレジストリハッキングにたどり着きます。この状況で基本的に同じことを変更しています。

VBA では、CreateNewKey と SetKeyValue を使用してレジストリ キーを操作できることは知っていますが、それを行うかどうかはわかりません。

于 2009-05-08T10:45:43.637 に答える
1
Sub New_Excel()

'Create a Microsoft Excel instance via code using late binding. (No references required)

Dim xlApp As Object

Dim wbExcel As Object

'Create a new instance of Excel

Set xlApp = CreateObject("Excel.Application")

'Open workbook

Set wbExcel = xlApp.Workbooks.Open("Book1")  'or you may place here the complete name and path of the file you want to open upon the creation of the new instance

'Set the instance of Excel visible. (It's been hiding until now)

xlApp.visible = True

'Release the workbook and application objects to free up memory

Set wbExcel = Nothing

Set xlApp = Nothing

End Sub
于 2011-06-16T20:45:50.657 に答える
0

個々のExcel2007インスタンスで複数のブックを開こうとしたときに同様の問題が発生しました。Excel2003ではこれは正常に機能しましたが、現在はすべて同じインスタンスで開きます。

これで問題が解決するかどうかはわかりませんが、ExcelにDDEを使用しないように指示して修正しました(または希望どおりに機能させました)(オプション、詳細、一般、DDEを使用する他のアプリケーションを無視します)。これを行う場合は、デフォルトでDDEを使用するExcelを起動するエクスプローラーのすべてのファイルタイプを変更する必要があることに注意してください。ファイルオプションを編集し、[DDEを使用]のチェックを外して、末尾に「%1」を追加します。コマンドライン。

(実際には、1つのExcelインスタンスのみが作成されていたAndyの回答からのコメントに答えるかもしれませんが、複数のインスタンス開かれている元の質問に必ずしも役立つとは限りません)

于 2009-05-08T12:25:57.427 に答える