使用VBA编程Excel宏时应避免的4个错误

Microsoft Excel已经是一种功能强大的数据分析工具,但是具有通过在Visual Basic for Applications(VBA)中编写简单的代码来自动执行带有宏的重复任务的功能,功能要强大得多。但是,如果使用不正确,VBA可能会引起问题。

即使您不是程序员,VBA也会提供简单的功能,使您可以在电子表格中添加令人印象深刻的功能。

无论您是在Excel中创建仪表板的VBA专家,还是编写用于执行基本单元格计算的简单脚本的新手。遵循这些简单的编程技术,以学习如何编写干净,无错误的代码。

VBA入门

VBA可以为您做各种各样的事情。从编写修改工作表的宏到使用VBA脚本从Excel电子表格发送电子邮件,对您的生产力几乎没有限制。

如果您尚未在Excel中的VBA中进行编程,则需要启用该功能。 Excel程序中的开发人员工具。好消息是,启用Developer工具实际上非常容易。只需转到文件>选项,然后自定义功能区。只需将 Developer 标签从左侧窗格移到右侧即可。

确保复选框已启用此标签,然后“ Developer"标签将出现在Excel菜单中。

从此处进入代码编辑器窗口的最简单方法是单击“开发人员"菜单中“ 控件"下的查看代码按钮。

您现在可以编写VBA代码了!在此选项卡中,您将访问VBA以及在Excel中记录宏。现在,Excel可以使用了,让我们来看看一些常见的错误,可以避免,以及避免这些错误的方法。

1。可怕的变量名

现在您已经在代码窗口中,现在该开始编写VBA代码了。无论使用VBA还是其他任何语言,大多数程序中的第一步都是定义变量。不正确地命名变量是新开发人员犯下的最常见的编程错误之一。

在我数十年的代码编写过程中,关于变量命名约定,我遇到了许多想法,并学到了一些统治困难的道路。以下是创建变量名称的一些快速技巧:

  • 使它们尽可能短。
  • 使它们尽可能具有描述性。
  • 在变量前添加变量类型(布尔值,整数等)。
  • 下面是一个程序的示例屏幕快照,我经常使用该屏幕快照从Excel进行WMIC Windows调用以收集PC信息。

    想要在模块或对象内的函数内部使用变量(我将在下面解释),那么您需要通过在声明前面加上 Public 来将其声明为“公共"变量。否则,变量会以 Dim 开头。

    如您所见,如果变量是整数,则以 int 开头。如果是字符串,请 str 。这是一种个人喜好,可在以后的编程中提供帮助,因为您始终可以通过浏览名称来知道变量保存的数据类型。

    此外,请务必在您的工作表中命名工作表Excel工作簿。

    这样,当您在Excel VBA代码中引用工作表名称时,即是指一个有意义的名称。在上面的示例中,我有一个工作表,可以在其中输入网络信息,因此我将工作表称为“网络"。每当我想参考“网络"表时,都可以快速进行操作,而无需查找表号。

    2。打破而不是循环

    新VBA程序员开始编写代码时遇到的最常见问题之一就是正确处理循环。

    循环在Excel中非常普遍,因为您经常在处理数据值遍历整行或整列,因此您需要循环处理所有这些值。

    新程序员经常想立即打破循环(VBA For循环或VBA Do While循环)。当满足特定条件时。

    以下是此方法用于破坏VBA循环的示例。

    For x = 1 To 20 If x = 6 Then Exit For y = x + intRoomTempNext i

    新程序员采用此方法是因为它很容易。尝试并避免显式破坏循环。

    通常,在“破坏"之后出现的代码对于处理很重要。一种更清洁,更专业的方式来处理您希望中途退出循环的情况,就是将退出条件包括在VBA While语句之类的地方。

    While (x>=1 AND x<=20 AND x<>6) For x = 1 To 20 y = x + intRoomTemp Next iWend

    码。现在,代码将循环遍历并在到达6时停止。无需在循环中包含笨拙的EXIT或BREAK命令。

    3。不使用数组

    新VBA程序员犯下的另一个有趣的错误是试图处理在计算过程中通过行和列过滤的众多嵌套循环中的所有内容。

    这也可能导致重大的性能问题。遍历一列并每次提取值都是处理器上的杀手kill。处理长数字列表的一种更有效的方法是利用数组。

    如果您以前从未使用过数组,请不要担心。想象一下一个阵列,就像一个带有一定数量“立方体"的冰块托盘,您可以在其中放入信息。多维数据集编号为1到12,这就是将数据“放入"多维数据集的方式。

    只需键入 Dim arrMyArray(12)作为Integer ,就可以轻松定义数组。

    这将创建一个具有12个插槽的“托盘"供您填充。

    这是没有数组的行循环代码的样子:

    Sub Test1() Dim x As Integer intNumRows = Range("A2", Range("A2").End(xldown)).Rows.Count Range("A2").Select For x = 1 To intNumRows If Range("A" & str(x)).value < 100 then intTemp = (Range("A" & str(x)).value) * 32 - 100 End If ActiveCell.Offset(1, 0).Select NextEnd Sub

    在此示例中,代码正在处理范围内的每个单元格并执行温度计算。

    如果您想对这些相同的值执行其他计算,则该过程将很麻烦。您必须复制此代码,处理所有这些单元格,然后执行新的计算。一切都只有一个改变!

    在这里,使用数组是一个更好的例子。首先,让我们创建一个数组。

    Sub Test1() Dim x As Integer intNumRows = Range("A2", Range("A2").End(xldown)).Rows.Count Range("A2").Select For x = 1 To intNumRows arrMyArray(x-1) = Range("A" & str(x)).value)  ActiveCell.Offset(1, 0).Select Next End Sub

    用于指向数组元素的 x-1 仅必要,因为For循环从1开始。数组元素需要从0开始。 。

    现在有了数组,处理内容就非常简单。

    Sub TempCalc() For x = 0 To UBound(arrMyArray) arrMyTemps(y) = arrMyArray(x) * 32 - 100  NextEnd Sub

    此示例遍历了整个行数组( UBound 为您提供了数组中的数据值的数量),进行温度计算,然后将其放入另一个名为 arrMyTemps 的数组中。

    4。使用过多的引用

    无论您是使用成熟的Visual Basic还是VBA进行编程,都需要包括“引用"以访问某些功能。

    引用有点像如“库",其中包含启用该文件后可以使用的功能。您可以在开发人员视图中找到引用,方法是单击菜单中的工具,然后单击引用

    在此窗口中可以找到的内容是当前VBA项目所有当前选择的参考。

    您应该检查此列表,因为不必要的参考会浪费系统资源。如果您不使用任何XML文件操作,那么为什么要选择Microsoft XML?如果您不与数据库通信,则删除Microsoft DAO,等等。

    如果不确定这些选定引用的作用,请按 F2 ,您会看到对象资源管理器。在该窗口的顶部,您可以选择参考库进行浏览。

    选择后,您将看到所有对象和可用功能,可以单击它们来了解更多信息。<

    例如,当我单击DAO库时,很快就会清楚这一切都与连接数据库和与数据库通信有关。

    减少编程中使用的引用数量项目是一个很好的选择,它将有助于使您的整个应用程序更有效地运行。

    在Excel VBA中编程

    在Excel中实际编写代码的整个想法吓到了很多人,但是这种担心真的没有必要。 Visual Basic for Applications是一种非常简单的语言,如果您遵循上述基本的通用做法,则将确保您的代码干净,高效且易于理解。

    标签: