【问题标题】:Data doesn't save to an Excel file unless a MsgBox appears first除非首先出现 MsgBox,否则数据不会保存到 Excel 文件
【发布时间】:2016-11-21 14:16:54
【问题描述】:

谁能解释为什么我的代码不允许我将数据保存到 Excel,除非我包含 MsgBox

这是我的代码:

Sub createreport()
        Try
            Dim XA As New Excel.Application
            Dim wb As Excel.Workbook
            Dim ws As Excel.Worksheet
            wb = XA.Workbooks.Open(dataDirectory + "employee_info\dtr_emp.xlsx", False, False, True)
            ws = wb.Worksheets("Sheet1")

            MsgBox("Test") '<---- THIS IS THE MSGBOX I WAS TALKING ABOUT

            For i As Integer = 0 To Me.EmployeeInfoDataGridView.Rows.Count - 1
                Dim DGV As DataGridViewRow = Me.EmployeeInfoDataGridView.Rows(i)
                ws.Cells(7 + i, 1) = DGV.Cells(0).Value
                ws.Cells(7 + i, 2) = DGV.Cells(1).Value
                ws.Cells(7 + i, 3) = DGV.Cells(2).Value
                ws.Cells(7 + i, 4) = DGV.Cells(3).Value
                ws.Cells(7 + i, 5) = DGV.Cells(4).Value
                ws.Cells(7 + i, 6) = DGV.Cells(5).Value
                ws.Cells(7 + i, 7) = DGV.Cells(6).Value
                ws.Cells(7 + i, 8) = DGV.Cells(7).Value
                ws.Cells(7 + i, 9) = DGV.Cells(8).Value
                ws.Cells(7 + i, 10) = DGV.Cells(9).Value
                ws.Cells(7 + i, 11) = DGV.Cells(10).Value
                ws.Cells(7 + i, 12) = DGV.Cells(12).Value
                ws.Cells(7 + i, 13) = DGV.Cells(14).Value
            Next
            XA.Visible = False

            wb.SaveAs(dataDirectory + "employee_info\temp_" + Form1.lbl_date.Text + ".xlsx")
            wb.Close(True)
            XA.Quit()
            wb = Nothing : ws = Nothing : XA = Nothing
            Try
                My.Computer.FileSystem.CopyFile("employee_info\temp_" + Form1.lbl_date.Text + ".xlsx", "employee_info\employee_infos.xlsx", True)
                My.Computer.FileSystem.DeleteFile("employee_info\temp_" + Form1.lbl_date.Text + ".xlsx", FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.DeletePermanently, FileIO.UICancelOption.DoNothing)
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        exit_excel_process.Show()
    End Sub

除非我将 MsgBox 代码放入其中,否则不会将任何数据保存到 Excel 文件中。

【问题讨论】:

  • 代码运行速度似乎比您的计算机打开文件的速度要快。看看这个:stackoverflow.com/questions/33817414/…
  • 感谢您的回复,我尝试编写 Threading.Thread.Sleep(10000) 这是 10 秒,但似乎问题仍然存在
  • 我尝试了您提供的代码,但仍然无法正常工作。仍然是 MsgBox 的答案,但是在窗口调用中看到一个 msgbox 很烦人
  • 当您说您使用MsgBox 时,您是等待一段时间再单击“确定”还是立即单击?同样出于好奇,如果您加载空白工作簿会发生什么(这只是为了测试速度,因为空白工作簿会比满行的工作簿加载更快)。
  • 试过了,还是不行。我希望我能尽快解决这个问题。顺便说一句,感谢您的回复。

标签: excel vb.net msgbox


【解决方案1】:

由于 Try 不起作用,因此焦点被踢到了 Catch 上。这样做似乎过于复杂。请参阅下面的代码示例。你能解决这个问题吗?

Imports System.Data
Imports System.Data.SqlClient
Imports Excel = Microsoft.Office.Interop.Excel
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click

        Dim cnn As SqlConnection
        Dim connectionString As String
        Dim sql As String

        connectionString = "data source=servername;" & _
        "initial catalog=databasename;user id=username;password=password;"
        cnn = New SqlConnection(connectionString)
        cnn.Open()
        sql = "SELECT * FROM Product"
        Dim dscmd As New SqlDataAdapter(sql, cnn)
        Dim ds As New DataSet
        dscmd.Fill(ds)
        DataGridView1.DataSource = ds.Tables(0)
        cnn.Close()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button2.Click


        Dim xlApp As Excel.Application
        Dim xlWorkBook As Excel.Workbook
        Dim xlWorkSheet As Excel.Worksheet
        Dim misValue As Object = System.Reflection.Missing.Value
        Dim i As Integer
        Dim j As Integer

        xlApp = New Excel.ApplicationClass
        xlWorkBook = xlApp.Workbooks.Add(misValue)
        xlWorkSheet = xlWorkBook.Sheets("sheet1")

        For i = 0 To DataGridView1.RowCount - 2
            For j = 0 To DataGridView1.ColumnCount - 1
                xlWorkSheet.Cells(i + 1, j + 1) = _
                    DataGridView1(j, i).Value.ToString()
            Next
        Next

        xlWorkSheet.SaveAs("C:\vbexcel.xlsx")
        xlWorkBook.Close()
        xlApp.Quit()

        releaseObject(xlApp)
        releaseObject(xlWorkBook)
        releaseObject(xlWorkSheet)

        MsgBox("You can find the file C:\vbexcel.xlsx")
    End Sub

    Private Sub releaseObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub
End Class

【讨论】:

    猜你喜欢
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2014-08-17
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    相关资源
    最近更新 更多