我是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
答案 0 :(得分:0)
以下内容基于您上传到Google云端硬盘的文件(截至2017-06-08,09:01英国时间)。
我在尝试打开工作簿时丢失了一些控件,也许我们的Excel版本与我的版本太不同,无法应对它们。这些是您的日期控件dtp2
和dtp3
。每当他们给我带来麻烦时,我就会注释掉与这些相关的代码。希望这不会对后面的内容产生负面影响......
主要建议
要完成任务,我必须声明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)并将它们添加为表格中的“列标题”。
我猜测表单的标题应该是“数据输入应用程序”而不是“数据输入应用程序”。