用于访问隐藏超链接的宏

时间:2018-03-11 19:45:43

标签: excel vba excel-vba

我有一个宏,可让用户在 Summary 工作表上双击指定的小区范围,然后访问隐藏{{ 1}}工作表包含相关数据。当用户返回 Data 工作表时,会重新隐藏 Summary 工作表。

宏适用于范围 Data ,但不适用于单元格范围D10:G15

C21:G26 工作表:

screenshot of table

VBA:

Summary

我试图了解我做错了什么。任何帮助都将受到极大的赞赏。

1 个答案:

答案 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 ......"

详情。

因此,您知道G15C21之间的某些变化。仔细检查这部分代码是有意义的。

首先,没有G15 - 但除此之外,如果我们仔细观察:

pic2

......看甚至更接近:

pic3

从那里开始,直到你的代码结束,你在一半的函数上以某种方式切换到了错误的引号类型。

有助于防止此类问题的最后几项提示:

  1. 作为每个模块的第一行:Option Explicit。这将迫使您正确声明和处理变量,属性等。

  2. 在进行更改之前,请备份。如果您在一天内进行了10次重大更改,则应保留所有10个版本,至少持续几周。你会感到很惊讶他们有多方便,特别是在学习的时候。

  3. 每次更改后都要测试代码。这可能看起来很耗时,但这是从长远来看如何节省时间的一个例子。

  4. 我希望听起来不像是在侮辱你或你的工作,而且肯定 重要的是在这个领域100%彻底,准确和有条理,并在进入下一个领域之前完全理解一项技能,特别是在早期阶段。一定要查看其他一些很棒的Excel论坛。祝好运!

    编辑:示例解决方案

    这是基本组织所带来的差异的一个例子。下面的代码与问题中的所有代码具有相同的功能(除了这一个没有错误,错误处理,并自动适应新名称/报告)。

    必需的假设/组织:

    • Column A包含经理名称(工作表名称后缀):FirstName LastInitial ex。 Jim E位于A13 A24
    • Rows 9 & 20 隐藏并包含"报告代码" (工作表名称前缀):ex。 D9 = TotApp& G20 = RefChk
    • 相应地重命名工作表(例如:TotApp Jim ERefChk Jim E

      因此我们有简单的逻辑:

      • 工作表前缀始终是所单击行的A列。
      • 如果行在10-15之间,则单击列的第9行包含后缀。
      • 如果行在21-26之间,则单击列的第20行包含后缀。
      • 因此,整个可点击范围是C10:G15和C21:G26

    代码:

    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 的大小原)