在VBA sub中使用Excel函数需要帮助

时间:2015-04-02 21:40:15

标签: excel vba excel-vba

所以我正在完成这项功课,并完全坚持在我的代码中加入Excel公式。这是提示:

  
      
  1. 使用代码中的Excel函数(使用Application.WorksheetFunction)进行计算   统计信息并将相应的值分配给double类型的变量。使用   范围名称ScoresData在引用作为参数提供的范围时   到功能。记住 - 在代码中使用Excel函数时,范围   规范需要使用VB语法完成。

  2.   
  3. 打开一个消息框,显示存储在变量中的值(参见图片   下面)。提示:

  4.         

    一个。您可以使用常量vbNewLine来断开提示中的一行。例如:   MsgBox“在BIT 311中有太多的资料”& vbNewLine& “Oich!” -   将在311之后放置一个换行符。

         

    湾您可以使用常量vbTab在两个部分之间添加Tab空间   提示。例如:MsgBox“Average:”& vbTab&平均

         
        
    1. 最后,将宏指定给工作表上的按钮。
    2.   

我目前的代码(不工作)是:

Sub ScoresStatistics()

    Dim Average As Double
    Dim StandDev As Double
    Dim Min As Double
    Dim Max As Double
    Dim ScoresData As Range


    Range("A1").End(xlDown).Name = "ScoresData"

    Average = Application.WorksheetFunction(Average(ScoresData))
    StandDev = Application.WorksheetFunction(StDev.P(ScoresData))
    Min = Application.WorksheetFunction(Minimum(ScoresData))
    Max = Application.WorksheetFunction(Maximum(ScoresData))

    MsgBox "Here are summary measures for the scores:" & vbNewLine & "Average:" & vbTab & Average & vbNewLine & "Standard Deviation:" & vbTab & StandDev & vbNewLine & "Minimum:" & vbTab & Min & vbNewLine & "Maximum:" & vbTab & Max

End Sub

2 个答案:

答案 0 :(得分:1)

首先为所有变量名添加前缀,以确保您不使用保留字。

Dim dblAverage As Double
Dim dblStandDev As Double
Dim dblMin As Double
Dim dblMax As Double

End(xlDown)是一个方法(即动作/指令),通常用于定位连续列表的地址,行或列号。

如果您正在尝试撰写文字"得分数据"在单元格A1中,正确的语法是     Activesheet.Range(" A1")。value ="得分数据"

如果您尝试将其写入下一个可用的空行,则添加变量以首先查找最后一行。

Dim lRow as long

'*** this is how to use End(xlup) properly
lrow = activesheet.Range("65636").End(xlup).row + 1    
Activesheet.Range("A" & lRow).value = "Scores Data"

如果您尝试对A列进行统计,请添加:     Dim ScoresData作为范围

' *** Intersect将ScoresData从A1定义为最后一个值     设置ScoresData = intersect(activesheet.usedrange,activesheet.range(" A1")。wholeColumn)

后者就是你所追求的。您的问题不在于如何正确定义用于公式的单元格范围。

答案 1 :(得分:1)

这是一个非常合理的第一次尝试,但我发现你正在混合不同的方法来实现同样的事情。使用一种方法的一半和另一半的方法很少得到正确的结果。通常,程序员会偏爱一种方法而不是另一种方法。这并不意味着其他方法错误或效率低下;只是从一个方法中更容易记住语法和过程,而不是在类似方法之间反弹,并且可能会混淆语法,就像在这里完成的那样。

如果您在A1上并点击了 Ctrl + Shift + 。您可以a)命名范围,b)将范围分配给范围变量,c)直接处理编码范围定义。以下是这三种方法的一些例子(还有其他方法)。 Debug.Print行将范围的地址输出到VBE的立即窗口。使用 Ctrl + G 或查看►立即窗口查看输出。

    ' a) Name the range.
    '    After this you can use the range by referring to Range("ScoresData")
    Range("A1:A" & Range("A1").End(xlDown).row).Name = "ScoresData"
    Debug.Print Range("ScoresData").Address

    ' b) Assign the range to a range type variable.
    '    After this you can use the range by referring to rScoresData
    Dim rScoresData As Range
    Set rScoresData = Range(Range("A1"), Range("A1").End(xlDown))
    Debug.Print rScoresData.Address

    ' c) There are lots of ways to refer to the range directly
    '    Here are a few.
    Debug.Print Range("A1:A" & Range("A1").End(xlDown).row).Address
    Debug.Print Range(Range("A1"), Range("A1").End(xlDown)).Address
    Debug.Print Cells(1, 1).Resize(Cells(1, 1).End(xlDown).row, 1).Address
    Debug.Print Cells(1, 1).Resize(Cells(Rows.Count, 1).End(xlUp).row, 1).Address

正如您可以从立即窗口输出中看到的,所有这些都完全相同。选择其中一个并记住如何使用它。至少现在,你可以忘记所有其他人,但你应该重新审视它们并知道它们是如何工作的,以防你将来遇到它们。

您创建的代码示例的复制和粘贴/重命名方法令人沮丧。在尝试编写VBA代码以重现其结果之前,您至少应该知道正确的Excel工作表函数以及如何在工作表上使用它们。认真;这显示了您的明显缺乏努力。我将提供使用您的一个要求MIN function的正确语法。你将不得不研究和调整我为其他所有人提供的东西。这不是学习如何在电子表格的列中获取最小值的地方。还有很多其他网站。这是一个学习如何编写代码的地方,它从工作表上的列中获得最小值。

    ' Declare the variable. Note that I am NOT using a reserved word as the variable's name
    Dim mn As Double

    ' a) Use the Named Range.
    mn = Application.WorksheetFunction.Min(Range("ScoresData"))
    Debug.Print "Minimum value in " & Range("ScoresData").Address(0, 0, external:=True) & " is " & mn

    ' b) Use the Range type variable.
    mn = Application.WorksheetFunction.Min(rScoresData)
    Debug.Print "Minimum value in " & rScoresData.Address(0, 0, external:=True) & " is " & mn

    ' c) Use the full coded range definition
    mn = Application.WorksheetFunction.Min(Range("A1:A" & Range("A1").End(xlDown).row))
    Debug.Print "Minimum value in " & Range("A1:A" & Range("A1").End(xlDown).row).Address(0, 0, external:=True) & " is " & mn

这应该足以让你入门。如果您有任何问题,请回复,并注明示例,错误消息等。