我有一个宏,可让用户在 Summary
工作表上双击指定的小区范围,然后访问隐藏{{ 1}}工作表包含相关数据。当用户返回 Data
工作表时,会重新隐藏 Summary
工作表。
宏适用于范围 Data
,但不适用于单元格范围D10:G15
。
C21:G26
工作表:Summary
我试图了解我做错了什么。任何帮助都将受到极大的赞赏。
答案 0 :(得分:0)
你永远不会必须为你可能获得的每一位数据编写不同的代码行。这与编码的目的相反。
我怀疑A& A列中有相关数据。 B,你可能还没有包括......也许,在A
列中,这个人的名称也许?如果没有,请执行此操作(必要时插入一列)。选择一个命名约定并坚持下去。 (即,连字符,下划线或空格,而不是组合)你会给自己(以及其他人)带来很多麻烦。
避免使用超长工作表名称。它们无论如何都会被隐藏,因此您可以使它们更简单,更标准。也许:APP, CAN, UNR, WOP, NSI, NCI, REF, BGC
。
为什么需要隐藏所有这些表?它并没有阻止人们访问它们。也许是因为他们中的许多人太过于混乱了?您可以使用隐藏所有标签,而不是隐藏/显示它们。
ActiveWindow.DisplayWorkbookTabs = False
完成这些更改后,您可以使用类似于以下内容的几行替换几乎所有代码:
personName = cells(Target.Row,1)
Sheets(personname & "NSI")
我打赌每周都会花费小时来维护这个工作簿。如果这些数据非常重要,那么真正应该做的就是完全改造=。
理想情况下,您可以将其移至Microsoft Access,因为它是用于管理数据库(而不是在Excel中创建自己的数据库)。即使您从未使用过Access,您仍然会发现它比您在此处所做的更简单。
除此之外,至少:将所有这些数据放在一个标签上。 Excel有许多易于使用的功能,用于过滤和分析在您分割数据时无用的数据。将它们放在一起,使Excel能够随时随地显示您想要的内容。 您正在尝试从头开始创建功能, Microsoft很久以前就已经为您完善了。 自动筛选,分组,数据透视表可以为您节省这么多时间,让其他人更轻松地使用此工作簿使用
在尝试进入VBA之前,最好先了解Excel内置的工作表功能。有很多很棒的(免费/简单)资源和论坛可以帮助你,我保证你很高兴你做到了。
您可能超越自己的一个迹象,也恰好是解决方案您的实际问题 ..
" ...适用于范围
D10:G15
,但不适用于细胞范围C21:G26
......"
因此,您知道G15
和C21
之间的某些变化。仔细检查这部分代码是有意义的。
首先,没有G15
- 但除此之外,如果我们仔细观察:
......看甚至更接近:
从那里开始,直到你的代码结束,你在一半的函数上以某种方式切换到了错误的引号类型。
有助于防止此类问题的最后几项提示:
作为每个模块的第一行:Option Explicit
。这将迫使您正确声明和处理变量,属性等。
在进行更改之前,请备份。如果您在一天内进行了10次重大更改,则应保留所有10个版本,至少持续几周。你会感到很惊讶他们有多方便,特别是在学习的时候。
每次更改后都要测试代码。这可能看起来很耗时,但这是从长远来看如何节省时间的一个例子。
我希望听起来不像是在侮辱你或你的工作,而且肯定 重要的是在这个领域100%彻底,准确和有条理,并在进入下一个领域之前完全理解一项技能,特别是在早期阶段。一定要查看其他一些很棒的Excel论坛。祝好运!
这是基本组织所带来的差异的一个例子。下面的代码与问题中的所有代码具有相同的功能(除了这一个没有错误,错误处理,并自动适应新名称/报告)。
必需的假设/组织:
Column A
包含经理名称(工作表名称后缀):FirstName LastInitial
ex。 Jim E
位于A13
和 A24
Rows 9 & 20
隐藏并包含"报告代码" (工作表名称前缀):ex。 D9 = TotApp
& G20 = RefChk
相应地重命名工作表(例如:TotApp Jim E
,RefChk Jim E
)
因此我们有简单的逻辑:
代码:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim destSht As String
'make sure double-clicked cell is within range
If Application.Intersect(Range("C10:G26"), Target) Is Nothing Then
Cancel = True 'cancel the double-click
Exit Sub
End If
'find the worksheet name suffix
Select Case Target.Row
Case 10 - 15
destsht = Cells(9, Target.Column)
Case 21 - 26
destsht = Cells(20, Target.Column)
Case Else
Cancel = True 'cancel the double-click
Exit Sub
End Select
'find the worksheet name prefix
destsht = Cells(Target.Row, 1) & destsht
'Unhide & activate worksheet
With Worksheets(destsht)
.Visible = True
.Activate
End With
End Sub
长度:700 char (与4700 char相比)( 1 / 7 th 的大小原)