如果VBA中的函数为false,则为硬编码函数值

时间:2014-12-22 16:28:13

标签: excel vba hardcoded

如果函数为false(如硬编码答案),我想将函数值作为粘贴特殊值返回。有人可以帮我吗? 我认为使用函数而不是sub更容易,因为我必须对相当大的数据集执行此操作。

Function produktion(d2, sum1, sum2)

    Dim j As Integer
    j = Application.Sum(sum1) - Application.Sum(sum2)


    If d2 = Date Then

        produktion = j

    Else
        'here hardcode the produktion = j forever like the paste special value

感谢您的时间!

2 个答案:

答案 0 :(得分:1)

在标准模块中输入:

Public FreezeWho As String
Public FreezeNow As Boolean

Public Function produktion(d2 As Date, sum1 As Range, sum2 As Range) As Long
    Dim wf As WorksheetFunction, j As Long
    Set wf = Application.WorksheetFunction
    j = wf.Sum(sum1) - wf.Sum(sum2)
    produktion = j
    If d2 = Date Then
        FreezeWho = Application.Caller.Address
        FreezeNow = True
    End If
End Function

并在工作表代码区域输入:

Private Sub Worksheet_Calculate()
    If FreezeNow Then
        Range(FreezeWho).Value = Range(FreezeWho).Value
        FreezeNow = False
    End If
End Sub

“冻结”条件为 True。时,该函数会向事件宏发出信号。事件宏看到信号并冻结包含该函数的单元格。

答案 1 :(得分:1)

UDF无法直接修改工作表,它只能返回一个值。有一些解决方法可以触发代码在UDF调用之外执行。

其中一个是使用Evaluate来调用修改工作表的代码(另一个是使用工作表事件,如Gary所说)

Function produktion(d2, sum1, sum2)
    Dim j As Long
    j = Application.Sum(sum1) - Application.Sum(sum2)

    If d2 = Date Then
        produktion = j
    Else
        With Application.Caller
            'here hardcode the produktion = j forever like the paste special value
            .Worksheet.Evaluate "HardCodeValue(""" & .Address & """)"
        End With
    End If
End Function

Sub HardCodeValue(rng As String)
    With Range(rng)
        .Value = .Value
    End With
End Sub