【问题标题】:How to return 2 values and rounding them? Excel VBA如何返回 2 个值并舍入它们? Excel VBA
【发布时间】:2017-12-08 01:20:39
【问题描述】:

我正在编写一个应该计算简单基础的代码,为了做到这一点,我必须用我的函数返回 2 个值 - 最好在两个不同的列中。

Function FundacaoSimples(b, l, carga) As Variant

tensao = Sheets("Tabelas e Constantes").Range("tensao").Value

Dim area As Double
Dim Bs As Single
Dim Ls As Single
Dim Resultado(1 To 2) As String

If b = l Then
    area = (1.1 * carga) / tensao
    Bs = Sqr(area)
    Ls = Bs
ElseIf b <> l Then
    area = (1.1 * carga) / tensao
    Bs = Sqr((2 * area) / 3)
    Ls = (3 * Bs) / 2
End If

Resultado(1) = Round(Bs, 2)
Resultado(2) = Round(Ls, 2)

FundacaoSimples = (Resultado(1) & " / " & Resultado(2))

End Function

我使用它只是为了得到一个用 2 位小数四舍五入的值,例如:2,73 到 2,75; 0,89 至 0,90。 我尝试使用ActiveCells.Offset(0,1),但该声明无效。 是否可以只向右跳一列?

【问题讨论】:

  • 你不能。 UDF 接受输入并返回一个值,该值成为调用单元的Value。 UDF 不能更改其他单元格。

标签: vba excel multiple-results


【解决方案1】:

您可以使用 ActiveCell.Offset(0, 1).value = SomeValue,但是 - 那是在编写常规 Sub 时。您正在编写函数/用户定义函数。

在 UDF 中,无法更改不同的单元格。

但是,一种解决方法是使用 UDF,当它输入到单元格中时,您可以使用 Worksheet_Change 事件来更改该事件的 Target 参数旁边的单元格。

编辑: 一些示例代码:

在常规模块中:

Public Function MyUDF(param1 as integer, param2 as integer) as Integer
    MyUDF = param1 + param2
End Function

在您想要偏移量的工作表中:

Private Sub Worksheet_Change(Byval Target as Range)
    If Left(Target.Formula, 6) = "=MyUDF" Then
        Target.Offset(0, 1).value = "somevalue at the offset cells"
    End If
End Sub

【讨论】:

  • 这个解决方案的一个问题是Worksheet_Change 事件不会在Target 被重新计算时被调用,因为某个其他单元格 被修改了。 Target 应该是作为 UDF 输入的任何单元格,而不是包含 UDF 调用的单元格。老实说,OP 可能会更好地使用本机 Excel 函数调用来实现它们的舍入;性能会更好,并且不会在一些晦涩的事件处理程序中隐藏 VBA 代码。不使用 Rubberduck 的 VBA 程序员不会轻易看到该事件处理程序。
  • 是的,你完全正确。但是,要首先更新 UDF,它还需要 Application.Volatile 并且采用这种方法还有一些问题 - 但是,它是填充“单元格旁边的单元格”的解决方案另一个公式。我同意在这种情况下最好使用本机 Excel 函数。
【解决方案2】:

一般来说,函数不应写入值或访问电子表格中的值。他们应该访问他们的参数并返回结果。 试试这样,你需要的一个过于简单的版本:

Option Explicit

Public Sub TestMe()

    ActiveCell = FundacaoSimples(0)
    ActiveCell.Offset(0, 1) = FundacaoSimples(1)

End Sub

Function FundacaoSimples() As Variant

    ReDim varResult(1)

    varResult(0) = 55
    varResult(1) = 100

    FundacaoSimples = varResult

End Function

然后你可以用你自己的参数稍微编辑一下函数并进一步使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-29
    • 2019-09-13
    • 2015-08-27
    • 1970-01-01
    • 2017-11-24
    • 2023-02-22
    • 2021-11-04
    • 2013-04-07
    相关资源
    最近更新 更多