2017-02-07 160 views
0

私は次のコードを使用して、更新されたブックを保存しています。実行時エラー '1004':SaveAsメソッドのオブジェクト '_Workbook failed

Private Sub cmdSaveUpdatedWB_Click() 

On Error GoTo Err_cmdSaveUpdatedWB_Click 

    gwbTarget.Activate <<<<<<<<<<<<<<<<<<<<<<< 

    Application.DisplayAlerts = False 

    gwbTarget.SaveAs txtUpdWorkbookName.Value, FileFormat:=xlOpenXMLWorkbookMacroEnabled 

    Application.DisplayAlerts = False 

    frmLoanWBMain.Show 
    gwbTarget.Close 
    Set gwbTarget = Nothing 

    gWBPath = "" 
    gWBName = "" 

    lblWorkbookSaved.Enabled = True 
    cmdUpdateAnotherWorkbook.Visible = True 

Exit_cmdSaveUpdatedWB_Click: 

    Exit Sub 

Err_cmdSaveUpdatedWB_Click: 

    MsgBox "The following error occurred inthe [cmdSaveUpdateWB_Click] event handler." & vbCrLf & _ 
      "Error Number: " & Err.Number & vbCrLf & "Error descriptioin: " & Err.Description 

    Resume Exit_cmdSaveUpdatedWB_Click 

End Sub 

[名前を付けて保存]操作が失敗します。私は、その失敗は、ワークブックを保存してフォーカスを失う結果であると判断しました。コードをステップ実行してエラーを取得できます。エラーが生成されたら、エラーメッセージボックスで[デバッグ]を選択し、F5キーを押してコードを実行すると、ブックが正しく保存されます。保存するworbookのActivateメソッドの前後にDebug.Printステートメントを配置すると、アクティブなwokbookは、ブックとワークブックの更新に使用されたフォームを含むブックであることを示します。 ActiveWorkbook.Nameを印刷するImmediate wondowにprintステートメントを配置すると、保存するワークブックの名前(gwbTarget.Name)が表示されます。 F5キーを押すとコードが正しく実行されます。 私は、保存するワークブックがなぜ失われたのか理解できませんでした。遅延、複数の起動文、ワークブックを保存するためのローカル変数、および保存するワークブックの名前を配置しました。なぜこれが起こっているか、どのように修正するのかについての助けや考えがあれば幸いです。

私はいくつか変更を加えました。コードは以下にリストされています...

Private Sub cmdSaveUpdatedWB_Click() 
On Error GoTo Err_cmdSaveUpdatedWB_Click 

Dim wbSave As Workbook 

    Set wbSave = gwbTarget 

    gwbTarget.Activate 

    Application.DisplayAlerts = False 

''''''' gwbTarget.SaveAs txtUpdWorkbookName.Value, FileFormat:=xlOpenXMLWorkbookMacroEnabled 

    wbSave.SaveAs fileName:=txtUpdWorkbookName.Value, FileFormat:=xlOpenXMLWorkbookMacroEnabled 

    Application.DisplayAlerts = False 

    frmLoanWBMain.Show 
    gwbTarget.Close 
    Set gwbTarget = Nothing 

    gWBPath = "" 
    gWBName = "" 

    lblWorkbookSaved.Enabled = True 
    cmdUpdateAnotherWorkbook.Visible = True 


Exit_cmdSaveUpdatedWB_Click: 

    Set wbSave = Nothing 
    Exit Sub 

Err_cmdSaveUpdatedWB_Click: 

    MsgBox "The following error occurred inthe [cmdSaveUpdateWB_Click] event handler." & vbCrLf & _ 
      "Error Number: " & Err.Number & vbCrLf & "Error descriptioin: " & Err.Description 

    Resume Exit_cmdSaveUpdatedWB_Click 

End Sub 

私はコードを以下のように変更しました。リストは、プログラムへの参加時の変数定義とともに、下にあります。 ExcelコードはCitrix環境で実行されていますが、タイミングに影響する可能性がありますが、コードの実行に他の影響はありません。

簡潔にするために、他のコードバージョンを削除しました。次のコードは動作しています。重要な問題は、SaveAsメソッドが呼び出されたときに、保存するワークブックがアクティブブックでなければならないことです。

