在 VBA 中使用多个按钮添加数据
Adding data with multiple buttons in VBA
我正在尝试使用按钮作为工作表数据库的唯一输入。
只有按钮 1、2 和 3 会通过以下代码将数据添加到我的工作表
'Name for Button 1 = B_1
Private Sub B_1_Click()
Dim iRow As Long
Dim ws As Worksheet
Set ws = Worksheets("Database")
'find first empty row in database
iRow = ws.Range("A:D").Find(What:="*", SearchOrder:=xlRows, _
SearchDirection:=xlPrevious, LookIn:=xlValues).Row + 1
'copy the data to the database
ws.Cells(iRow, 1).Value = Date
ws.Cells(iRow, 2).Value = Time
'This has to be bacon, tomato or cheese
ws.Cells(iRow, 3).Value = ???????
ws.Cells(iRow, 4).Value = 1
MsgBox "Data added", vbOKOnly + vbInformation, "Data Added"
Application.DisplayAlerts = False
ActiveWorkbook.Save
End Sub
IRow,3 是我遇到问题的地方。我想先存储培根、西红柿或奶酪的信息,然后在我按 2 时存储。工作表中的数据应如下所示。
日期 12/01/2015
时间14:20
食物培根
数量 2
我以前使用文本框作为输入。
任何人都可以帮助我使用此代码。
谢谢
如果您一次只想处理一种食物,您应该使用选项按钮而不是命令按钮。选项按钮是互斥的 - 如果你 select Cheese,Bacon 会自动 deselected。
如果你想一次处理多种食物,你应该使用切换按钮。切换按钮要么向上要么向下,但它们并不相互排斥。它们具有看起来像命令按钮的额外好处。
如果你想要选项按钮的互斥性,但你必须有一些看起来和工作起来像命令按钮的东西,那么你有几个选项,none 其中最佳:
- 您可以使用标签条并隐藏除标签之外的所有内容。
- 您可以设置一个模块级变量来记住上次按下的按钮。您可能想要添加代码来更改按钮的颜色,以便用户知道他们按下了哪个按钮。如果你这样做了,你可能不需要模块级变量,你可以只读哪个按钮有颜色。
- 您可以通过代码使切换按钮互斥。我个人会选择这个,这样您就可以看到按下按钮的视觉效果。
这里有一些代码可以帮助您入门
Private mbEventsDisabled As Boolean
Public Property Let EventsDisabled(ByVal bEventsDisabled As Boolean): mbEventsDisabled = bEventsDisabled: End Property
Public Property Get EventsDisabled() As Boolean: EventsDisabled = mbEventsDisabled: End Property
Private Sub tgBacon_Click()
If Not Me.EventsDisabled Then ClearToggles Me.tgBacon
End Sub
Private Sub tgCheese_Click()
If Not Me.EventsDisabled Then ClearToggles Me.tgCheese
End Sub
Private Sub tgTomato_Click()
If Not Me.EventsDisabled Then ClearToggles Me.tgTomato
End Sub
Public Sub ClearToggles(tg As ToggleButton)
Me.EventsDisabled = True
Me.tgBacon.Value = Me.tgBacon.Name = tg.Name
Me.tgCheese.Value = Me.tgCheese.Name = tg.Name
Me.tgTomato.Value = Me.tgTomato.Name = tg.Name
Me.EventsDisabled = False
End Sub
如果你有三个以上的切换,你会想要重构 ClearToggles sub 以循环而不是单独调用它们。
Public Sub ClearToggles(tg As ToggleButton)
Dim ctl As Control
Me.EventsDisabled = True
For Each ctl In Me.Controls
If TypeName(ctl) = "ToggleButton" And ctl.Name <> tg.Name Then
ctl.Value = False
End If
Next ctl
Me.EventsDisabled = False
End Sub
我正在尝试使用按钮作为工作表数据库的唯一输入。
只有按钮 1、2 和 3 会通过以下代码将数据添加到我的工作表
'Name for Button 1 = B_1
Private Sub B_1_Click()
Dim iRow As Long
Dim ws As Worksheet
Set ws = Worksheets("Database")
'find first empty row in database
iRow = ws.Range("A:D").Find(What:="*", SearchOrder:=xlRows, _
SearchDirection:=xlPrevious, LookIn:=xlValues).Row + 1
'copy the data to the database
ws.Cells(iRow, 1).Value = Date
ws.Cells(iRow, 2).Value = Time
'This has to be bacon, tomato or cheese
ws.Cells(iRow, 3).Value = ???????
ws.Cells(iRow, 4).Value = 1
MsgBox "Data added", vbOKOnly + vbInformation, "Data Added"
Application.DisplayAlerts = False
ActiveWorkbook.Save
End Sub
IRow,3 是我遇到问题的地方。我想先存储培根、西红柿或奶酪的信息,然后在我按 2 时存储。工作表中的数据应如下所示。
日期 12/01/2015
时间14:20
食物培根
数量 2
我以前使用文本框作为输入。
任何人都可以帮助我使用此代码。
谢谢
如果您一次只想处理一种食物,您应该使用选项按钮而不是命令按钮。选项按钮是互斥的 - 如果你 select Cheese,Bacon 会自动 deselected。
如果你想一次处理多种食物,你应该使用切换按钮。切换按钮要么向上要么向下,但它们并不相互排斥。它们具有看起来像命令按钮的额外好处。
如果你想要选项按钮的互斥性,但你必须有一些看起来和工作起来像命令按钮的东西,那么你有几个选项,none 其中最佳:
- 您可以使用标签条并隐藏除标签之外的所有内容。
- 您可以设置一个模块级变量来记住上次按下的按钮。您可能想要添加代码来更改按钮的颜色,以便用户知道他们按下了哪个按钮。如果你这样做了,你可能不需要模块级变量,你可以只读哪个按钮有颜色。
- 您可以通过代码使切换按钮互斥。我个人会选择这个,这样您就可以看到按下按钮的视觉效果。
这里有一些代码可以帮助您入门
Private mbEventsDisabled As Boolean
Public Property Let EventsDisabled(ByVal bEventsDisabled As Boolean): mbEventsDisabled = bEventsDisabled: End Property
Public Property Get EventsDisabled() As Boolean: EventsDisabled = mbEventsDisabled: End Property
Private Sub tgBacon_Click()
If Not Me.EventsDisabled Then ClearToggles Me.tgBacon
End Sub
Private Sub tgCheese_Click()
If Not Me.EventsDisabled Then ClearToggles Me.tgCheese
End Sub
Private Sub tgTomato_Click()
If Not Me.EventsDisabled Then ClearToggles Me.tgTomato
End Sub
Public Sub ClearToggles(tg As ToggleButton)
Me.EventsDisabled = True
Me.tgBacon.Value = Me.tgBacon.Name = tg.Name
Me.tgCheese.Value = Me.tgCheese.Name = tg.Name
Me.tgTomato.Value = Me.tgTomato.Name = tg.Name
Me.EventsDisabled = False
End Sub
如果你有三个以上的切换,你会想要重构 ClearToggles sub 以循环而不是单独调用它们。
Public Sub ClearToggles(tg As ToggleButton)
Dim ctl As Control
Me.EventsDisabled = True
For Each ctl In Me.Controls
If TypeName(ctl) = "ToggleButton" And ctl.Name <> tg.Name Then
ctl.Value = False
End If
Next ctl
Me.EventsDisabled = False
End Sub