在 vb.net 中与 excel 一起工作

Work with excel in vb.net

我需要做一些学校项目,这是一种工资计算器。

我需要将 excel 文件加载为 "database"(首先只是为了填充组合框)。

在 "do until" 周期的第二个子程序中,我遇到了一些异常错误 ("An exception of type 'System.NullReferenceException' occurred in MzdovySystem.exe but was not handled in user code")。

我是初学者,所以我不知道如何解决这个问题。我无法理解,在第一个子中没问题,但在第二个子中就不行了。另外,我在另一种形式中使用了几乎相同的代码,并且工作正常。有人可以帮我吗?

Public Class Form1

Dim xlPath
Dim xlFile
Dim xlApp As Excel.Application
Dim xlWorkBook As Excel.Workbook
Dim xlWorkSheet As Excel.Worksheet

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load

    xlPath = System.Windows.Forms.Application.StartupPath
    xlPath = xlPath.Replace("MzdovySystem\bin\Debug", "")
    xlFile = xlPath + "db.xlsx"

    xlApp = New Excel.Application
    xlWorkBook = xlApp.Workbooks.Open(xlFile)
    xlWorkSheet = xlWorkBook.Worksheets("zam")

    Try

        Dim radky As Integer = 1

        Do Until IsNothing(xlWorkSheet.Range("A" & radky).Value) = True
            radky = radky + 1
        Loop

        radky = radky - 1

        Dim i As Integer

        For i = 2 To radky
            combo1.Items.Add(xlWorkSheet.Range("A" & i).Value)
        Next

    Catch ex As Exception : MsgBox("Chyba při načítání databáze zaměstnanců")

    End Try

End Sub

Private Sub combo1_TabIndexChanged(sender As Object, e As EventArgs) Handles combo1.TabIndexChanged

   Dim radky As Integer = 1

    Do Until IsNothing(xlWorkSheet.Range("A" & radky).Value) = True
        radky = radky + 1
    Loop

Public Class Form2

Dim xlPath
Dim xlFile
Dim xlApp As Excel.Application
Dim xlWorkBook As Excel.Workbook
Dim xlWorksheet As Excel.Worksheet

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles Me.Load

    xlPath = System.Windows.Forms.Application.StartupPath
    xlPath = xlPath.Replace("MzdovySystem\bin\Debug", "")
    xlFile = xlPath + "db.xlsx"

    xlApp = New Excel.Application
    xlWorkBook = xlApp.Workbooks.Open(xlFile)
    xlWorksheet = xlWorkBook.Worksheets("nastaveni")

    With xlWorksheet

        PracovniDoba.Text = .Cells(1, 2).value
        ZamcSoc.Text = .Cells(2, 2).value
        ZamcZdr.Text = .Cells(3, 2).value
        ZamlSoc.Text = .Cells(4, 2).value
        ZamlZdr.Text = .Cells(5, 2).value
        HodnotaStr.Text = .Cells(6, 2).value

    End With

End Sub

Private Sub PracovniDoba_TextChanged(sender As Object, e As EventArgs) Handles PracovniDoba.TextChanged

    For Each znak In PracovniDoba.Text()
        If Asc(znak) > 47 And Asc(znak) > 58 Then
            PracovniDoba.Text = "8"
            MsgBox("Do tohoto pole je možné zadat pouze čílo")
        End If
    Next

End Sub

Private Sub ZamcSoc_TextChanged(sender As Object, e As EventArgs) Handles ZamcSoc.TextChanged

    For Each znak In ZamcSoc.Text
        If Asc(znak) > 47 And Asc(znak) > 58 Then
            ZamcSoc.Text = "0,045"
            MsgBox("Do tohoto pole je možné zadat pouze čílo")
        End If
    Next

End Sub

Private Sub ZamcZdr_TextChanged(sender As Object, e As EventArgs) Handles ZamcZdr.TextChanged

    For Each znak In ZamcZdr.Text()
        If Asc(znak) > 47 And Asc(znak) > 58 Then
            ZamcZdr.Text = "0,65"
            MsgBox("Do tohoto pole je možné zadat pouze čílo")
        End If
    Next

End Sub

Private Sub ZamlSoc_TextChanged(sender As Object, e As EventArgs) Handles ZamlSoc.TextChanged

    For Each znak In ZamlSoc.Text()
        If Asc(znak) > 47 And Asc(znak) > 58 Then
            ZamlSoc.Text = "0,25"
            MsgBox("Do tohoto pole je možné zadat pouze čílo")
        End If
    Next

End Sub

Private Sub ZamlZdr_TextChanged(sender As Object, e As EventArgs) Handles ZamlZdr.TextChanged

    For Each znak In ZamlZdr.Text()
        If Asc(znak) > 47 And Asc(znak) > 58 Then
            ZamlZdr.Text = "0,09"
            MsgBox("Do tohoto pole je možné zadat pouze čílo")
        End If
    Next

End Sub

Private Sub HodnotaStr_TextChanged(sender As Object, e As EventArgs) Handles HodnotaStr.TextChanged

    For Each znak In HodnotaStr.Text()
        If Asc(znak) > 47 And Asc(znak) > 58 Then
            HodnotaStr.Text = "60"
            MsgBox("Do tohoto pole je možné zadat pouze čílo")
        End If
    Next

End Sub

Private Sub ulozit_Click(sender As Object, e As EventArgs) Handles ulozit.Click

    With xlWorksheet

        .Cells(1, 2).value = PracovniDoba.Text
        .Cells(2, 2).value = ZamcSoc.Text
        .Cells(3, 2).value = ZamcZdr.Text
        .Cells(4, 2).value = ZamlSoc.Text
        .Cells(5, 2).value = ZamlZdr.Text
        .Cells(6, 2).value = HodnotaStr.Text

    End With

    xlWorkBook.Save()

    MsgBox("Nastavní bylo úspěšně změněno.")

End Sub

Private Sub zavrit_Click(sender As Object, e As EventArgs) Handles zavrit.Click

    Me.Close()
    xlWorkBook.Close()
    xlApp.Quit()

    ReleaseComObject(xlApp)
    ReleaseComObject(xlWorkBook)
    ReleaseComObject(xlWorksheet)

End Sub

结束Class

这是因为您正在使用 TabIndexChanged 事件,并且此事件似乎在 Form 的加载事件之前,在设置 xlWorkSheet 之前触发。

您可能应该使用组合的 SelectedIndexChange 事件,因为如果您不更改代码中的 Tab 键顺序,TabIndexChanged 事件只会为您的表单触发一次,或者您检查 xlWorkSheet 是否设置为某项。