VBA EXCEL:在不同的工作簿上执行代码

时间:2014-11-18 10:10:19

标签: excel vba excel-vba

我有一个按钮,可执行以下操作:

  • 打开名为"导入"
  • 的文件
  • 导入时取消合并单元格
  • 如果单元格(k)为空,则复制单元格(k)上方的单元格值
  • 编辑包含日期的单元格的日期值。

每个子程序本身都是可用的,但将它们合并在一起会给我带来麻烦,可能是因为我正在尝试更改不同的工作簿,并且代码在初始工作簿上。

Sub LoadData_Click()
    WPath = "K:\Chain\"
    WName = "import.xls"
    Workbooks.Open Filename:=WPath & WName
    With Workbooks(WName).Sheets(1)
        .Columns("A:H").UnMerge
        Call DataManager
        Call DateRegulator
    End With
End Sub

Sub DataManager()
    Dim Counter As Long
    Counter = Application.WorksheetFunction.CountA(Range("B:B"))
    Dim r As Integer
    For r = 1 And 5 To 8
        For K = 1 To Counter
            If IsEmpty(Cells(K, r)) Then
               Cells(K, r) = Cells(K - 1, r)
            End If
        Next K
    Next r
End Sub

Sub DateRegulator()
    Dim Counter As Long
    Counter = Application.WorksheetFunction.CountA(Range("B:B"))
    For K = 2 To Counter
        Cells(K, 2) = DateSerial(Year(Now), Month(Cells(K, 2)), 1)
    Next K
End Sub

1 个答案:

答案 0 :(得分:1)

您的DataManagerDateRegulator子例程未明确指定他们正在处理的工作簿/工作表。只要你意识到他们会在任何一本书上工作,这都很好。工作表在被调用时处于活动状态。

所以我考虑的第一个改变是

With Workbooks(WName).Sheets(1)
    .Activate ' this makes sure the target workbook & worksheet are the active ones

更好的方法是将工作表作为参数传递给子程序。

您的代码中还有其他一些潜在问题需要解决......

CountA()仅计算非空单元格:如果列B有任何间隙,则不会处理工作表中具有非空值的所有行。如果B列永远没有间隙那么就可以了。

这一行:

For r = 1 And 5 To 8

不符合您的想法。那个And不允许你创建一个不相交的序列,如[1,5,6,7,8],它是一个布尔(真/假)运算符,所以它就像这样:

For r = (1 And 5) To 8

...评估为

For r = 1 To 8

假设我已经正确猜到了这个意图,那就行了:

Dim r As Variant
For Each r In Array(1, 5, 6, 7, 8)
    Debug.Print r ' replace with what you actually wanted to do here...
Next