VBA,最小/最大...或其他数学函数

时间:2018-10-08 15:23:26

标签: vba

我在Google上搜索了很多,但是我想确定:

我真的需要对“最大功能”使用“ Application.WorksheetFunction.Max”吗?

如果可以,我可以缩短吗?如果将这种长结构扭曲为函数,会产生开销吗?

编辑:我已经删除了vba-access标签。

5 个答案:

答案 0 :(得分:1)

我发现有两种较短的编码方式:

一个

Sub MaxTest()
    Dim A As Integer, B As Integer
    A = Sheet1.Range("$A$1").Value
    B = Sheet1.Range("$A$2").Value
    Sheet1.Range("$B$1").Value = WorksheetFunction.Max(A, B)
End Sub

两个

Sub MaxTest()
    Dim A As Integer, B As Integer
    A = Sheet1.Range("$A$1").Value
    B = Sheet1.Range("$A$2").Value
    Sheet1.Range("$B$1").Value = IIf(A > B, A, B)
End Sub

答案 1 :(得分:0)

我为您提供3个想法,

  1. 您几乎可以在所有情况下使用VBA跳过“应用程序”,而只需编写“ Worksheetfunction.Max”。

  2. 您可以将变量设置为“工作表功能”,即

    Dim foo As Object
    Set foo = Application.WorksheetFunction
    foo.Max(MyArray)
    
  3. 您可以在仅执行此操作的模块中创建函数或Sub。并且输入的时间很长,不确定这样做是否值得,并且可能会降低代码的速度。

答案 2 :(得分:0)

在访问中,您没有这些工作表函数,唯一的方法是,如果A是您自己编写的代码,还是B是将excel库导入到您的Access项目中。就个人而言,我会选择A,因为如果您导入excel库,那么您将卡在导入的excel的确切版本中。

一个简单而肮脏的例子是

Public Function Max(ByVal A As Variant,ByVal B As Variant) As Variant
    If A > B Then
        Max = A
    Else
        Max = B
    End If
End Function

这需要一些TLC,这样您就不会尝试比较记录集或其他废话,而会引发错误。

编辑:我想如果您以后将对Excel的引用绑定了,那么我也可以得到excel库中的东西,所以这是第三个选择。

答案 3 :(得分:0)

这里没有提供上下文,但是如果您基本上是在循环并为每对查找最大值,则说明您做错了错,尤其是在Access数据库中。与尝试提供VBA hacky解决方法(迫使您进入RBAR *模式)相比,做与SQL查询相同的事情将更快,更轻松地设计和优化,这对所有数据库都是一种厌恶。

因此,我首先将仔细研究代码的作用,如果这基本上只是要聚合的大量数据,则不应使用VBA,而应使用SQL。

哎呀,如果您想变得懒惰,Access已经为您提供了DMax域功能(尽管它们有问题,因为它们总是在VBA中使用,因此以RBAR方式使用)。您真的只想让SQL完成所有工作并获得最终记录集,该记录集将变为直接读取/导出/显示操作,而无需任何其他工作。

如果您花了很长时间仔细查看代码,并且输入不是来自数据源,也不是在循环中运行(无论是直接还是间接),那么可以使用一些自制的VBA功能或引用Excel库(最好是后期绑定)。


1) R ow- B y- 变色- R ow-迭代很酷语言。在像SQL这样的声明性语言中,它并不那么酷。

答案 4 :(得分:0)

看到我的问题不清楚后,我自己回答。

有些人不知道,我是说EXCEL还是ACCESS。我的错,给错标签。这是纯VBA问题。

第二个错误:我正在为我的问题提供EXCEL-Way(工作表)。但这纯属VBA问题。

我无法删除问题,但我喜欢这样做。

所以答案是:

public class CustomClient : ServiceClient_v1
{
  public CustomClient(binding, address) : base (binding, address) {}
}

...正在完成工作。

很抱歉浪费我们的时间!