iT邦幫忙

1

請求簡化VBA

  • 分享至 

  • twitterImage

VBA新手請求協助簡化, 我寫的內容會跑到當機, 公司電腦不夠力

Sub 效率總表G欄空白填上資料()
Application.ScreenUpdating = False
Dim i, j As Integer

For i = 2 To 32000
For j = 2 To 32000

If Worksheets("Page1").Cells(i, "G") = "" And Worksheets("Page1").Cells(i, "I") <> "全檢" _
And Worksheets("Page1").Cells(i, "F") = Worksheets("標準工時表").Cells(j, "F") Then
Worksheets("Page1").Cells(i, "G") = Worksheets("標準工時表").Cells(j, "K")
'Exit For
End If
Next
Next

Application.ScreenUpdating = True
End Sub

froce iT邦大師 1 級 ‧ 2019-03-28 16:58:24 檢舉
真的有3萬多筆?
有的話建議進資料庫或access來做了。
froce iT邦大師 1 級 ‧ 2019-03-28 17:00:32 檢舉
不過或許你可以先用vlookup查找來試試看
CalvinKuo iT邦大師 7 級 ‧ 2019-03-28 17:44:12 檢舉
筆數多要用x64版 Office.... 遇過User硬要把印象中5~6萬筆庫存明細帳匯入Excel, 最後只能在16G RAM Server裝x64 版Office才能不當機...
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
paicheng0111
iT邦大師 5 級 ‧ 2019-03-28 22:29:16

試試看,我覺得應該可以快很多。

Sub 效率總表G欄空白填上資料()
    Dim i as long, j As long
    dim a(2 to 32000, 0) as variant
    
    For i = 2 To 32000
        For j = 2 To 32000
            With Worksheets("Page1")
                If .Cells(i, "G") = "" And .Cells(i, "I") <> "全檢" _
And .Cells(i, "F") = Worksheets("標準工時表").Cells(j, "F") Then
                a(i, 0) = Worksheets("標準工時表").Cells(j, "K")
                End If
            end with
        Next j
    Next i
    
    worksheets("Page1").range("G2:G32000") = a
End Sub

giulian的程式再修改

先做If檢核,以避免落入J迴圈

Sub 效率總表G欄空白填上資料()
    Dim i as long, j As long
    Dim a(2 to 32000, 0) as variant
    
    With Worksheets("Page1")
        For i = 2 To 32000
            If .Cells(i, "G") = "" And .Cells(i, "I") <> "全檢" Then
                For j = 2 To 32000
                If .Cells(i, "F") = Worksheets("標準工時表").Cells(j, "F") Then
                    a(i, 0) = Worksheets("標準工時表").Cells(j, "K")
                End If
                Next j
            End if
        Next i
    
        .range("G2:G32000") = a
    End With
End Sub
giulian iT邦新手 4 級 ‧ 2019-03-30 07:50:45 檢舉

沒錯,簡單來說就是先篩出必要資料再進行後續處理

cmk520 iT邦新手 5 級 ‧ 2019-03-31 21:56:41 檢舉

二位前輩,我先將範圍縮小後測試上述兩個方式
但沒有跑出結果,想再請二位協助檢視一下,感謝

你可以用F8逐行執行來檢視

0
海綿寶寶
iT邦大神 1 級 ‧ 2019-03-29 10:41:18

不更動原始資料或程式設計架構的話
簡化的方法就是「Exit For」

不管原因或者合理性
單純就程式碼來看

要的是「符合條件的最後一筆」的資料
就沒必要從前面每筆找,每筆判斷,每筆換然後再被後面的蓋掉值
那就改成從後面找回來,一找到就結束

Sub 效率總表G欄空白填上資料()
    Application.ScreenUpdating = False
    Dim i, j As Integer

    For i = 2 To 32000
        For j = 32000 To 2 Step -1

            If Worksheets("Page1").Cells(i, "G") = "" And Worksheets("Page1").Cells(i, "I") <> "全檢" And Worksheets("Page1").Cells(i, "F") = Worksheets("標準工時表").Cells(j, "F") Then 
                Worksheets("Page1").Cells(i, "G") = Worksheets("標準工時表").Cells(j, "K")
                Exit For  '只要有值就離開這層迴圈
            End If
        Next
    Next

    Application.ScreenUpdating = True
End Sub

萬一要的是「符合條件的第一筆」的資料
那就改成

Sub 效率總表G欄空白填上資料()
    Application.ScreenUpdating = False
    Dim i, j As Integer

    For i = 2 To 32000
        For j = 2 To 32000

            If Worksheets("Page1").Cells(i, "G") = "" And Worksheets("Page1").Cells(i, "I") <> "全檢" And Worksheets("Page1").Cells(i, "F") = Worksheets("標準工時表").Cells(j, "F") Then 
                Worksheets("Page1").Cells(i, "G") = Worksheets("標準工時表").Cells(j, "K")
                Exit For  '只要有值就離開這層迴圈
            End If
        Next
    Next

    Application.ScreenUpdating = True
End Sub

原始程式迴圈總共要跑 32,000x32,000 = 1,024,000,000
10億次/images/emoticon/emoticon04.gif
一級戒備,膽子真大(Quote by 寒戰 保安局長陸明華)

提問者的程式原本有Exit For,但不知為何轉為註解了。

0
giulian
iT邦新手 4 級 ‧ 2019-03-29 11:01:46

其實你仔細思考細節就會知道怎麼做,借用pcw的代碼

Sub 效率總表G欄空白填上資料()
Dim i as long, j As long
dim a(2 to 32000, 0) as variant
dim G,I,F

For i = 2 To 32000
    這邊先設變數把這一輪要用到的丟進去,這樣做是避免每一輪都要重新讓應用程式再去找出這些資料
       G=Worksheets("Page1").Cells(i, "G")
       I=Worksheets("Page1").Cells(i, "I")
       F=Worksheets("Page1").Cells(i, "F") 
   
   For j = 2 To 32000
              這邊會建議先檢查一個關鍵的就好,不用每個都測,
              如果筆數少感覺不出來差別但你的狀況會差很多
              IF F= Worksheets("標準工時表").Cells(j, "F")  then
                  這裡在做最後判斷
                If G="" And I<> "全檢" And Then
                    a(i, 0) = Worksheets("標準工時表").Cells(j, "K")
                End If
              end if
    Next j
Next i

worksheets("Page1").range("G2:G32000") = a

End Sub

我要發表回答

立即登入回答