我正在努力使一个代码在工作簿的所有工作表上运行一个for循环。我试着只为一个选项卡实现这个任务,但它还是有效的。下面是代码,你可以看一下。
Sub testing()
Dim LandedCost As Range
Dim UnitSell As Range
Dim TotalUnitPrice As Range
Dim Profit As Range
Dim tier2 As Range
Dim Mtrs As Range
Dim NetProfit As Range
Dim last_row As Long
Dim first_col As Range
Dim last_col As Range
Dim last_col_cur As Range
y = ThisWorkbook.Sheets.Count
For i = 2 To y
Sheets(2).Range("N3").Select
Selection.Copy
Set LandedCost = Sheets(i).Range("A1:K1").Find("Landed Cost")
Set UnitSell = Sheets(i).Range("A1:K1").Find("Unit Sell")
Set TotalUnitPrice = Sheets(i).Range("A1:K1").Find("Total Unit Price")
Set Profit = Sheets(i).Range("A1:K1").Find("Profit")
Set tier2 = Sheets(i).Range("A1:K1").Find("TIER-2")
Set NetProfit = Sheets(i).Range("A1:K1").Find("Net Profit")
Set Mtrs = Sheets(i).Range("A1:K1").Find("Unit Price-Ref Mtrs")
'first_col = LandedCost.Column
'last_col = TotalUnitPrice.Column
'last_row = Cells(Rows.Count, 1).End(xlUp).Row
'last_col_cur = Cells(4, Columns.Count).End(xlToLeft).Column - 1 'for currency'
If Not IsNull(TotalUnitPrice) Then Sheets(i).Range(Cells(LandedCost.End(xlDown).Row,LandedCost.Column),Cells(Cells(Rows.Count, 1).End(xlUp).Row, TotalUnitPrice.Column)).Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide, SkipBlanks _
:=False, Transpose:=False
Application.Union(Columns(LandedCost.Column), Columns(UnitSell.Column), Columns(TotalUnitPrice.Column)).Select
Application.CutCopyMode = False
Selection.NumberFormat = "[$$-en-US]#,##0.00"
Dim cell As Range
For Each cell In Sheets(i).Range(Cells(1, LandedCost.Column), Cells(Cells(Rows.Count, 1).End(xlUp).Row, TotalUnitPrice.Column))
If cell = 0 Then cell.ClearContents
Next cell
ElseIf Not IsNull(UnitSell) Then
Sheets(i).Range(Cells(LandedCost.End(xlDown).Row, LandedCost.Column), Cells(Cells(Rows.Count, 1).End(xlUp).Row + 20, UnitSell.Column)).Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide, SkipBlanks _
:=False, Transpose:=False
Application.Union(Columns(LandedCost.Column), Columns(UnitSell.Column)).Select
Application.CutCopyMode = False
Selection.NumberFormat = "[$$-en-US]#,##0.00"
For Each cell In Sheets(i).Range(Cells(1, LandedCost.Column), Cells(Cells(Rows.Count, 1).End(xlUp).Row, UnitSell.Column))
If cell = 0 Then cell.ClearContents
Next cell
ElseIf Not IsNull(tier2) Then
Sheets(i).Range(Cells(LandedCost.End(xlDown).Row, LandedCost.Column), Cells(Cells(Rows.Count, 1).End(xlUp).Row + 20, tier2.Column)).Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide, SkipBlanks _
:=False, Transpose:=False
Application.Union(Columns(LandedCost.Column), Columns(UnitSell.Column), Columns(tier2.Column)).Select
Application.CutCopyMode = False
Selection.NumberFormat = "[$$-en-US]#,##0.00"
For Each cell In Sheets(i).Range(Cells(1, LandedCost.Column), Cells(Cells(Rows.Count, 1).End(xlUp).Row, tier2.Column))
If cell = 0 Then cell.ClearContents
Next cell
ElseIf Not IsNull(Mtrs) Then
Sheets(i).Range(Cells(LandedCost.End(xlDown).Row, LandedCost.Column), Cells(Cells(Rows.Count, 1).End(xlUp).Row + 20, Mtrs.Column)).Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide, SkipBlanks _
:=False, Transpose:=False
Application.Union(Columns(LandedCost.Column), Columns(UnitSell.Column), Columns(Mtrs.Column)).Select
Application.CutCopyMode = False
Selection.NumberFormat = "[$$-en-US]#,##0.00"
For Each cell In Sheets(i).Range(Cells(1, LandedCost.Column), Cells(Cells(Rows.Count, 1).End(xlUp).Row, Mtrs.Column))
If cell = 0 Then cell.ClearContents
Next cell
End If
If Not IsNull(Profit) Then
Columns(Profit.Column).Select
Selection.NumberFormat = "[$$-en-US]#,##0.00"
ElseIf Not IsNull(NetProfit) Then
Columns(NetProfit.Column).Select
Selection.NumberFormat = "[$$-en-US]#,##0.00"
End If
Next i
End Sub
我得到的错误一样,我没有设置必要的变量,我需要激活工作簿的范围。选择工作,甚至我没有声明变量。虽然,对于所有这些我已经这样做,它的工作为一个单一的标签。这里的代码,让你可以看看。
正如你所看到的,我最初定义了带注解的变量,并在if语句中使用了这些变量,但即使是这些变量,我仍然会得到错误。
1条答案
按热度按时间i2loujxw1#
尽量避免在VBA中使用
.Select
,因为它通常会导致更多的问题。通常,当人们使用Select
时,他们希望获得一个Range
对象。尽管许多VBA的方法实际上返回一个Range
对象。在下面的代码中,我重写了第一个
If
语句,使其只使用Range
对象,而不使用Select
另一个注意事项是,将所有粘贴和清除的内容放在一个单独的
Sub()
中,这样您就可以简单地调用该子函数,而不是在所有If...else
语句中重复所有相同的-令人困惑的-代码。此外-我相信您已经开始这样做了-减少
Cells(<some long code>, <some other long code>)
语句的数量,并在处理之前将这些Integer/Long
值设置为变量,这将使您的代码更加清晰,并且更容易将粘贴和格式化操作分离到单独的Sub()
中看看下面的工作;
编辑
你的代码,但重构(虽然可以说没有测试,因为我没有你的数据)