我对VBA很新,我希望有人可以帮助我。我想创建一个宏来进行计算,但只返回值。我有两个具体的例子,我想这样做: -One是宏计算A2:A100的平均值并返回B100中该平均值的值,然后是A3:A101之间的平均值并返回B101中的值,直到B700为止 - 第二种情况是宏在单元格A2:A101中找到包含Max值的单元格,并在单元格E1中返回该值。
感谢您的帮助。
答案 0 :(得分:0)
您需要用户定义Function
而不是Sub
s。
然后在所需的单元格(例如,B100)中输入=MyFunc(A2:A100)
。
在您的情况下,似乎您可以复制粘贴。
分配也可以在VBA级别完成,Range("B100").Formula = MyFunc(...
通过一点谷歌搜索,这应该可以让你快速前进。
在那里的许多参考文献中:
答案 1 :(得分:0)
您可以通过两种方式进行任何类型的计算(我认为这比复制SUM()
,MAX()
或Function
的内置功能更具参与性。
Double
(例如String
,Variant
或Subroutine
数组。此函数可以采用数值或范围参数,并且可选地,它可以引用活动工作表中的值,并返回从中调用的单元格的计算值。以下是两个例子:.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
方法,另一个是将所有值都带入数组并使用一个命令写出所有值的速度更快。'---------------------------------------------------------------------------------------
' 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
Call Sheet1.FillMultiplicationTableDirect(10)
上述功能需要使用
等命令手动触发Call Sheet1.FillMultiplicationTableOffline(10)
或
if subject(1).(property) == 20