none
VB Winform~當Windows 10登出時無法關閉Excel檔 RRS feed

  • 問題

  • 請教各位大大:

    小弟在VS 2019裡,用VB製作了一個很簡單的表單,目的在開啟一個Excel檔案,隨便讀一筆儲存格的資料,顯示在表單內。然後按右上角(X)關閉Excel檔案並結束程式,一切都是正常運作,唯獨在Win10登出或關機時,就無法執行FormClosing內相同關檔的指令WB.Close(),請各位大大幫忙小弟看一下問題出在哪邊?謝謝!
    以下是程式碼和錯誤的訊息:
    =================================================
    Imports VBExcel = Microsoft.Office.Interop.Excel
    Public Class Form1
        Public Const FileName As String = "Name.xlsx"
        Public Const SName As String = "名字"
        Public App As new VBExcel.Application
        Public WB As VBExcel.Workbook = App.Workbooks.Open(Application.StartupPath & "\" & FileName)
        Public WS As VBExcel.Worksheet = WB.Worksheets(SName)

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

            TB_Name.Text = WS.Range("A1").Value

        End Sub

        Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing

            WB.Close(FileName)
            End

        End Sub

    End Class
    =================================================

    1. System.Runtime.InteropServices.COMException
        HResult=0x800706BA
        Message=RPC 伺服器無法使用。 (發生例外狀況於 HRESULT: 0x800706BA)
        Source=Test_01
        StackTrace: 
         於 Microsoft.Office.Interop.Excel._Workbook.Close(Object SaveChanges, Object Filename, Object RouteWorkbook)
         於 Test_01.Form1.Form1_FormClosing(Object sender, FormClosingEventArgs e) 在 Z:\電腦課程\VB\Visual Basic\Test_01\Form1.vb:行 17 中
         於 System.Windows.Forms.Form.OnFormClosing(FormClosingEventArgs e)
         於 System.Windows.Forms.Form.WmClose(Message& m)
         於 System.Windows.Forms.Form.WndProc(Message& m)
         於 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
         於 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
         於 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

    2020年12月31日 上午 07:36

所有回覆

  • 把這兩行程式碼:

    WB.Close(FileName)
    End

    換成:

    App.Quit()
    試看看

    2020年12月31日 下午 11:36
  • 謝謝您的回覆!還是發生相同的問題,強迫重開機後,Name.xlsx檔案仍然是開啟的狀態。另外,我用偵錯模式,當執行到App.Quit()時,VS 會秀一段錯誤訊息:啟動遠端語言伺服器 C#/Visual Basic 語言伺服器用戶端時發生錯誤,不知是哪裡出了問題?
    2021年1月1日 上午 05:54
  • 如果需要儲存工作表, 可以這樣做:

    For Each w In Application.Workbooks 
     w.Save 
    Next w 
    Application.Quit
    

    2021年1月1日 上午 10:58
  • 1. 在正常關閉程式的時候,執行App.Quit()是可以正常關閉Excel檔案的

    2. 如果程式尚未關閉前,把Windows 10關機或登出的話,程式會被強迫關閉,而執行到App.Quit()就會出現錯誤訊息,而無法把Excel檔關閉

    PS. 只有讀取Excel資料檔,沒有做變動,只需關檔即可!


    • 已標示為解答 ZiFanCh 2021年1月1日 下午 12:20
    • 已取消標示為解答 ZiFanCh 2021年1月1日 下午 12:20
    • 已編輯 ZiFanCh 2021年1月1日 下午 12:24
    2021年1月1日 下午 12:19
  • 你只是要顯示,規劃上在 Button1_Click 時,再開啟 Excel ,並關閉,App.Quit 也可以一起處理。

    Excel 是獨占式存取,沒必要程式一執行就開啟。

    使用時才開啟,用畢關閉,是良好的程式設計觀念。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2021年1月2日 上午 06:31
  • 您可以偵測Windows關機的動作, 再執行App.Quit的動作, 看是否能改善, 請參考:

    .NET Canceling closing of a form prevents it from closed on Windows shutdown

    2021年1月2日 下午 11:34
  • 謝謝您的回覆,我再來試試看看,感恩!
    2021年1月3日 上午 09:15