【问题标题】:Excel VBA - Run a macro based on a range of dropdown listsExcel VBA - 基于一系列下拉列表运行宏
【发布时间】:2016-11-08 03:15:28
【问题描述】:

VBA 课程已经有好几年了,所以请像在“Excel VBA for Dummies”一书中写一样回答。

在 G 列中,范围 G2:G1001 中的每个单元格都是我工作簿中所有工作表的单独数据验证下拉列表。我有一个宏,当您从单元格“G2”的下拉列表中选择“Questar”时,它会复制单元格 A2:F2 并将它们粘贴到第一个空行中标题为“Questar”的工作表中。这一切都很好。

但是,我的问题是它仅适用于单元格 G2。我在第 2-1001 行有数据,我需要它来处理所有单元格 G2:G1001。这是我到目前为止所拥有的,适用于单元格“G2”:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("G2:G1001")) Is Nothing Then
        Select Case Range("G2")
            Case "Questar": Questar
        End Select
    End If
End Sub

我认为 Select Case Range("G2") 需要更改,但我已经尝试了所有方法。

这是我的 Questar 宏代码:

Sub Questar()

    Worksheets("AFCU Auto-Add").Range(ActiveCell.Offset(0, -6), ActiveCell.Offset(0, -1)).Copy
    Worksheets("Questar").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
    Application.CutCopyMode = False
    Application.ScreenUpdating = True

    Sheets("AFCU Auto-Add").Select
    Range(ActiveCell.Offset(0, -6), ActiveCell.Offset(0, -1)).Select
    Application.CutCopyMode = False
    Selection.ListObject.ListRows(1).Delete
    Range("G2").Select

End Sub

我最终会添加更多案例,但我希望在添加更多案例和宏之前让一个工作表正常工作。有什么建议么?

【问题讨论】:

  • 最简单的更改是将Select Case Range("G2") 替换为Select Case Target.Value - 这将导致它查看生成@的目标单元格(或者,不幸的是 - 因为它使事情复杂化,所有单元格) 987654325@ 活动。但如果您需要让Questar 宏知道要复制哪些单元格等,您可能需要将Target.Row 之类的内容作为参数传递给Questar,以便它可以对适当的数据进行操作。

标签: vba excel drop-down-menu


【解决方案1】:

编辑:更新为单个过程,假设存在所有在 G 列中命名的工作表...

类似:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range, c As Range, rngDel As Range

    On Error GoTo haveError

    Set rng = Intersect(Target, Range("G2:G1001"))

    If Not rng Is Nothing Then
        For Each c In rng.Cells
            If Len(c.Value) > 0 Then
                'copy to appropiate sheet
                With ThisWorkbook.Worksheets(c.Value).Cells(Rows.Count, 1).End(xlUp)
                    .Offset(1, 0).Resize(1, rng.Cells.Count).Value = _
                                     c.EntireRow.Range("A1:F1").Value
                End With

                'build up a range of rows to delete...
                If rngDel Is Nothing Then
                    Set rngDel = c
                Else
                    Set rngDel = Union(c, rngDel)
                End If

            End If
        Next c

        'any rows to delete?
        If Not rngDel Is Nothing Then
            Application.EnableEvents = False
            rngDel.EntireRow.Delete
            Application.EnableEvents = True
        End If

    End If

    Exit Sub

haveError:
    'make sure to re-enable events in the case of an error
    Application.EnableEvents = True

End Sub

【讨论】:

  • 抱歉还是很新的。你能举个例子说明如何向我的 Questar 子添加参数吗?
  • 再次抱歉。我知道您是如何传递参数的,但我不明白如何处理我的 Questar 宏的其余部分。此外,我并不总是想要 A1:F1,它只是我选择的任何 G 单元格左侧的列。我已经编辑了我的原始问题以包含我的整个 Questar 代码。无论如何,您可以将您的建议放入宏中并以更新的整个宏进行回复?这将不胜感激! :)
  • 你说得对,相关的 subs 只会替换 Questar。我还有列表中的其他工作表名称:RMPower、Water、Groceries 等。你能告诉我如何传递第二个字符串参数的示例吗?
  • 蒂姆,我有一个后续问题:stackoverflow.com/q/40538259/7129429。你介意看看吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
相关资源
最近更新 更多