Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
キャンセル処理が正常に完了しない
投稿日時: 20/04/29 11:00:25
投稿者: aomi

下記のダイアログ表示で[キャンセル]を選択したら以降の処理を中止し、[保存]を選択したら保存できるようにしたいと思っています。
 
[保存は]大丈夫だと思っていますが、[キャンセル]の場合、MsgBox "処理を中止します。"は表示されるのですが、ファイルを保存しようとします。
 
どのように記述したらよろしいかアドバイスを頂けますでしょうか?
よろしくお願いいたします。
 
        '完了したら保存
        If Len(strFileName) = 0 Then
            MsgBox "処理を中止します。"
            .activeworkbook.Close FileName:=strTemplate
            xlapp.Quit
            Exit Sub
        Else
        .activeworkbook.SaveAs FileName:=strFileName
         
        End If
 
_________________________________________________
 
 
Private Sub NewTXexpo_DblClick(Cancel As Integer)
 
On Error GoTo Err_FileDialog_Click
    Dim strsql As String
    Dim strTemplate As String
    Dim strFileName As String
    Dim ExpFileName As String
    Dim xlapp As Object
    Dim myCn As New ADODB.Connection
    Dim myRs As New ADODB.Recordset
 
    'ファイル名作成
    ExpFileName = "VA01_KE_OCR_Shortterm" & "_" & Format(Date, "yyyymmdd")
    strFileName = GetFileName(False, "MicrosoftExcel ブック (*.xlsx)|*.xlsx", "", ExpFileName & ".xlsx")
     
    'EXCELアプリケーションを起動
    Set xlapp = CreateObject("Excel.Application")
     
    'セットする過程が見えないよう一旦不可視
    xlapp.Visible = False
     
    Set myCn = CurrentProject.Connection
     
    strsql = "Q_Shortterm2Expo"
     
    'レコードセットオープン
    myRs.Open strsql, myCn, adOpenForwardOnly, adLockReadOnly
     
    With xlapp
        'テンプレートを開く
        strTemplate = Application.CurrentProject.Path & "\" & "VA01_KE_OCR_Shortterm.xlsx"
         
        'テンプレートファイルが存在しないときはエラー
        If Dir(strTemplate) = "" Then
            MsgBox "テンプレートファイルを確認してください。", vbOKOnly + vbCritical, "エラー"
            .Visible = True
            .Quit
            Exit Sub
        End If
         
        'テンプレートファイルオープン
        .Workbooks.Open strTemplate
     
        '結果値出力処理(1行目にヘッダーを表示しているので、2行目1列目からセット
        .Cells(2, 1).CopyFromRecordset myRs
         
        '完了したら保存
        If Len(strFileName) = 0 Then
            MsgBox "処理を中止します。"
            .activeworkbook.Close FileName:=strTemplate
            xlapp.Quit
            Exit Sub
        Else
        .activeworkbook.SaveAs FileName:=strFileName
         
        End If
         
        MsgBox "出力しました。", vbOKOnly + vbInformation
    End With
     
    Set myRs = Nothing: Close
    Set myCn = Nothing: Close
     
    'Excelを終了します
    xlapp.Quit
    Exit Sub
 
Exit_FileDialog_Click:
    Exit Sub
     
Err_FileDialog_Click:
    MsgBox "予期せぬエラーが発生しました" & Chr(13) & _
            "エラーナンバー:" & Err.Number & Chr(13) & _
            "エラー内容:" & Err.Description, vbOKOnly
    End
     
    Resume Exit_FileDialog_Click
 
End Sub

回答
投稿日時: 20/04/29 14:10:20
投稿者: MMYS

> .activeworkbook.Close FileName:=strTemplate
 
Close メゾットの引数をそのように記述した理由は?
 
https://docs.microsoft.com/ja-jp/office/vba/api/excel.workbook.close
ヒント。
> パラメーター
> SaveChanges
> ブックに変更がない場合、この引数は無視されます。
>   <中略>
> この引数で、変更を保存するかどうかを指定します。
 
 

投稿日時: 20/04/29 18:07:14
投稿者: aomi

MMYSさん
返答ありがとうございます。
 
青文字のところを、赤文字に変更してみたのですが、変化なしでした。
たぶん書き方が悪いのですが・・・
 
  '完了したら保存
        If Len(strFileName) = 0 Then
            MsgBox "処理を中止します。"
            '.activeworkbook.Close FileName:=strTemplate
            .activeworkbook.Close SaveChanges:=False
            xlapp.Quit
            Exit Sub
        Else
        .activeworkbook.SaveAs FileName:=strFileName
         
        End If
         
        MsgBox "出力しました。", vbOKOnly + vbInformation
    End With

投稿日時: 20/04/29 20:28:32
投稿者: aomi

MMYSさん
ファイルを閉じてから再度実行したら、キャンセル処理ができていました。
 
アドバイスありがとうございました!