我有一个按钮,可执行以下操作:
每个子程序本身都是可用的,但将它们合并在一起会给我带来麻烦,可能是因为我正在尝试更改不同的工作簿,并且代码在初始工作簿上。
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
答案 0 :(得分:1)
您的DataManager
和DateRegulator
子例程未明确指定他们正在处理的工作簿/工作表。只要你意识到他们会在任何一本书上工作,这都很好。工作表在被调用时处于活动状态。
所以我考虑的第一个改变是
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