none
『求救』用2010寫VBA,另一台電腦用2007開啟會LAG RRS feed

  • 問題

  • 我用2010的Excel寫完VBA程式,自己使用起來都沒問題

    給另外兩台電腦使用他們裝的是2007版本,使用起來都LAG很嚴重。

    是因為我的迴圈用了很多嗎?

    不過我想應該不是這個問題才對  (一皿一)

    2012年2月29日 上午 04:46

解答

  • 前面給你的連結就有說,不要使用 Select / Selection / ActiveXXXX 這類會拖效能的方法及物件。

    你只是從錄製的巨集去改寫,並不是看懂錄製的巨集後去重寫,所以你沒把錄製的巨集中,大量螢幕動作移除掉。

    螢幕動作會導致畫面重繪,電腦最大的效能瓶頸就在硬碟及螢幕。

    另外寫 VBA / VB6 的人要注意,適當的地方要加入 DoEvents 及呼叫 API Sleep 1 。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年3月2日 下午 01:18

所有回覆

  • 先看看一些既有討論,自行檢討:

    http://social.msdn.microsoft.com/Search/zh-TW/?query=805%20%E6%85%A2%20Excel&refinement=112&ac=8


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年2月29日 下午 03:38
  • 在我找到問題解決之前,我決定還是把所有的資訊PO上來

    我今天把office 2007裝進同一台電腦,我發現我的程式在2010跑 沒問題,但是在2007跑就會非常LAG

    而且我也已經把自動計算關閉了,結果還是超LAG,CPU資源吃到100%,記憶體吃到220,XXXKB

    這是我的介面

    計算週業績的程式碼如下

    Private Sub WeeklySalse_Click()
    Dim j, a, InputWeek, InputCells, SumIncome, InputAct, InputFcst As Integer
    Dim 總表客戶名稱, 總表狀態, 業績data客戶名稱 As String
    a = Worksheets("總表2012").Range("C2").End(xlDown).Row
    
    j = 5
    
    For g = 2 To a
        
            For i = 2 To a
            
            總表客戶名稱 = Worksheets("總表2012").Cells(i, "C").Value
            業績data客戶名稱 = Worksheets("業績Data").Cells(g, "A").Value
            總表狀態 = Worksheets("總表2012").Cells(i, "E").Value
                
                If 總表客戶名稱 = 業績data客戶名稱 Then '判斷公司名稱
                    
                    InputWeek = Mid(Worksheets("總表2012").Cells(i, "F"), 2, 2) '選定計算週期
                    
                    Select Case 總表狀態
                        Case Is = "Done"
                            If Mid(ComboBox1.Text, 2, 2) = InputWeek Then
                             InputAct = InputWeek * 2  '將計算週期 X 2=要輸入的業績欄位 ACT
                             Worksheets("運算區").Cells(i, "A").Value = Worksheets("總表2012").Cells(i, "L").Value '將資料複製到運算區以便做運算
                            
                             Worksheets("運算區").Select
                             SumIncom = WorksheetFunction.sum(Range(Cells(1, "A"), Cells(32767, "A"))) '將金額加總
                             
                             Worksheets("業績Data").Cells(g, InputAct).Value = SumIncom '將加總後的金額放入 當週的ACT欄位
                            
                              'MsgBox "運算區A " & i & " 欄 數值= " & Worksheets("總表2012").Cells(i, "L").Value & "J為 " & J
                                
                            End If
                        Case Else
                            If Mid(ComboBox1.Text, 2, 2) = InputWeek Then
                             InputFcst = (InputWeek * 2) + 1 '將計算週期 X 2=要輸入的業績欄位 FCST
                            
                             Worksheets("運算區").Cells(i, "B").Value = Worksheets("總表2012").Cells(i, "L").Value '將資料複製到運算區以便做運算
                            
                             Worksheets("運算區").Select
                             SumIncom = WorksheetFunction.sum(Range(Cells(1, "A"), Cells(32767, "B"))) '將金額加總
                             
                             Worksheets("業績Data").Cells(g, InputFcst).Value = SumIncom '將加總後的金額放入 當週的FCST欄位
                            
                              'MsgBox "運算區B " & i & " 欄 數值= " & Worksheets("總表2012").Cells(i, "L").Value & "J為 " & J
                                
                            End If
                            'SumIncom = WorksheetFunction.sum(Range(Cells(1, "A"), Cells(32767, "B"))) '將金額加總
                            'Worksheets("業績Data").Cells(G, InputFcst).Value = SumIncom
                            'Worksheets("業績Data").Cells(G, InputCells).Value = SumIncom '將加總後的金額放入 當週的FCST欄位
                    End Select
                    
                    
                    
                   
                End If
                
            Next i
        
        j = j + 1
        
        Worksheets("運算區").Range("A1:ZZ32767").Clear
        
    Next g
    Worksheets("業績Data").Select
    MsgBox ("業績已經寫入第 " & Mid(ComboBox1.Text, 2, 2) & " 週")
    Module1.將業績data資料填入
    
    End Sub

    '程式一啟動會先執行以下程式

    Private Sub UserForm_Activate() Dim CellEnd, YesNO As Integer Dim text1, text2, WW, income As String Module1.匯入週期 Worksheets("data").Select ComboBox1.RowSource = Range("E2:E53").Address '------------取消篩選------------- Worksheets("總表2012").Select Range("A1:ZZ1").Select Selection.AutoFilter '------------取消篩選------------- CellEnd = Worksheets("總表2012").Range("E2").End(xlDown).Row text1 = Worksheets("總表2012").Cells(CellEnd, "E") '狀態 text2 = Worksheets("總表2012").Cells(CellEnd, "C") '客戶 WW = Worksheets("總表2012").Cells(CellEnd, "F") '週期 income = Worksheets("總表2012").Cells(CellEnd, "L") '收入 'YesNO = MsgBox("請不要使用篩選以免程式出錯", vbYesNo, "正確請按(是) ") 'MsgBox YesNO If text1 = "Done" Then 'And YesNO = 6 Then Range(Cells(CellEnd + 1, "A"), Cells(CellEnd + 1, "AG")).Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove MsgBox ("最後一筆資料,公司名稱: " & text2 & " 狀態: " & text1 & " 第 " & CellEnd & " 欄,週期: " & WW & " 收入:" & income _ & vbNewLine & "因Status:Done 自動插入一行") Cells(CellEnd + 1, "C") = Cells(CellEnd, "C") Cells(CellEnd + 1, "E") = "WIP" Cells(CellEnd + 1, "F") = Cells(CellEnd, "F") Cells(CellEnd + 1, "G") = Cells(CellEnd, "G") Cells(CellEnd + 1, "H") = Cells(CellEnd, "H") Cells(CellEnd + 1, "I") = Cells(CellEnd, "I") Cells(CellEnd + 1, "L") = 0 Cells(CellEnd + 1, "I") = 0 Cells(CellEnd + 1, "J") = 0 ElseIf YesNO = 7 Then Unload Me Else MsgBox ("最後一筆資料,公司名稱: " & text2 & " 狀態: " & text1 & " 第 " & CellEnd & " 欄") End If End Sub




    2012年3月2日 上午 12:25
  • 前面給你的連結就有說,不要使用 Select / Selection / ActiveXXXX 這類會拖效能的方法及物件。

    你只是從錄製的巨集去改寫,並不是看懂錄製的巨集後去重寫,所以你沒把錄製的巨集中,大量螢幕動作移除掉。

    螢幕動作會導致畫面重繪,電腦最大的效能瓶頸就在硬碟及螢幕。

    另外寫 VBA / VB6 的人要注意,適當的地方要加入 DoEvents 及呼叫 API Sleep 1 。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年3月2日 下午 01:18
  • 如果是不同的 Excel 檔,可以改用 ADO 連 OLEDB 或 ODBC ,利用 SQL 語法來做匯總查詢,看你的迴圈,可能是配合 JOIN 跟 GROUP BY 吧~

    T.L. Cheng

    2012年3月10日 上午 04:05
    版主