VBA:进行计算 - 仅输出值

时间:2017-10-29 03:22:03

标签: excel vba excel-vba

我对VBA很新,我希望有人可以帮助我。我想创建一个宏来进行计算,但只返回值。我有两个具体的例子,我想这样做: -One是宏计算A2:A100的平均值并返回B100中该平均值的值,然后是A3:A101之间的平均值并返回B101中的值,直到B700为止 - 第二种情况是宏在单元格A2:A101中找到包含Max值的单元格,并在单元格E1中返回该值。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您需要用户定义Function而不是Sub s。 然后在所需的单元格(例如,B100)中输入=MyFunc(A2:A100)。 在您的情况下,似乎您可以复制粘贴。 分配也可以在VBA级别完成,Range("B100").Formula = MyFunc(...

通过一点谷歌搜索,这应该可以让你快速前进。

在那里的许多参考文献中:

https://support.office.com/en-us/article/Create-custom-functions-in-Excel-2f06c10b-3622-40d6-a1b2-b6748ae8231f

答案 1 :(得分:0)

您可以通过两种方式进行任何类型的计算(我认为这比复制SUM()MAX()Function的内置功能更具参与性。

  1. 用户定义函数(UDF) - 创建一个返回单个值的Double(例如StringVariantSubroutine数组。此函数可以采用数值或范围参数,并且可选地,它可以引用活动工作表中的值,并返回从中调用的单元格的计算值。以下是两个例子:
  2. 手动计算 - 创建一个.Cell(),用于读取值和/或文件,并在退出前手动更新单元格的值。当需要写入多个单元时,需要此方法。它还需要一个触发器,例如按下按钮,或者单击一个菜单项,或者需要一些其他事件来调用子程序。有两种方法可以处理单元格表。一个是直接使用'--------------------------------------------------------------------------------------- ' Procedure : MySquare ' Author : ja72 ' Date : 10/29/2017 ' Purpose : Returns `x^2/c` where c is defined in cell [B2] '--------------------------------------------------------------------------------------- ' Public Function MySquare(ByVal x As Double) As Double Dim c As Double c = [B2] ' Same as: c = ActiveSheet.Range("B2").Value MySquare = x ^ 2 / c End Function '--------------------------------------------------------------------------------------- ' Procedure : MyAverage ' Author : ja72 ' Date : 10/29/2017 ' Purpose : Uses the built-in funcrtion 'Average()` on the input cells '--------------------------------------------------------------------------------------- ' Public Function MyAverage(ByVal r As Range) As Double MyAverage = WorksheetFunction.Average(r) End Function 方法,另一个是将所有值都带入数组并使用一个命令写出所有值的速度更快。
  3. 示例UDF代码(在模块中)

    '---------------------------------------------------------------------------------------
    ' Procedure : FillMultiplicationTableDirect
    ' Author    : John
    ' Date      : 10/29/2017
    ' Purpose   : Fills a n×n table of cells directly
    '---------------------------------------------------------------------------------------
    '
    Public Sub FillMultiplicationTableDirect(ByVal n As Long)
    
        Dim r_table As Range
        ' Start from top left cell B15
        Set r_table = Range("B15")
        ' Process the cells one by one
        Dim i As Long, j As Long
        For i = 1 To n
            For j = 1 To n
                ' Write the resuling cell directly
                r_table.Cells(i, j).Value = i * j
            Next j
        Next i
    
    End Sub
    
    '---------------------------------------------------------------------------------------
    ' Procedure : FillMultiplicationTableOffline
    ' Author    : John
    ' Date      : 10/29/2017
    ' Purpose   : Fills a n×n table of cells with an array
    '---------------------------------------------------------------------------------------
    '
    Public Sub FillMultiplicationTableOffline(ByVal n As Long)
    
        Dim r_table As Range
        ' Start from top left cell B15 and grab n×n cells
        Set r_table = Range("B15").Resize(n, n)
        ' Define an array with the values
        Dim res() As Variant
        ' Fill the array with the existing values of the cells
        res = r_table.Value
        'Process the array (offline calculation)
        Dim i As Long, j As Long
        For i = 1 To n
            For j = 1 To n
                res(i, j) = i * j
            Next j
        Next i
        ' Write the array back to the worksheet
        r_table.Value = res
    
    End Sub
    

    示例工作表布局

    ex1

    手动计算示例(在工作表中)

    Call Sheet1.FillMultiplicationTableDirect(10)
    

    上述功能需要使用

    等命令手动触发
    Call Sheet1.FillMultiplicationTableOffline(10)
    

    if subject(1).(property) == 20
    

    示例结果

    ex2