excel - 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
解决方案
我创建了一个虚拟测试 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 的一些信息,然后下次在需要学习之前,您应该走得更远一些。祝你好运!
推荐阅读
- c# - 肥皂服务抛出“响应提前结束,至少
需要额外的字节。”(IOException) - xamarin - 如何在 Xamarin 中创建无限 ListView?
- python - 使用多个字符串动态填充字典
- javascript - React - 从 json 动态渲染组件
- python - Python代码为跨账户的变量创建潜在客户值,账户的最后一个值为空
- javascript - 我的 chrome 扩展内容脚本与从 popup.js 发送的相同函数相乘
- java - 使用 xtext 和 maven 解决构建问题
- kubernetes - 无法将 .netcore 应用程序作为 kubernetes cronjob 运行
- oracle - Docker 上的 Oracle :: ORA-12162: TNS:net 服务名称指定错误
- javascript - 我想在 sendinf API 请求中的对象下使用基于条件的对象