在Excel 2010中隐藏行的宏

8

我对VBA编程比较新,已经阅读了一些网络资料,但我找不到需要的信息或无法使其工作。我的问题是:

在工作表“Sheet1”中,单元格B6给出了一个项目将被开发多少年的价值。

在工作表“Sheet2”和“Sheet3”中,我制作了一个为50年(第1年到第50年;第7行到第56行)的电子表格。

在“Sheet1”的单元格B6中,我想输入1到50之间的值。当值为49时,我想隐藏“Sheet2”和“Sheet3”中的第56行。当值为48时,我想隐藏“Sheet2”和“Sheet3”中的55:56行,以此类推。

这是我目前的代码,但当我更改单元格B6中的值时,它无法自动工作:

Sub test1()
    If Range("sheet1!B6") = 50 Then
    Rows("52:55").EntireRow.Hidden = False
    Else
    If Range("sheet1!B6") = 49 Then
    Rows("55").EntireRow.Hidden = True
    Else
    If Range("sheet1!B6") = 48 Then
    Rows("54:55").EntireRow.Hidden = True
    
    End If: End If: End If:
    
    End Sub

我希望有人能帮助我解决我的问题。
谢谢。
2个回答

9
你差不多理解了。 你正在隐藏活动工作表中的行,这是可以的。但更好的方法是在哪里添加它。
Rows("52:55").EntireRow.Hidden = False

变成

activesheet.Rows("52:55").EntireRow.Hidden = False

我曾经在没有它的情况下遇到过奇怪的事情。如果要使其自动化,您需要在VBA编辑器中的工作表宏中使用worksheet_change事件(不是模块,请双击编辑器左边的sheet1)。在该工作表中,使用编辑器本身上方的下拉菜单(应该有2个列表框)。左侧的列表框将显示您要查找的事件。之后只需添加宏即可。它应该看起来像下面的代码:

Private Sub Worksheet_Change(ByVal Target As Range)
test1
end Sub

就是这样。每当您更改任何内容时,它将运行宏test1。


1
注意:所谓的“怪异问题”,例如,如果活动工作表不再引用您认为它引用的工作表,由于工作簿或工作表上下文的更改,则会隐藏一些其他工作表中的行(52:55),这将使其看起来好像没有起作用。 - Anonymous Type

6

好的,Benno,你已经走上了正确的道路!

关于VBA编程,有一些小技巧可能会对你有所帮助。

  1. 始终明确引用你想要操作的工作表。否则,Excel可能会“假设”你的代码适用于活动工作表,并最终破坏你的电子表格。

  2. 正如lionz所提到的,学习使用Excel提供的本地方法。你可以在大多数技巧中使用它们。

  3. 明确声明你的变量...它们将显示VBA中每个对象提供的方法列表。这可能会节省你在互联网上搜索的时间。

现在,让我们来看一个草稿代码...

请记住,这段代码必须在Excel工作表对象内部,就像lionz所解释的那样。它仅适用于第2个工作表,你可以根据自己的喜好将其调整为同时适用于第2个和第3个工作表。

希望这能帮到你!

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim oSheet As Excel.Worksheet

    'We only want to do something if the changed cell is B6, right?
    If Target.Address = "$B$6" Then

        'Checks if it's a number...
        If IsNumeric(Target.Value) Then

            'Let's avoid values out of your bonds, correct?
            If Target.Value > 0 And Target.Value < 51 Then

                'Let's assign the worksheet we'll show / hide rows to one variable and then
                '   use only the reference to the variable itself instead of the sheet name.
                '   It's safer.

                'You can alternatively replace 'sheet 2' by 2 (without quotes) which will represent
                '   the sheet index within the workbook
                Set oSheet = ActiveWorkbook.Sheets("Sheet 2")

                'We'll unhide before hide, to ensure we hide the correct ones
                oSheet.Range("A7:A56").EntireRow.Hidden = False

                oSheet.Range("A" & Target.Value + 7 & ":A56").EntireRow.Hidden = True

            End If

        End If

    End If

End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接