【问题标题】:Improving the speed of a Loop's performance?提高循环性能的速度?
【发布时间】: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


【解决方案1】:

要在评论中写很多代码,但这里你去:

Private Sub CommandButton1_Click()

    With Workbooks.Open(Filename:="\\FILEPATH\Databases\Test 2.xlsm", Password:="Swarf").Sheets("MyTest2")
        .Unprotect "Swarf"
        .Range("F2:O2") = Application.Transpose(Sheet1.Range("K1:K10"))
        .Protect "Swarf"
        .Password = "Swarf"
        .Save
        .Close False
    End With
End Sub

不确定保护/密码的事情。

【讨论】:

  • 密码似乎给了我某种类型的错误,有什么解决办法吗?
  • 我刚刚稍微修改了你的代码,谢谢你的帮助
【解决方案2】:

这是 @Vincent G 答案稍作修改(我已接受他的答案)- 刚刚修复了我得到的密码错误,我现在正在使用此代码并且它工作完美!

留在这里以防其他人看到这篇文章并想知道每个人的建议的最终结果是什么,感谢所有贡献的人。

Private Sub CommandButton1_Click()

Dim y As Workbook

Application.ScreenUpdating = False

Set y = Workbooks.Open(Filename:="\\FILEPATH\Databases\Test 2.xlsm", Password:="Swarf")

    With y
        Sheets("MyTest2").Unprotect "Swarf"

        .Sheets("Mytest2").Range("F2:O2") = Application.Transpose(Sheet1.Range("K1:K10"))

        Password = "Swarf"
        .Save
        .Close False

    End With

Application.ScreenUpdating = True

End Sub

【讨论】:

    猜你喜欢
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2014-01-17
    • 1970-01-01
    • 2019-08-01
    • 2020-08-25
    • 1970-01-01
    相关资源
    最近更新 更多