在本教程中,我们将了解Excel VBA函数 1)什么是Excel中的Visual Basic?

2)如何在Excel中使用VBA?

3)如何创建用户定义函数?

4)如何编写宏?

如何编写VBAcode Excel为用户提供了大量现成的功能,足以满足普通用户的需求。通过安装可用的各种外接程序,可以添加更多内容。大多数计算都可以通过提供的功能来实现,但是不久之后您便发现自己希望有一个功能可以完成特定工作,并且列表中找不到任何合适的函数。您需要一个UDF。 UDF(用户定义函数)就是您使用VBA创建的函数。 UDF通常被称为“自定义功能”。 UDF可以保留在工作簿附带的代码模块中,在这种情况下,当该工作簿打开时它将始终可用。或者,您可以创建自己的加载项,其中包含一个或多个功能,就像商业加载项一样,您可以将其安装到Excel中。代码模块也可以访问UDF。 UDF通常是由开发人员创建的,只能在VBA过程的代码内工作,而用户永远不会意识到它们的存在。像任何功能一样,UDF可以根据需要简单或复杂。让我们从一个简单的…​开始

| ===计算矩形面积的函数是的,我知道您可以在脑海中做到这一点!概念非常简单,因此您可以专注于该技术。假设您需要一个函数来计算矩形的面积。您浏览了Excel的功能集合,但没有一个合适的。这是要执行的计算:

面积=长度x宽度打开一个新工作簿,然后打开Visual Basic编辑器(“工具”>“宏”>“ Visual Basic编辑器”或ALT + F11)。

您将需要一个用于编写函数的模块,因此请选择“插入”>“模块”。进入空的模块类型:_Function Area_并按Enter。VisualBasic编辑器为您完成了该行并添加了End Function行,就像您正在创建子例程一样。到目前为止,看起来像这样…​

Function Area()

End Function

将光标放在“区域”之后的括号之间。如果您想知道括号的用途,那么您将发现!我们将指定函数要使用的“参数”(“ 参数”是执行计算所需的一条信息)。键入_Length作为double,输入Width作为double,然后单击下面的空行。请注意,在您键入时,会弹出一个滚动框,列出所有与您键入的内容相对应的内容。

img2

此功能称为自动列表成员。如果它没有出现,或者它已被关闭(在“工具”>“选项”>“编辑器”中将其打开),或者您之前可能输入有误。这是对语法的非常有用的检查。找到所需的项目,然后双击将其插入代码中。您可以忽略它,只需要输入即可。您的代码现在看起来像这样…​

Function Area(Length As Double, Width As Double)

End Function

声明参数的数据类型不是强制性的,但很有意义。您可以键入_Length,Width_并保留其原样,但是警告Excel期望使用哪种数据类型可以帮助您的代码更快地运行并拾取输入错误。 _double_数据类型指的是数字(可以是非常大的数字),并且允许小数。现在进行计算本身。在空行中,首先按TAB键以缩进您的代码(使其更易于阅读),然后键入_Area = Length * Width._这是完整的代码…​

Function Area(Length As Double, Width As Double)

Area = Length * Width

End Function

您会注意到在键入时会弹出Visual Basic编辑器的另一个帮助功能,即自动快速信息…​

img31

。这与这里无关。它的目的是通过告诉您需要哪些参数来帮助您在VBA中编写函数。您可以立即测试功能。切换到Excel窗口,并在单独的单元格中输入“长度”和“宽度”的数字。在第三个单元格中输入函数,就好像它是内置函数之一一样。在此示例中,单元格A1包含长度(17),单元格B1包含宽度(6.5)。在C1中,我键入_ = area(A1,B1)_,新函数计算出面积(110.5)…​

img3

有时,函数的参数可以是可选的。在此示例中,我们可以将Width参数设为可选。假设矩形恰好是长度和宽度相等的正方形。为了节省用户必须输入的两个参数,我们可以让他们只输入长度,然后让函数使用该值两次(即乘以长度x长度)。因此,函数知道何时可以执行此操作,我们必须包含IF语句来帮助其确定。更改代码,使其看起来像这样…​

Function Area(Length As Double, Optional Width As Variant)

If IsMissing(Width) Then

Area = Length * Length

Else

Area = Length * Width

End If

End Function

请注意,Width的数据类型已更改为_Variant_以允许为空值。该函数现在允许用户仅输入一个参数,例如_ = area(A1)_。函数中的IF语句检查是否提供了Width参数,并据此进行计算…​

img4

计算油耗的函数我喜欢检查汽车的油耗,因此在购买燃油时,我记下了行驶里程以及加满油箱需要多少燃油。

在英国,燃料以升出售。汽车的里程表(好的,所以是里程表)以英里为单位记录距离。而且由于我太老太笨而无法更改,所以我只了解MPG(英里/加仑)。现在,如果您觉得这有点可悲,那该怎么办。到家后,我打开Excel并将数据输入到工作表中,该表会为我计算MPG并绘制汽车性能图表。计算是汽车自上次加油以来行驶的英里数除以所用燃料的加仑数…​…​

