【发布时间】:2019-12-04 15:48:05
【问题描述】:
我目前需要工作簿,Test 1(编写代码的第一个工作簿的名称)和 Test 2(其中值从 测试 1)。我当前的代码从 Test 1 工作簿中获取 Rows K1-K10 (Column 11, Rows 1-10) 的值并将它们粘贴到 Columns F2-P2 (第 2 行,第 6-16 列)测试 2 工作簿(第一个代码正在运行)。
我试图让这个代码运行得更快,因为当我将它用于我的其他应用程序时,我觉得循环让它变得迟钝和迟缓。我正在尝试将 Do (While) Loop 替换为 Double (For) Loop 语句 。如果您有任何建议,请告诉我,因为我的 双 (For) 循环 没有将任何值粘贴到 Test 2 工作簿中(以及如何我要测量每个函数运行所需的时间吗)。
以下是代码和屏幕截图以及视觉辅助:
Private Sub CommandButton1_Click()
Dim y As Workbook
Dim i As Integer
Dim j As Integer
i = 6
j = 1
Set y = Workbooks.Open(Filename:="\\FILEPATH\Databases\Test 2.xlsm", Password:="Swarf")
With y
Do While j <= 11
If (Cells(j, 11).Value <> "") Then
.Sheets("MyTest2").Unprotect "Swarf"
.Sheets("Mytest2").Cells(2, i).Value = Sheet1.Cells(j, 11).Value
End If
i = i + 1
j = j + 1
Loop
.Password = "Swarf"
.Save
.Close False
End With
End Sub
这是我在双 (for) 循环中尝试的代码:
Private Sub CommandButton1_Click()
Dim y As Workbook
Dim i As Integer
Dim j As Integer
Set y = Workbooks.Open(Filename:="\\FILEPATH\Databases\Test 2.xlsm", Password:="Swarf")
With y
For i = 6 To 16
For j = 1 To 10
If (Cells(i, 11).Value <> "") Then
.Sheets("MyTest2").Unprotect "Swarf"
.Sheets("Mytest2").Cells(2, i).Value = Sheet1.Cells(j, 11).Value
End If
Next j
Next i
.Password = "Swarf"
.Save
.Close False
End With
End Sub
【问题讨论】:
-
您只需解除对工作表的保护一次。在循环外执行。如果您的代码有效并且您只是想改进它,那么这个问题可能更适合codereview.stackexchange.com
-
你只是在转置值吗?如果是这样,则根本不需要任何循环。
-
Range
K1-K10包含 10 个单元格,您将它们粘贴到范围F2-P2,即 11 个单元格...无论如何,您为什么不直接复制 10/11 值然后粘贴他们转置到单元格F2? -
如果你想要更快,不要逐个单元格复制数据,而是按块复制它们。
-
@Handreen
.Sheets("MyTest2").Unprotect "Swarf"开头的.表示它被With语句引用,因此它需要紧跟在With之后。
标签: excel vba loops for-loop do-loops