使用来自personal.xls的macros时的VBA逻辑

我运行一个电子表格报告,可以保存大约50列的数据,从1到5000行。 我只对4列感兴趣,但是他们从来不在同一个位置,因为这些报告对每个客户端的设置都有点不同。 然后,我把这4列粘贴到一个新的工作簿,我可以导入到另一个程序。

如果从本地文件运行,我创build了三个完成此任务的macros。 当我将它们加载到personal.xls中以用于各种文件时,我遇到了问题。 具体的工作簿/工作表引用问题。

macros的部分运行到我打算从它们导致的工作表上,而其他部分则作用于personal.xls文件本身。 这使我困惑,因为我没有任何使用诸如“本书”或“活动工作表”之类的命令的行。

例如: – 第一行编码为重命名Sheet1。 macros将personal.xls中的Sheet1重命名。
– 下一行是四个查找命令中的第一个,这些命令用于查找我感兴趣的列所在的位置,然后移动它们。 这个macros在我打算的工作表上完美运行。

我认为我最好的方法是通过命名活动工作簿来开始每个macros,然后将每个命令分解为工作簿级别,而不是从Worksheets,Range等开始。

任何人都可以帮助我理解当从personal.xls执行macros时VBA在想什么,以及如何最好地避免macros在该表本身上运行?

有两种方法可以采取。 我在我的代码中使用一个或两个 – 这不是一个或其他情况。

声明variables

首先在variables中定义要处理的每个工作表。 我通常留在表单层面,但这只是个人select。 如果你宁愿在工作簿级别,也没关系。 过程可能如下所示:

Dim shSource as Worksheet Dim shDest as Worksheet Set shSource = Workbooks("SomeBook").Worksheets(1) Set shDest = ActiveWorkbook.Worksheets("Summary") 

那么每当我引用一个范围或单元格或任何其他的工作表上,我用它的表单对象variables前言。 即使我需要到工作簿,我也从工作表开始。 例如,如果我需要closures上面例子中的Source工作簿,我会使用

 shSource.Parent.Close False 

我设置了我需要的表单variables,然后我所做的一切就是用这些variables来表示的。

编辑

如果你打开或创build工作簿,那么variables肯定是要走的路。 例如,如果打开工作簿,则可以使用这两个示例中的一个

 Dim wb As Workbook Set wb = Workbooks.Open(C:\...) Dim ws As Worksheet Set ws = Workbooks.Open("C:\...).Worksheets(1) 

或者创build新的,这两个例子之一:

 Dim wb As Workbook Set wb = Workbooks.Add Dim ws as Worksheet Set ws = Workbooks.Add.Worksheets(1) 

与块

当我只想一次做某件事情时,设置一堆variables似乎是一种浪费。 在这些情况下,我使用With Block,所以我仍然可以拥有完全限定的引用,但是在我的代码中没有一堆杂乱无章的东西。

 With Workbook("MyBook") With .Worksheets("First_Sheet") .Range("A1").Value = "stuff" End With With .Worksheets("Second_Sheet") .Range("G10").Formula = "=A1" End With End With 

我可能更喜欢variables方法,但我使用它们两个。

编辑2:隐式引用

你应该总是明确地引用你的工作簿和工作表,但是如果你不知道Excel的行为,它仍然是一个教学。 以Range("A1").Value = ...开始的一行代码, Range("A1").Value = ...被称为非限定参考。 您正在引用一个范围,但您并不是说它打开了哪个工作表或该工作表所在的工作簿。根据您的代码的位置,Excel会不同地处理不合格的引用。

在工作表类模块中(如使用表单事件(如SelectionChange)的地方),不合格的引用是指由该模块表示的工作表。 如果您处于Change事件中的Sheet1模块,并且代码为x = Range("G1").Value那么您所指的G1在Sheet1上。 在这种情况下,您应该使用Me关键字而不是依靠Excel。

在任何其他模块(如标准模块)中,非限定参考引用ActiveSheet。 相同的x = Range("G1").Value标准模块中的x = Range("G1").Value代码指的是在任何一张纸上都有焦点的情况下的G1。

Excel对不合格参考文献的处理非常可靠。 您可以轻松地依靠Excel来parsing合格的引用来创build可靠的代码。 但是你不应该。 如果您限定每个参考,您的代码将更具可读性,更易于debugging。 我限定每一个参考。 这不是我总是做的事情之一,除非我是懒惰的 – 我真的是100%的时间做的。