2016-02-01 86 views
1

我正试图编写一些VBA代码,如果隐藏了另一个特定行,将取消隐藏整行。该宏还根据特定列中的值隐藏了一系列行。这方面工作正常 - 我有可靠的代码。我无法获得我描述的第一个功能。应该很容易做,只是不知道语法。这个子程序应该在打开工作簿时执行。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 
+0

你在哪里放置了这段代码?它应该位于Workbook Object(ThisWorkbook)的专用模块中。这是你的问题是的,代码的作品,它只是没有公开发射? – BruceWayne

+1

是的,它是'ThisWorkbook'对象。当我打开工作簿时,出现以下错误:运行时错误91:对象变量或块变量未设置。当我点击“调试”时,突出显示的行是'targ =“DETAILS!B6”'。也许这是我分配给'targ'变量的值 –

回答

1

虽然你可以这样调用的对象范围: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 
2

您需要设置变量,像下面

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

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

可能需要做Set targ = Range("Details!B6")如果只是Set Targ = "DetailsB6"不起作用。

关于第二个想法,我不认为Set Targ = "Details!B6"将工作,如果你是Dim Targ as Range。你是一个范围昏暗,但声明它像一个字符串。您需要这是一个范围,使用它像targ.EntireRow.Hidden