在 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 其中最佳:

  1. 您可以使用标签条并隐藏除标签之外的所有内容。
  2. 您可以设置一个模块级变量来记住上次按下的按钮。您可能想要添加代码来更改按钮的颜色,以便用户知道他们按下了哪个按钮。如果你这样做了,你可能不需要模块级变量,你可以只读哪个按钮有颜色。
  3. 您可以通过代码使切换按钮互斥。我个人会选择这个,这样您就可以看到按下按钮的视觉效果。

这里有一些代码可以帮助您入门

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