2016-09-12 56 views
1

現在の/開いているブックからユーザーのPC上の場所に埋め込みOLEオブジェクト(Excelドキュメント)を保存しようとしています。このOLEオブジェクトは、マクロの実行中に生成されるテンプレート/ダッシュボードです。マクロのこの部分の目的は、ファイルがユーザーのCドライブに存在するかどうかを最初にテストすることです。存在する場合は、そのファイルを開き、この新しく開いた文書にワークブック変数を設定します。私の知る限り、これはExcel 2010とExcel 2013の間で完璧に動作します。ユーザーがファイルをCドライブに保存していない場合、マクロはOLEオブジェクトを開いてドライブに保存する必要があります。これが完了すると、マクロはその場所をポイントしてファイルを開きます。Excel 2010のファイルに埋め込みOLEオブジェクト(Excelドキュメント)を保存する

以下のコードはExcel 2013で100%動作しますが、Excel 2010では、ファイルをドライブに保存しようとするとマクロが異常終了します。ブレークモードでマクロを実行すると、保存がうまくいきます。ランタイム中にクラッシュするだけです。 DoEventsまたはApplication.Waitを使用する可能性がありますか?私は、文書やコンピュータ資源を節約するという技術に慣れていません。

私が気づいたいくつかの点:

  1. クラッシュが任意のエラーコードを生成しません。単に「応答が停止しました」というメッセージを返します。
  2. 複数のバージョンの.SaveAsファイル形式:= 52と.SaveCopyAsを試しました。
  3. OLEオブジェクトは常に「ワークシートイン」として開きます。これは、私が何らかの形でこれを完全に新しいブックに開くといいと思います。私はこのクラッシュが、オブジェクトがワークブックではなく「ワークシート」としてどのように開かれているかに関係していると考えています。

コード:

Dim uName As String 
Dim fName As String 
Dim wbk As Workbook 
Dim sumWB as Workbook 
Dim cbrWB as Workbook 

Set cbrWB = Workbooks("PreviouslySet")  

uName = Left(Environ("AppData"), Len(Environ("AppData")) - 16) 
fName = uName & "\OTPReport" & ".xlsm" 

If Dir(fName) = "" Then 

    Set oEmbFile = cbrWB.Worksheets("CBRDATA").OLEObjects("OTPReport") 
    oEmbFile.Verb 0 

    For Each wbk In Workbooks 
     If InStr(1, wbk.Name, "Worksheet in", vbTextCompare) > 0 And InStr(1, wbk.Name, Left(cbrWB.Name, Round(Len(cbrWB.Name)/2)), vbTextCompare) > 0 Then 
      Set sumWB = Workbooks(wbk.Name) 
     End If 
    Next wbk 

    With sumWB 
     .Activate 
     .Application.DisplayAlerts = False 

     '==ISSUE EXISTS HERE== 
     .SaveCopyAs (fName) 

     .Close 
    End With 
    Set sumWB = Nothing 
    Set sumWB = Workbooks.Open(fName) 
Else: 
    Set sumWB = Workbooks.Open(fName) 
End If 
+0

あなたは答えではなく、あなたの質問を編集するなど、あなたのソリューションを投稿する必要があります。 –

+0

ああ、そうです。私はStacketiquetteが貧弱だと思う。 – Citanaf

答えて

2

実際の埋め込まれたCOMオブジェクトの代わりに、.Verb 0はあなたを与えるデフォルトのアクションを使用します。

OLEObjectsは、COMサーバー(これは.Objectプロパティ)によって管理されている場合、基礎となるオブジェクトへの参照を公開します。あなたのケースでは、埋め込みワークブックがあるので、それはVBAで遭遇する他のWorkbookオブジェクトのように、ただWorkbookオブジェクトです。あなたがする必要がある必要があるすべては、それを呼び出し.SaveAs次のとおりです。

oEmbFile.Object.SaveAs fName

その後、あなたは、単にあなたの現在のExcelのサーバーでそれを見つけることを試みに関連する体操の残りの部分をスキップすることができます。

+0

あなたのコメントをありがとう。私が提案したようにoEmbFile.Object.SaveAs fNameを使用するようにコードを更新しました。私は2010年と2013年の両方でそれをテストしました。どちらのバージョンも同じように反応します。その行を呼び出すと、 "BookN.xlsm"(N =いくつかの番号)というプロジェクトのリストに新しいブックが作成されます。このブックは、私のアプリケーションリストには表示されません。 VBAプロジェクトエクスプローラでのみ表示されます。私はそれを目に見えるようにするために活性化を呼び出すことはできません。ファイルが「Fname」の場所に正しく保存されることを確認できますが、そのファイルを開こうとすると別の「隠し」wbkが開きます – Citanaf

+0

これらの隠しワークブックは何か関係がありますウィンドウ(I)。アクティブ。私はここで働く何かがあると思う.. – Citanaf

+0

こんにちはComintern、私はポストを更新し、あなたの答えのクレジットを与えました。このソリューションは、どちらのExcelバージョンでもうまく機能しているようです。私はしかし、1つの質問があります。 oEmbFile.Object.SaveAs fNameを使用すると、fNameの場所に保存されたファイルが取得され、デフォルトで開かれたときに開かれていないウィンドウがあることがあります。そのファイルを開くには、ウィンドウを表示するために "Windows(" workbookName ")をアクティブにする必要があります。 – Citanaf

1

ここに私のソリューションを投稿すると、2010年と2013年の両方で動作しているように見えます。この解決策は、ユーザーCOM INternの助けを借りて開発されました。私は彼の答えにこの解決法の信用を与えるでしょう。 /説明ワット

更新コード:

Dim uName As String 
Dim fName As String 

uName = Left(Environ("AppData"), Len(Environ("AppData")) - 16) 
fName = uName & "\OTPReport" & ".xlsm" 

If Dir(fName) = "" Then 
    Set oEmbFile = cbrWB.Worksheets("CBRDATA").OLEObjects("OTPReport") 
    oEmbFile.Object.SaveAs fName 

    'For some reason a new workbook named "BookN" (n = to some integer) is created when 
    'saving our embedded file to C. To counter this, I close the most recently opened workbook. 
    Workbooks(Workbooks.Count).Close 

    'When opening this workbook, the file shows that it is opened, but the window is not activated. 
    'We must use the name of the file and call activate to get it to show up in our active windows. 
    Set sumWB = Workbooks.Open(fName) 
    Windows("OTPReport.xlsm").Activate 
Else: 
    'same explanation as above 
    Set sumWB = Workbooks.Open(fName) 
    Windows("OTPReport.xlsm").Activate 
End If 
関連する問題