在 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 是否设置为某项。
我需要做一些学校项目,这是一种工资计算器。
我需要将 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 是否设置为某项。