MPG =(最低填充-上一次英里填充)/加仑汽油,但因为燃油以升为单位,每加仑有4.546升。.

MPG =(最低填充-上一次英里填充)/升燃料x 4.546这是我编写函数的方式…​

Function MPG(StartMiles As Integer, FinishMiles As Integer, Litres As Single)

MPG = (FinishMiles - StartMiles) / Litres * 4.546

End Function

这是工作表上的外观…​

img5

并非所有函数都执行数学计算。这是一个提供信息的…​

给出日期名称的函数我经常被问到是否有日期函数将文本的星期几(例如星期一)给出。答案是否定的,但是创建答案很容易。 (附录:我没有回答吗?请查看下面的注释以查看我忘记的功能!)。 Excel具有WEEKDAY函数,该函数以1到7之间的数字返回星期几。如果您不喜欢默认值(星期日),则可以选择哪一天为1。在下面的示例中,函数返回“ 5”,而我恰好知道它的意思是“星期四”。

img6

但是我不想看到一个数字,我想看到“星期四”。我可以通过添加一个VLOOKUP函数来修改计算,该函数引用一个表,表中包含一个数字列表和一个对应的日期名称列表。或者,我可以使整个事情独立于多个嵌套的IF语句。太复杂!答案是自定义功能…​

Function DayName(InputDate As Date)

Dim DayNumber As Integer

DayNumber = Weekday(InputDate, vbSunday)

Select Case DayNumber

Case 1

DayName = "Sunday"

Case 2

DayName = "Monday"

Case 3

DayName = "Tuesday"

Case 4

DayName = "Wednesday"

Case 5

DayName = "Thursday"

Case 6

DayName = "Friday"

Case 7

DayName = "Saturday"

End Select

End Function

我已经将我的函数称为“ DayName”,并且它接受一个参数,我将其称为“ InputDate”,(当然)必须是一个日期。它是这样工作的…​

  • 函数的第一行声明了一个我称为“ DayNumber”的变量,它将是一个整数(即整数)。

  • 函数的下一行使用Excel的WEEKDAY函数为该变量分配一个值。该值将是1到7之间的数字。

尽管默认值为1 = Sunday,但是为了清楚起见,我还是将其包括在内。

最后,Case Statement *检查变量的值并返回适当的文本。

这是工作表上的外观…​

img7

=== === 访问自定义功能如果工作簿已附加包含自定义功能的VBA代码模块,则可以在同一工作簿中轻松解决这些功能,如上面的示例所示。您可以使用函数名称,就像它是Excel的内置函数之一一样。

您还可以在“功能向导”中找到列出的功能(有时称为“粘贴功能”工具)。使用向导以常规方式插入功能(“插入”>“功能”)。

向下滚动功能类别列表以找到“用户定义”,然后选择它以查看可用的UDF列表…​

img8

img9

您可以看到用户定义的函数除了无用的“无可用帮助”消息外,没有任何说明,但是您可以添加简短说明…​

确保您在包含功能的工作簿中。转到工具>宏>宏。您不会在此处看到您的函数,但是Excel知道它们!在对话框顶部的“宏名称”框中,键入函数的名称,然后单击对话框的“选项”按钮。如果该按钮显示为灰色,则说明您将函数名称拼写错误,或者您在错误的工作簿中,或者该按钮不存在!这将打开另一个对话框,您可以在其中输入功能的简短说明。单击“确定”保存描述,然后单击“取消”以关闭“宏”对话框(这是令人困惑的位)。记住保存包含该功能的工作簿。下次您进入功能向导时,您的UDF将具有说明…​

img10

像宏一样,用户定义的函数可以在任何其他工作簿中使用,只要包含它们的工作簿处于打开状态即可。但是,这样做不是一个好习惯。在其他工作簿中输入功能并不简单。您必须将其宿主工作簿的名称添加到函数名称中。如果您依赖于功能向导,这并不困难,但是笨拙地手动写出。功能向导显示其他工作簿中所有UDF的全名…​

img11

如果在包含该功能的工作簿关闭时打开使用该功能的工作簿,则会在使用该功能的单元格中看到错误消息。 Excel忘记了它!打开函数的宿主工作簿,重新计算,一切都很好。幸运的是有更好的方法。

如果要编写要在多个工作簿中使用的用户定义函数,最好的方法是创建一个Excel加载项。在教程“构建Excel加载项”中了解如何执行此操作。

我真的应该更了解附录!永远不要,永远不要说!告诉您没有提供当天名称的功能后,我现在想起来了。看这个例子…​

img12

TEXT函数以特定的数字格式将单元格的值作为文本返回。因此,在示例中,我可以选择= TEXT(A1,“ ddd”)返回“星期四”,= TEXT(A1,“ mmmm”)返回“ 9月”等。Excel的帮助中提供了更多使用方式的示例此功能。

如果您喜欢我们的博客,请在Facebook上与您的朋友分享。您也可以在Twitter和Facebook上关注我们。

我们很高兴收到您的来信,请让我们知道我们如何改进,补充或创新我们的工作,并为您做得更好。给我们发送电子邮件至[email protected]