用于在Excel 2010中隐藏行的宏

时间:2011-07-04 22:06:07

标签: excel vba row hide

我对VBA编程有点新意。我在互联网上阅读了一些东西,但我无法找到我需要或无法使其工作的东西。我的问题:

在单元格B6的工作表“工作表1”中,给出了项目将被利用多少年的值。

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

在'表1'中的单元格b6中我想输入介于1和50之间的值。当值为49时,我想隐藏'sheet2'和'sheet 3'中的第56行。当值为48时,我想隐藏'sheet2'和'sheet 3'中的行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 个答案:

答案 0 :(得分: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 :(得分:6)

嗯,你走在正确的道路上,本诺!

有一些关于VBA编程的提示可能会帮助你。

  1. 始终对要与之交互的工作表使用显式引用。否则,Excel可能会“假设”您的代码适用于活动工作表,最终您会看到它将您的电子表格搞定。

  2. 正如Lionz所述,请与Excel提供的原生方法取得联系。你可以在大多数技巧上使用它们。

  3. 明确声明您的变量......它们将显示每个对象在VBA中提供的方法列表。它可以节省您在互联网上挖掘的时间。

  4. 现在,让我们有一个草案代码......

    请记住,此代码必须位于Excel Sheet对象中,如lionz所述。它仅适用于Sheet 2,由您自己决定以您喜欢的方式将其调整为Sheet 2和Sheet 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