如何使用 VBA 根据值和组合框选择填充 excel 中的行?

Posted

技术标签:

【中文标题】如何使用 VBA 根据值和组合框选择填充 excel 中的行?【英文标题】:How to populate rows in excel based on value and combobox selection using VBA? 【发布时间】:2022-01-14 00:29:27 【问题描述】:

我是 VBA 的初学者,我有一个计划(下面的屏幕截图),我正在尝试使用用户表单进行更改。

我有一个带有 3 个组合框的用户窗体,1 个用于要执行的程序类型,1 个用于开始时间,另一个用于结束时间(这些时间基于屏幕截图中的第一行)。

我想从本质上改变使用用户表单的特定过程的电子表格。例如,假设我想将程序 7 更改为从 2:00 持续到 19:00。在这种情况下,我希望看到所有包含 7 的行在这些列下用 7 填充(见结果截图)

我所拥有的只是查找哪些行包含某个值然后该值被偏移的代码......但老实说我不知道​​从这里去哪里......任何帮助都非常感谢!!!

Dim c As Range
Dim firstAddress As String

Count = 7

With Sheet49.Range("AA7:AA636")
    Set c = .Find(7, LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do While Not c Is Nothing
            Count = Count + 1
            c.Offset(, -8).Value = c.Value
            Set c = .FindNext(c)
            If Count = 636 Then
            Exit Do
            End If
        Loop
    End If
End With

【问题讨论】:

【参考方案1】:

我想将程序 7 更改为从 2:00 持续到 19:00。在这种情况下,我希望看到所有包含 7 的行在这些列下用 7 填充

逻辑:

    查找开始和结束时间列 找到相关程序,然后一口气填满整个范围!

代码:

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim ColA As Long, ColB As Long
    Dim aCell As Range, bCell As Range
    Dim i As Long
    
    '~~> I am hardcoding these values. Pick them up from combobox
    Dim ProcToFind As Long: ProcToFind = 7
    Dim StartTime As String: StartTime = "2:00"
    Dim EndTime As String: EndTime = "19:00"
    
    '~~> Change this to the relevant sheet
    Set ws = Sheet1
    
    With ws
        '~~> Find the start and end time columns
        '~~> Hardcoded 21. Replace with last column
        For i = 1 To 21
            Select Case TimeValue(Format(.Cells(1, i).Value, "hh:mm:ss"))
                Case TimeValue(StartTime): ColA = i
                Case TimeValue(EndTime): ColB = i
            End Select
        Next i
        
        If ColA = 0 Or ColB = 0 Then
            MsgBox "Unable to find start or end time column(s)"
            Exit Sub
        End If
        
        Set aCell = .Cells.Find(What:=ProcToFind, LookIn:=xlValues, _
                    LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                    MatchCase:=False, SearchFormat:=False)

        If Not aCell Is Nothing Then
            Set bCell = aCell
            
            '~~> Fill the entire range in 1 go
            .Range(.Cells(aCell.Row, ColA), .Cells(aCell.Row, ColB)).Value = ProcToFind
            
            Do
                Set aCell = .Cells.FindNext(After:=aCell)

                If Not aCell Is Nothing Then
                    If aCell.Address = bCell.Address Then Exit Do
                    
                    '~~> Fill the entire range in 1 go
                    .Range(.Cells(aCell.Row, ColA), .Cells(aCell.Row, ColB)).Value = ProcToFind
                Else
                    Exit Do
                End If
            Loop
        End If
    End With
End Sub

在行动:

【讨论】:

哇,谢谢!!!太棒了。我实际上有一个后续问题 - 在我的组合框 1 中,我实际上将它们与它们的字符串值一起列出,例如第一个选项是“手术”等等。但该字符串值与我的日程表电子表格中的数字 1 相关联。有没有办法将组合框列表值与电子表格上的数值链接起来? 是的。有。我建议为此查询发布一个新问题。 好的,谢谢!刚刚做了 我碰巧查看了您的个人资料。我很少这么说,但似乎你不知道How does accepting an answer work?。请注意,接受答案不是强制性的。以上链接仅供参考,以防您不知道:)

以上是关于如何使用 VBA 根据值和组合框选择填充 excel 中的行?的主要内容,如果未能解决你的问题,请参考以下文章

根据组合框选择填充文本框

如何根据从另一个组合框进行的选择来填充组合框

从组合框和命令按钮 VBA 添加到工作表

Excel VBA文本框以填充组合框

使用大量项目填充组合框

使用带有 postgresql 表的 vba 填充组合框访问 2007