Vba 在行上循环并将值复制到外部文件(按单元格值索引的工作表)
我是VBA的新手,对于这个基本问题我很抱歉。我需要创建一个循环,在每个迭代中脚本:Vba 在行上循环并将值复制到外部文件(按单元格值索引的工作表),vba,excel,for-loop,Vba,Excel,For Loop,我是VBA的新手,对于这个基本问题我很抱歉。我需要创建一个循环,在每个迭代中脚本: 将Wb1的O6:AA6复制到同一工作簿的O1:AA1中 将列B:E复制到Wb1的N6中名为“DGP1”的表中的Wb2 重复上述两个步骤:将O7:AA7复制到O1:AA1,将B:E复制到Wb2(图纸名称由Wb1的N7中包含的值给出,如“DGP2”) 我编写的代码虽然没有实现循环,也没有引用N6、N7中的值,但至少执行了我需要的计算。定义了两个工作簿后,它包括: Wb1.Activate Range("O6:
Wb1
的O6:AA6复制到同一工作簿的O1:AA1中Wb1
的N6
中名为“DGP1”的表中的Wb2
Wb2
(图纸名称由Wb1
的N7
中包含的值给出,如“DGP2”)N6、N7
中的值,但至少执行了我需要的计算。定义了两个工作簿后,它包括:
Wb1.Activate
Range("O6:AA6").copy
Range("O1:AA1").PasteSpecial
Columns("B:E").copy
Wb2.Activate
Sheets("DGP1").Select
Selection.PasteSpecial Paste:=xlPasteValues
Wb1.Activate
Range("O7:AA7").copy
Range("O1:AA1").PasteSpecial
Columns("B:E").copy
Wb2.Activate
Sheets("DGP2").Select
Selection.PasteSpecial Paste:=xlPasteValues
实际上,我有更多的行要复制粘贴,我需要通过N6、N7、…
中的条目引用最终的工作表名称
谢谢你的建议
斯特凡诺这是一个好的开始;下面是一些编写宏的技巧,这些技巧将帮助您开始工作,但也会改进您的代码
Range("O6:AA6").copy
Range("O1:AA1").PasteSpecial
你可以做
Range("O1:AA1") = Range("O6:AA6").Value
Wb1.Sheets("Sheet1").Range("O1:AA1") = Wb1.Range("O6:AA6").Value
Wb2.Sheets("DGP1").Columns("B:E") = Wb1.Sheets("Sheet1").Columns("B:E").Value
Wb1
的第1页上,您可以
Range("O1:AA1") = Range("O6:AA6").Value
Wb1.Sheets("Sheet1").Range("O1:AA1") = Wb1.Range("O6:AA6").Value
Wb2.Sheets("DGP1").Columns("B:E") = Wb1.Sheets("Sheet1").Columns("B:E").Value
For
循环,可以设置变量并建立范围
给定递增变量的字符串。例如,您可以设置
变量x
等于6,并增加所需的次数
(假设5到10次)
Wb1.Sheets(“Sheet1”)。范围(“N6”)。值等于“DPG1”,即
Wb1
的sheet 1
上的N6
中的值。再加上
循环,则最终代码如下所示
for x = 6 to 10
Wb1.Sheets("Sheet1").Range("O1:AA1") = _
Wb1.Range("O" & x & ":AA" & x).Value
Wb2.Sheets(Wb1.Sheets("Sheet1").Range("N" & x).Value).Columns("B:E") = _
Wb1.Sheets("Sheet1").Columns("B:E").Value
next x
伟大的非常感谢,这非常清楚地涵盖了整个问题。就效率而言,Stefanoj只是一个好奇心。正如您正确地说的,通常在每次Excel操作时激活工作表不是一个好主意。然而,在我以前的代码(没有循环)中,10个DGP的复制粘贴操作花费了大约2秒,现在几乎是13秒。你认为这和工作表激活有关吗?(对我来说答案是“否”,但正如我所说,我对VBA了解不多。)也可能是因为您正在更新整列数据,即
Wb1.Sheets(“Sheet1”)。columns(“B:e”)。Value
。根据您拥有的excel版本,更新的行数可能至少为65536行*4列(excel 2007及更高版本的更多),需要更新的单元格数量很多。最好选择有限的单元格区域,例如Wb1.Sheets(“Sheet1”)。范围(“B1:E5000”)。值
Sub SO_19646599()
Dim oWB1 As Workbook, oWB2 As Workbook
Dim oWS1 As Worksheet, oWS2 As Worksheet
Dim oRngRef As Range, oRng1 As Range, oRng2 As Range
Dim sTmp As String, iOffset As Long, iErr As Long, sErr As String
' Source Workbook and Worksheet (assumed already open)
Set oWB1 = Workbooks("Wb1")
Set oWS1 = oWB1.Worksheets("Sheet1") ' Assuming Sheet1
' Target Workbook (assumed already open)
Set oWB2 = Workbooks("Wb2")
' Reference range to start
Set oRngRef = oWS1.Range("N6")
' Offset counter
iOffset = 0
' Loop until oRngRef is an empty cell
Do Until IsEmpty(oRngRef)
' Copy O6:AA6 to O1:AA1 in Wb1 (assuming Sheet1), with row offset
Set oRng1 = oWS1.Range("O6:AA6").Offset(iOffset, 0)
Set oRng2 = oWS1.Range("O1:AA1").Offset(iOffset, 0)
oRng1.Copy Destination:=oRng2
' Get reference to Worksheet in Wb2 by the value contained in N6 of Wb1 (assumed Sheet1), with row offset
sTmp = oRngRef.Value
Set oWS2 = oWB2.Worksheets(sTmp)
If oWS2 Is Nothing Then
iErr = iErr + 1
sErr = sErr & iErr & vbTab & "No such """ & sTmp & """ worksheet (" & oRngRef.Address & ") in " & oWB2.Name & vbCrLf
Else
' copies the columns B:E from Wb1 (Sheet1) to Wb2 (Sheet name as N6)
oWS1.Columns("B:E").Copy Destination:=oWS2.Columns("B:E")
End If
iOffset = iOffset + 1
' Update Reference range
Set oRngRef = oWS1.Range("N6").Offset(iOffset, 0)
Loop
If iErr > 0 Then
Debug.Print sErr
MsgBox iErr & " errors occurred, please review Immediate window." & vbCrLf & vbCrLf & sErr
End If
' Cleanup
Set oWS2 = Nothing
Set oWB2 = Nothing
Set oWS1 = Nothing
Set oWB1 = Nothing
End Sub