无法从公式调用的函数中隐藏行Excel 2003

时间:2014-06-14 13:19:16

标签: excel excel-vba excel-formula hide rows vba

我有这个非常简单的功能

Public Function HRows(xx As String)
    BeginRow = 2
    EndRow = 10
   ' HideRows
    For RowCnt = BeginRow To EndRow
     Cells(RowCnt,ChkCol).EntireRow.Hidden = True
    Next RowCnt
End Function 

从命令按钮调用时,它工作正常,当作为公式调用,例如= HRows(A1),从工作表单元格它在Excel 2003上没有做任何事情,它在Open Office Calc 4.1中工作

这是在一个空的电子表格上发生的 - 没有保护,没有评论,没有形状(在其他问题中被建议作为抑制剂)

最终,我想隐藏/显示电子表格的相关部分,具体取决于用户在某些关键单元格中输入的内容 - 我不想添加命令按钮来控制隐藏。

1 个答案:

答案 0 :(得分:1)

我已经在这里引入了这个方法https://stackoverflow.com/a/23232311/2165759,为了您的目的,代码如下:

将代码放置到VBAProject的一个模块中:

Public Tasks, PermitNewTasks, ReturnValue

Function HideRowsUDF(lBegRow, lEndRow) ' Use this UDF on the sheet
    If IsEmpty(Tasks) Then TasksInit
    If PermitNewTasks Then Tasks.Add Application.Caller, Array(lBegRow, lEndRow)
    HideRowsUDF = ReturnValue
End Function

Function HideRows(lFrom, lUpTo) ' actually all actions performed within this function, it runs without UDF limitations
    Range(Rows(lFrom), Rows(lUpTo)).EntireRow.Hidden = True
    HideRows = "Rows " & lFrom & "-" & lUpTo & " were hidden"
End Function

Sub TasksInit()
    Set Tasks = CreateObject("Scripting.Dictionary")
    ReturnValue = ""
    PermitNewTasks = True
End Sub

将代码放入VBAProject中的Microsoft Excel对象的ThisWorkbook部分:

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
    Dim Task, TempFormula
    If IsEmpty(Tasks) Then TasksInit
    Application.EnableEvents = False
    PermitNewTasks = False
    For Each Task In Tasks
        TempFormula = Task.FormulaR1C1
        ReturnValue = HideRows(Tasks(Task)(0), Tasks(Task)(1))
        Task.FormulaR1C1 = TempFormula
        Tasks.Remove Task
    Next
    Application.EnableEvents = True
    ReturnValue = ""
    PermitNewTasks = True
End Sub