Excel VBA Userform,更新和删除数据库

时间:2017-06-06 22:46:24

标签: excel excel-vba userform vba

我是Excel VBA的新手,我通过Stackoverflow.com找到了解决我的大多数问题的方法但是,仍有一个问题我无法解决。 我正在研究一个多维Userform来维护我们的数据库。 Userform我正在处理包含选项框,复选框,文本框和组合框。 经过长时间的搜索和工作,我修复了搜索底部,他们都在工作。但我无法获得更新底部和删除底部工作。 我上传了这个文件,如果有人能帮我解决这个问题,我将不胜感激。

Private Sub bt2_Click() 'Update shipment
Dim sonsat As Long, sor As String
If ListBox1.ListIndex = -1 Then
MsgBox "Choose an item", vbExclamation, ""
Exit Sub
End If

sor = MsgBox("Are your sure?", vbYesNo, "")
If sor = vbNo Then Exit Sub

lastrow = Sheets("logbook").Cells(Rows.count, 1).End(xlUp).Row
Sheets("logbook").Range("A1:A" & lastrow).Find(What:=ListBox1.Value, 
LookIn:=xlValues, LookAt:=xlWhole).Activate
sonsat = ActiveCell.Row
Cells(sonsat, 1) = op1
Cells(sonsat, 2) = op2
Cells(sonsat, 3) = chb1
Cells(sonsat, 4) = chb2
Cells(sonsat, 5) = tb14
Cells(sonsat, 6) = tb1
Cells(sonsat, 7) = tb2
Cells(sonsat, 8) = tb3
Cells(sonsat, 9) = tb4
Cells(sonsat, 10) = tb5
Cells(sonsat, 11) = cb1
Cells(sonsat, 12) = tb6
Cells(sonsat, 13) = tb7
Cells(sonsat, 14) = tb8
Cells(sonsat, 15) = tb9
Cells(sonsat, 16) = cb2
Cells(sonsat, 17) = tb10
Cells(sonsat, 18) = tb11
Cells(sonsat, 19) = tb12
Cells(sonsat, 20) = cb3
Cells(sonsat, 21) = cb4
Cells(sonsat, 22) = tb13


MsgBox "Item Has Been Changed", vbInformation, ""
ListBox1.list = Sheets("logbook").Range("A1:V" & 
Sheets("logbook").Cells(Rows.count, 1).End(xlUp).Row).Value

If Me.op1.Value = True Then
Cells(sonsat, 1).Value = "X"
Else
Cells(sonsat, 1).Value = "-"
End If

If Me.op2.Value = True Then
Cells(sonsat, 2).Value = "X"
Else
Cells(sonsat, 2).Value = "-"
End If

If Me.chb1.Value = True Then
Cells(sonsat, 3).Value = "X"
Else
Cells(sonsat, 3).Value = "-"
End If

If Me.chb2.Value = True Then
Cells(sonsat, 4) = "X"
Else
Cells(sonsat, 4) = "-"
End If
End Sub



Private Sub bt3_Click() 'delete shipmet
Dim sil As Long
Dim e, b, c, d As Integer


If ListBox1.ListIndex = -1 Then
MsgBox "Choose an entry", vbExclamation, ""
Exit Sub
End If

If ListBox1.ListIndex >= 0 Then
cevap = MsgBox("Entry will be deleted. ... Are you sure ?", vbYesNo, "")
If cevap = vbYes Then
Sheets("logbook").Range("A:A").Find(What:=ListBox1.Value).Activate
sil = ActiveCell.Row
Sheets("logbook").Rows(sil).Delete
End If
End If

For d = 1 To 2
Controls("op" & d) = False
Next

For c = 1 To 4
Controls("cb" & c) = "-"
Next

For b = 1 To 2
Controls("chb" & b) = False
Next

For e = 1 To 14
Controls("tb" & e) = ""
Next

ListBox1.list = Sheets("logbook").Range("A1:V" & 
Sheets("logbook").Cells(Rows.count, 1).End(xlUp).Row).Value
End Sub

1 个答案:

答案 0 :(得分:0)

以下内容基于您上传到Google云端硬盘的文件(截至2017-06-08,09:01英国时间)。

我在尝试打开工作簿时丢失了一些控件,也许我们的Excel版本与我的版本太不同,无法应对它们。这些是您的日期控件dtp2dtp3。每当他们给我带来麻烦时,我就会注释掉与这些相关的代码。希望这不会对后面的内容产生负面影响......

主要建议

  • 要完成任务,我必须声明lastrow变量和cevap变量。

  • 您的listbox1允许多选。如果只想更新一行,则需要确保只选择一行。在控件属性的“行为”部分中,我将MultiSelect更改为0 - fmMultiSelectSingle

  • 因为您允许多选,listbox1.value无效。当您允许多选时,您必须以不同方式执行此操作(请参阅here)。但假设您选择单选,则无需担心。

  • 当您使用Find ... Activate时,您会收到不同的错误。 Excel无法Activate电子表格,因为Userform1保留了焦点。您可以通过使表单“非模态”来改变它,但我不会。相反,而不是,例如:

    Sheets("logbook").Range("A1:A" & lastrow).Find(What:=ListBox1.Value, _
       LookIn:=xlValues, LookAt:=xlWhole).Activate
    sonsat = ActiveCell.Row
    

    我会做

    sonsat = Sheets("logbook").Range("A1:A" & 
       lastrow).Find(What:=ListBox1.Value, _
    LookIn:=xlValues, LookAt:=xlWhole).Row
    

    这避免了Activate的需要。之后,代码应该无怨无悔地运行。

  • 然而,它仍然没有做你想要的。列表框的值基于绑定列,您已将其设置为第一列。该值不能唯一标识该行。因此,当您运行更新/删除时,代码会更新/删除第一个匹配的行。

次要事项

  • 目前没有任何东西阻止用户选择和更新/删除标题行。就个人而言,我会将它们从列表框中取出(从A2开始而不是A1)并将它们添加为表格中的“列标题”。

  • 我猜测表单的标题应该是“数据输入应用程序”而不是“数据输入应用程序”。