使用personal.xls中的宏时的VBA逻辑

时间:2014-01-04 16:36:31

标签: excel vba excel-vba

我运行的电子表格报告可容纳大约50列数据,适用于1到5000行。我只对4列感兴趣,但它们永远不会在同一位置,因为这些报告的设置对于每个客户端来说有点不同。然后我将这4列并粘贴到一个新的工作簿中,我可以将其导入另一个程序。

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

宏的某些部分运行到我打算从中导出的工作表,而其他部分则作用于personal.xls文件本身。这让我感到困惑,因为我没有任何使用'thisworkbook'或'activeworksheet'等命令的行。

例如: - 第一行编码为重命名Sheet1。宏在personal.xls中重命名Sheet1 - 下一行是四个Find命令中的第一个,它们定位我感兴趣的列所在的位置,然后移动它们。这个宏在我想要的表格上完美运行。

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

任何人都可以帮助我了解VBA在从personal.xls执行宏时的想法以及如何最好地避免在该表上运行宏吗?

1 个答案:

答案 0 :(得分:2)

您可以采取两种方法。我在我的代码中使用了一个或两个 - 它不是一个或其他情况。

声明变量

首先定义要在变量中处理的每个工作表。我通常保持在表单级别,但这只是个人选择。如果您更愿意处于工作簿级别,那也没关系。程序可能如下所示:

Dim shSource as Worksheet
Dim shDest as Worksheet

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

然后每当我引用一个范围或单元格或工作表上的任何其他内容时,我就会在该工作表对象变量前面加上它。即使我需要访问工作簿,我也从表单开始。例如,如果我需要关闭上面示例中的Source工作簿,我会使用

shSource.Parent.Close False

我设置了我需要的工作表变量,然后我所做的一切都是根据这些变量。

修改

如果您正在打开或创建工作簿,那么变量绝对是可行的方法。例如,如果您要打开工作簿,则可以使用这两个示例中的一个

Dim wb As Workbook
Set wb = Workbooks.Open(C:\...)

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

或创建新的,这两个例子中的一个:

Dim wb As Workbook
Set wb = Workbooks.Add

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

使用块

当我只想尝试一次时,设置一堆变量似乎是浪费。在这些情况下,我使用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

我可能更喜欢变量方法,但我同时使用它们。

编辑2:隐式引用

您应该始终明确地引用您的工作簿和工作表,但如果您不这样做,那么知道Excel的行为方式仍然是指导性的。以Range("A1").Value = ...开头的一行代码称为非限定引用。您正在引用一个范围,但您没有说明它所在的工作表或该工作表所在的工作簿.Excel根据代码的位置以不同方式处理不合格的引用。

在Sheet的类模块中(类似于使用诸如SelectionChange之类的工作表事件的地方),非限定引用会引用该模块表示的工作表。如果你在Sheet1模块中工作在Change事件中,并且你编码x = Range("G1").Value,那么你所指的G1就在Sheet1上。在这种情况下,您应该使用Me关键字而不是依赖Excel。

在任何其他模块(如标准模块)中,非限定引用引用ActiveSheet。标准模块中的相同x = Range("G1").Value代码在任何具有焦点的工作表上都指G1。

Excel对不合格参考文献的处理非常可靠。您可以依靠Excel来解析限定引用,从而轻松创建健壮的代码。但你不应该。如果您符合每个参考资料,您的代码将更易读并且更容易调试。我限定了每一个参考资料。这不是我“永远”做的事情之一,除非我很懒惰 - 我真的百分之百地做。