7

「新規」がオブジェクトとスクリプトに与える影響について説明を求めています。

私の理解では、Excel ドキュメントでアクションを実行する必要があり、アプリケーションが閉じている場合は、New Excel.Application を使用する必要があります。

このアプリケーションを (たとえばワークブックなどのオブジェクトを介して) アクティブなままにし、スクリプトの後半で別のワークブックを開くことにした場合、引き続き New Excel.Application を使用する必要がありますか、それとも Excel.Application を使用する方がよいでしょうか?

私の懸念は、少なくとも 5 つのワークブックに対してアクションを実行する長いスクリプトを作成しようとしているという事実にあります。あるワークブックから別のワークブックに切り替えてから、前者に戻る必要があります...

スクリプトが新しい Excel.Application を作成するたびに、非常に多くのアプリケーションが実行される可能性があり、この混乱が問題を引き起こすのではないかと心配しています。

次のように書く方が適切ですか?

Dim NxlApp as New Excel.Application
Dim xlApp as Excel.Application

  NxlApp.Workbooks.Open "C:\Users\...\WorkbookA.xlsx"
  NxlApp.Visible = True

'Perform actions on WorkbookA (keep it open)


  Set ExcelApp = GetObject("", "Excel.Application.14")
  xlApp.Workbooks.Open "C:\Users\...\WorkbookB.xlsx"
  xlApp.Visible = True

'Perform actions on WorkbookB (keep it open)


'Go back to WorkbookA (using the xlApp variable this time)

  xlApp.Workbook("A.xlsx")...
4

2 に答える 2

6

少なくとも 5 つのワークブックに対してアクションを実行する長いスクリプトを作成します。

良い質問です。短い答えは、1 つの Application オブジェクトで 5 つのワークブックを開くことができるということです。

Excel を使用している場合 (または以下を参照)、Excel.Application は既に存在します。次に、各ワークブックを異なるオブジェクトに設定するか、名前で参照できます。

dim wb1, wb2 as Excel.Workbook, wb3 as New Excel.Workbook 'blank is
same as Variant set wb1 = application.open("path/wb.xlsx") msgbox
wb1.name                  'ref by object msgbox
workbooks("wb.xlsx").name 'ref by name

私の理解では、Excel ドキュメントでアクションを実行する必要があり、アプリケーションが閉じている場合は、New Excel.Application を使用する必要があります。

Excel の外部 (Access など) にいる場合は、Excel.Application オブジェクトを作成することができます。いくつかのヒントを次に示します。

Dim nXlApp as New Excel.Application

以下と同じ効果があります。

Dim xlApp as Excel.Application
Set xlApp = New Excel.Application             'Early Binding
Set xlApp = CreateObject(“Excel.Application”) 'Late Binding

ループ内で定義 (dim) しないでください。ただし、同じオブジェクトを何度でもインスタンス化 (Set) できます。コントロール (ボタンなど) 内でグローバル オブジェクト (推奨されませんが便利な場合もあります) を使用している場合は、次のようなものを使用できます。

if xlApp is Nothing then set xlApp = CreateObject(“Excel.Application”)

終わったら、家を掃除することを忘れないでください!

wb1.Close False
set wb1 = Nothing 'do this once for each defined object, anything using New/Set

また、参照してください。

于 2015-10-26T23:05:53.550 に答える