[英]Excel VBA: How to use changing cell values in For Each statement?
因此,我構建了以下宏,幾乎可以捕獲其需要執行的操作。 它從一張sheet3復制數據,然后將數據粘貼到sheet1中。 之后,它將用sheet2中找到的值替換變量1-7。
當它在一行中執行時,宏工作得很好。 但是,我希望它遍歷Sheet2中所有填充的行,並用Sheet2中的相應行值替換變量。
希望在這里找到答案,因為我是VBA的新手,還沒有找到答案。
Sub Macro1()
For Each c In Sheets("Sheet2").Range("A2:G13").Rows
Sheets("Sheet3").Activate
Range("A1:AH125").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Sheet1").Activate
lMaxRows = Cells(Rows.Count, "A").End(xlUp).row
Range("A" & lMaxRows + 1).Select
ActiveSheet.Paste
Selection.Replace What:="Variable1", Replacement:=Sheets("Sheet2").Range("A").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="Variable2", Replacement:=Sheets("Sheet2").Range("B").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="Variable3", Replacement:=Sheets("Sheet2").Range("C").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="Variable4", Replacement:=Sheets("Sheet2").Range("D").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="Variable5", Replacement:=Sheets("Sheet2").Range("E").Value, LookAt:= _
xlPart, SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="Variable6", Replacement:=Sheets("Sheet2").Range("F").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="Variable7", Replacement:=Sheets("Sheet2").Range("G").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
Next
End Sub
您顯然已經使用宏記錄器創建了此宏。 在嘗試理解新語句的語法時,這是一個不錯的起點。 但是,宏記錄器不知道您的目標,而是將每個小步驟記錄為一條語句。 在嘗試圍繞它們進行循環之前,有必要整理並合並這些語句。
考慮:
Sheets("Sheet3").Activate
Range("A1:AH125").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Sheet1").Activate
lMaxRows = Cells(Rows.Count, "A").End(xlUp).row
Range("A" & lMaxRows + 1).Select
ActiveSheet.Paste
我可以將其替換為:
lMaxRows = Cells(Rows.Count, "A").End(xlUp).Row
Sheets("Sheet3").Range("A1:AH125").Copy _
Destination:=Sheets("Sheet1").Range("A" & lMaxRows + 1)
我保留了用於計算lMaxRows
的語句,但是將所有其他語句替換為一個Copy
語句。 該語句的語法為:
SourceRange.Copy Destination:=TopLeftCellOfDestination
Destination:=
是可選的,但有助於使語法更清晰。
我尚未切換工作表或未選擇任何內容。 這個VBA更快,一旦掌握了語法,就更容易理解VBA在做什么。
現在考慮:
Selection.Replace What:="Variable1", Replacement:=Sheets("Sheet2").Range("A").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
Selection
必須走,因為我還沒有選擇任何東西。 但是真正的問題是:
Sheets("Sheet2").Range("A").Value
這是無效的VBA,並且確實包含For變量c
。
正確的對象是:
c.Columns("A").Value
c
是例如A2:G2
或A13:G13
。 我已經選擇了范圍A列來給我A2
或A13
。 然后,我就采用了該單元格的價值。
要替換我在此Replace
塊外面放置的With
語句的Selection
,以給出下面的代碼,我相信它可以滿足您的要求:
Sub Macro1()
For Each c In Sheets("Sheet2").Range("A2:G13").Rows
lMaxRows = Cells(Rows.Count, "A").End(xlUp).Row
Sheets("Sheet3").Range("A1:AH125").Copy _
Destination:=Sheets("Sheet1").Range("A" & lMaxRows + 1)
With Worksheets("Sheet1")
With .Range(.Cells(lMaxRows + 1, "A"), .Cells(lMaxRows + 126, "AH"))
.Replace What:="Variable1", Replacement:=c.Columns("A").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
.Replace What:="Variable2", Replacement:=c.Columns("B").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
.Replace What:="Variable3", Replacement:=c.Columns("C").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
.Replace What:="Variable4", Replacement:=c.Columns("D").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
.Replace What:="Variable5", Replacement:=c.Columns("E").Value, LookAt:= _
xlPart, SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
.Replace What:="Variable6", Replacement:=c.Columns("F").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
.Replace What:="Variable7", Replacement:=c.Columns("G").Value, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
End With
End With
Next
End Sub
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.