Board logo

標題: [發問] vba程式碼簡化 [打印本頁]

作者: 棋語鳥鳴    時間: 2021-9-8 14:29     標題: vba程式碼簡化

以下程式碼,目前小弟是以迴圈方式設計,當資料大時跑的速度有點久,不知有其有辦法再簡化或其他方式執行??
sub aa()
Dim sht As Worksheet
For mon = 1 To 12
Application.EnableEvents = False
            For Each sht In Worksheets           
                col = Sheets(mon & "月未結").Range("A1").End(xlToRight).Column               
                 r = Sheets(mon & "月未結").Range("AA1").Value
                For x = 7 To col
                             For y = 2 To r
                                       mony = Application.IfError(Application.VLookup(Sheets(mon & "月未結").Range("A" & y), Sheets("" & sht.Name).Range("A:U"), Application.Match(Sheets("" & sht.Name).Cells(1, x),
                                                          Sheets("" & sht.Name).Range("A1:U1"), 0), 0), "")
                                  Sheets(mon & "月未結").Cells(y, x) = mony
                                Next
                Next                                       
             End If
             Next
Application.EnableEvents = True     
Next mon
end sub
作者: samwang    時間: 2021-9-8 15:09

回復 1# 棋語鳥鳴


方便提供附件嗎? 謝謝
作者: ikboy    時間: 2021-9-9 10:31

看到代碼目前是直接處理儲存格,轉用陣列會快得多。
作者: 棋語鳥鳴    時間: 2021-9-10 09:51

回復 2# samwang


    [attach]34003[/attach]
檔案如附件,工作表的月份是隨機的,數據欄位會依實際情況新增或減少
作者: samwang    時間: 2021-9-10 11:32

回復 4# 棋語鳥鳴

請測試看看,謝謝

Sub test()
Dim Arr, xD, T$, R%, C%, i&, j&
Application.EnableEvents = False
Tm = Timer
Set xD = CreateObject("Scripting.Dictionary")
Arr = Range([資料來源!k1], [資料來源!a65536].End(3))
For i = 2 To UBound(Arr)
    xD(Arr(i, 1)) = 1
    For j = 2 To UBound(Arr, 2)
        xD(Arr(i, 1) & "_" & Arr(1, j)) = Arr(i, j)
    Next
Next
For Each sht In Worksheets
    If InStr(sht.Name, "月") Then
        With Sheets(sht.Name)
            R = .Range("a65536").End(3).Row
            C = .Cells(1, Columns.Count).End(xlToLeft).Column
            Arr = .Range(.[a1], .Cells(R, C))
            For i = 2 To UBound(Arr)
                If xD(Arr(i, 1)) = 1 Then
                    For j = 2 To C
                        Arr(i, j) = xD(Arr(i, 1) & "_" & Arr(1, j))
                    Next
                End If
            Next
            .Range("a1").Resize(R, C) = Arr
        End With
    End If
Next
MsgBox Timer - Tm
Application.EnableEvents = True
End Sub
作者: samwang    時間: 2021-9-10 11:54

本帖最後由 samwang 於 2021-9-10 11:56 編輯

回復 1# 棋語鳥鳴


當資料大時跑的速度有點久,不知有其有辦法再簡化或其他方式執行??
>>如#3 的ikboy大大說的轉用陣列會快得多,  #5 程式是用陣列+字典速度比較快,但無法比您的程式碼在簡化
如果要再簡化且速度快,可能需要其他大大協助,謝謝。

作者: 棋語鳥鳴    時間: 2021-9-10 13:07

回復 5# samwang


測試功能正常,看來我也要好好學學如何使用陣列了
感謝大大
作者: linyancheng    時間: 2021-9-10 16:24

回復 6# samwang


    沒必要簡化,效率比較重要,有時候簡化反而效率降低!




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)