首页 > 解决方案 > excel中的多个非连续行基于单元格值

问题描述

我的目标是能够有一个下拉列表,根据我创建的列表中的个人姓名隐藏 excel 中某些不连续的行。我有这段代码,是我在 Youtube 上找到的,我想知道它有什么问题,因为它不起作用。我对 VBA 比较陌生

Private Sub Worksheet_Calculate()
Dim Andrew, Robert, Michael As Range
Set Andrew = Range("K30")
Set Robert = Range("K30")
Set Michael= Range ("K30")

Select Case Andrew
        Case Is = "Andrew": Rows("8:10").EntireRow.Hidden = True
                            Rows("11:12").EntireRow.Hidden = False
                            Rows("13:13").EntireRow.Hidden = True
                            Rows("14:25").EntireRow.Hidden = False

End Select

Select Case Robert
        Case Is = "Robert"
                            Rows("6:20").EntireRow.Hidden = True
                            Rows("21:25").EntireRow.Hidden = False


End Select

Select Case  Michael
        Case Is = "Michael"
                            Rows("1:5").EntireRow.Hidden = True
                            Rows("6:25").EntireRow.Hidden = False
End Select
End Sub

标签: excelvba

解决方案


我创建了一个虚拟测试 Excel 工作表并将您的 VBA 代码插入到一个新模块中。它对我来说很好,虽然有点笨拙。

一些帮助建议:

  • 始终在模块顶部设置 Option Explicit,因为这意味着任何未声明的变量和其他类似的小东西都会立即被拾取。在开始使用 VBA 时尽早养成这种习惯是一种很好的做法。
  • 始终使用您的代码需要处理的特定工作簿/工作表的前缀来限定您的 .Range 语句。这可能是为什么它对你不起作用,但对我来说运行良好。就目前而言,您的代码只会在当时恰好处于活动状态的任何工作表上运行。
  • 您已将其设为 Private Sub(私有子例程)。如果您已经完成了众所周知的复制和粘贴,那么此子例程将不会出现在您的宏列表中,这可能是您无法运行它的另一个原因。我强烈建议您阅读这篇ExcelOffTheGrid 文章,它很好地分解了不同的类型。如果您已将其插入到 VBA 项目的 Worksheet 对象中,则可能需要将其移至其自己的模块中。
  • 您已将三个不同的名称(Andrew、Robert、Michael)分配给同一个 .Range 引用。这真的不应该被允许(尽管奇怪的是,当我复制你的代码时没有标记错误)因为它的意思是那些文本字符串 - 它们可以是任何东西,而不仅仅是那些名称 - 都指的是相同的特定工作表上的单元格。这并没有影响您的代码,因为您以后实际上并没有引用它们。在您的 Select Case 逻辑测试中,您在每个名称周围使用了双引号“”,告诉 VBA 这是一个字符串,而不是您定义的变量。

我会建议这样的事情:

复制并粘贴到新模块中

Option Explicit
'
'
Sub HideRows()
' This macro will hide specific non-contiguous rows based upon criteria in my drop down combo box.
'
 Dim wkMyBook As Workbook
 Dim wsMainSheet As Worksheet
 Dim rName As Range
'
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual

    End With

    Set wkMyBook = ActiveWorkbook
    Set wsMainSheet = wkMyBook.Sheets("ENTER SHEET NAME HERE")
    Set rName = wsMainSheet.Range("K30")

    Select Case rName
        Case Is = "Andrew"
            wsMainSheet.Rows("8:10").EntireRow.Hidden = True
            wsMainSheet.Rows("11:12").EntireRow.Hidden = False
            wsMainSheet.Rows("13:13").EntireRow.Hidden = True
            wsMainSheet.Rows("14:25").EntireRow.Hidden = False

        Case Is = "Robert"
            wsMainSheet.Rows("6:20").EntireRow.Hidden = True
            wsMainSheet.Rows("21:25").EntireRow.Hidden = False

        Case Is = "Michael"
            wsMainSheet.Rows("1:5").EntireRow.Hidden = True
            wsMainSheet.Rows("6:25").EntireRow.Hidden = False

    End Select

    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual

    End With

End Sub

复制并粘贴到工作簿对象中

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
' This code will run whenever a change is made to your worksheet
    If Target.Address = "$K$30" Then
        Select Case Target.Value
            Case Is = "Andrew", "Robert", "Michael"
                Call HideRows

        End Select

    End If

End Sub

这已经买了你的票,给你电梯,把你送到门口。现在你必须做最后一步来把它放在一起让它工作。阅读我链接的文章,了解有关如何构建 VBA 的一些信息,然后下次在需要学习之前,您应该走得更远一些。祝你好运!


推荐阅读