ます。Private Sub cmdSaveUpdatedWB_Click()

文字列

としてワークシート としてブック として暗いwbSave薄暗いwsActive薄暗いsNWBName

エラー後藤Err_cmdSaveUpdatedWB_ClickでExit_cmdSaveUpdatedWB_Click:

Set wbSave = Nothing 
Exit Sub 

Err_cmdSaveUpdatedWB_Click: あなたはより多くのあなたのようにそれを作るとうまくいけば、それまでの時間で、この

Private Sub cmdSaveUpdatedWB_Click() 
    Dim gwbTarget As Workbook 
    Set gwbTarget = Workbooks("workbook_name.xlsm") 'correct extension needed, workbook must be open 

    wb.SaveAs Filename:=gwbTarget.Path, FileFormat:=xlOpenXMLWorkbookMacroEnabled 

    MsgBox "Last saved: " & gwbTarget.BuiltinDocumentProperties("Last Save Time") 
End Sub 

変更一つのことのようなもので始まらないのはなぜ文字列

として暗いstrErrMsg
strErrMsg = "Error Number: " & Err.Number & " Desc: " & Err.Description & vbCrLf & _ 
     "Source:" & Err.Source & vbCrLf & _ 
     "Updating Workbook: " & vbCrLf & "  " & gwbTarget.Name & vbCrLf & _ 
     "Selected Worksheet: " & gwsTrgSheet.Name & vbCrLf & _ 
     "Active Workbook: " & vbCrLf & "  " & ActiveWorkbook.Name & vbCrLf & _ 
     "Worksheet: " & ActiveSheet.Name & vbCrLf & _ 
     "Code Segment: cmdSaveUpdatedWB_Click event handler" 

RecordErrorInfo strErrMsg 

Resume Exit_cmdSaveUpdatedWB_Click 

End Subの

+0

「gwbTarget」はどこで宣言していますか?コードが保存されているのと同じブックですか? – CallumDA

+0

コードを含むブックに含まれているコードモジュールで宣言されているグローバル変数です。 – Thope

+1

まず 'activate'文を削除することができます。これは必要ありません。あなたの 'gwbTarget'が' SaveAs'行にブレークポイントを置き、コードがそこで停止したときにあなたのローカルをチェックすることによって定義されているかどうか確認してください。私の推測では、 'gwbTarget'は' Nothing' – CallumDA

答えて

0

」すべてうまくいくでしょう!コメントを1として

更新

。何百ものブックを開いて更新して閉じようとしている場合。

Sub ChangeWorkbooks() 
    Application.ScreenUpdating = False 

    Dim wbPaths As Range, wbSaveFilenames As Range 
    With Sheet1 'you will need to update this and the ranges below 
     Set wbPaths = .Range("A1:A650") 'including file extensions 
     Set wbSaveFilenames = .Range("B1:B650") 'including file extensions 
    End With 

    Dim i As Integer, totalBooks As Integer 
    Dim wbTemp As Workbook 

    totalBooks = wbPaths.Rows.Count 
    For i = 1 To totalBooks 
     Application.StatusBar = "Updating workbook " & i & " of " & totalBooks 'display statusbar message to user 
     Set wbTemp = Workbooks.Open(wbPaths.Cells(i, 1), False) 

     'make changes to wbTemp here 

     wbTemp.SaveAs wbSaveFilenames.Cells(i, 1) 
     wbTemp.Close 
    Next i 
    Set wbTemp = Nothing 

    Application.ScreenUpdating = True 
    Applicaton.StatusBar = False 
End Sub 
+0

アイデアありがとう。ワークブックへの参照をローカルに保存し、提案したフォーマットを使用しました。私は更新するために別のワークブックを12回実行しています。助けてくれてありがとう。 – Thope

+0

更新 - 問題は引き続き起こります。丁寧な言葉で私の興奮を表現することはできません。この時点で、エラーメッセージをクリックし、[保存]コマンドボタンを再度クリックすると、正常に動作しているように見えます。 – Thope

+0

コードを変更しましたか?あなたは新しいコードで質問を更新できますか(元のコードは削除しないでください)。 – CallumDA

関連する問題