【问题标题】:VBA - Hide/unhide row based on hidden/unhidden status of another rowVBA - 根据另一行的隐藏/未隐藏状态隐藏/取消隐藏行
【发布时间】:2016-02-02 04:35:05
【问题描述】:

我正在尝试编写一些 VBA 代码,如果隐藏了另一个特定行,它将取消隐藏整行。此宏还根据特定列中的值隐藏一系列行。这方面工作正常 - 我有可靠的代码。我无法让我描述的第一个功能起作用。应该很容易做到,只是不知道语法。此子例程应在打开工作簿时执行。

Private Sub Workbook_Open()
Application.ScreenUpdating = False

Dim targ As Range
Dim msg As Range

targ = "DETAILS!B6"
msg = "DETAILS!B42"

msg.EntireRow.Hidden = True


With Range("DETAILS!B6:B40")
        .EntireRow.Hidden = False

        For Each cell In Range("DETAILS!B6:B40")
        Select Case cell.Value

        Case Is = 0
        cell.EntireRow.Hidden = True

        End Select
        Next cell
End With


If targ.EntireRow.Hidden = True Then
    msg.EntireRow.Hidden = False
End If

Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • 你把代码放在哪里了?它应该在工作簿对象 (ThisWorkbook) 的私有模块中。那是你的问题,是的,代码有效,只是在打开时没有触发?
  • 是的,它是ThisWorkbook 对象。当我打开工作簿时,我收到以下错误:Run-time error 91: Object variable or With block variable not set。当我点击“调试”时,突出显示的行是targ="DETAILS!B6"。也许这是我分配给targ 变量的值

标签: vba excel


【解决方案1】:

你需要像下面这样设置变量

Private Sub Workbook_Open()
Application.ScreenUpdating = False

Dim targ As Range
Dim msg As Range

Set targ = "DETAILS!B6"
Set msg = "DETAILS!B42"

msg.EntireRow.Hidden = True


With Range("DETAILS!B6:B40")
    .EntireRow.Hidden = False

    For Each cell In Range("DETAILS!B6:B40")
    Select Case cell.Value

    Case Is = 0
    cell.EntireRow.Hidden = True

    End Select
    Next cell
End With


If targ.EntireRow.Hidden = True Then
    msg.EntireRow.Hidden = False
End If

Application.ScreenUpdating = True
End Sub

【讨论】:

    【解决方案2】:

    哦!只需将Set 放在targmsg 之前,因为它们是Range。声明范围时,必须有Set,即Set myRng = Range("A1:A10")

    如果 Set Targ = "DetailsB6" 不起作用,您可能需要执行 Set targ = Range("Details!B6")

    再想一想,如果你是Dim Targ as Range,我认为Set Targ = "Details!B6" 不会起作用。你作为一个范围变暗,但将它声明为一个字符串。您需要将其设为 Range,才能像 targ.EntireRow.Hidden 一样使用它。

    【讨论】:

      【解决方案3】:

      虽然你可以像这样调用范围对象:Range("DETAILS!B6:B40")

      在 vba 中,最好这样称呼它:Sheets("DETAILS").Range("B6:B40")

      我修复了一些语法错误:

      Private Sub Workbook_Open()
      Application.ScreenUpdating = False
      
      Dim targ As Range
      Dim msg As Range
      
      Set targ = Sheets("DETAILS").Range("B6")
      Set msg = Sheets("DETAILS").Range("B42")
      
      msg.EntireRow.Hidden = True
      
      
      With Sheets("DETAILS").Range("B6:B40")
              .EntireRow.Hidden = False
      End With
      
      For Each cell In Sheets("DETAILS").Range("B6:B40")
          Select Case cell.Value
              Case 0
                  cell.EntireRow.Hidden = True
          End Select
      Next cell
      
      
      
      If targ.EntireRow.Hidden = True Then
          msg.EntireRow.Hidden = False
      End If
      
      Application.ScreenUpdating = True
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-21
        • 1970-01-01
        • 2014-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多