Cải tiến Code bị chạy chậm

Liên hệ QC

Ngô Trường

Thành viên mới
Tham gia
25/8/20
Bài viết
3
Được thích
0
Các bác giúp e với, e mới học lập trình VBA, đang có cái job của công ty và gặp 1 vài vấn đề như này:
1 - e đã cải tiến code và còn như sau nhưng vẫn muốn nó nhanh hơn. Các bác giúp e xem e có thể cải tiến thêm mục nào nữa để nó có thể nhanh hơn được k với ạ.
2 - Khi mở ở máy e đang làm và chạy chương trình thì e đo time khoảng 5-6s nhưng khi mở ở máy người khác thì có máy 14-15s có máy 24-25s thì có cách nào khắc phục được k ạ?
3- Trong chương trình của e có đặt password cho phần VBA, khi chạy code mở userform lên thì khi tắt chương trình đi và lưu lại thì nó cứ bị hiện cái bảng nhập password của VBA lên và phải ấn cancel để tắt hẳn, e đã tìm hiểu mà k biết phải khắc phục như nào
Mong các bác xem giúp e ạ, e gửi 1 Sub chạy gây mất thời gian nhất trong chương trình mong các bác có thể giúp! Cảm ơn các bác đã xem!
 

File đính kèm

  • code.txt
    4.8 KB · Đọc: 21
Các bác giúp e với, e mới học lập trình VBA, đang có cái job của công ty và gặp 1 vài vấn đề như này:
1 - e đã cải tiến code và còn như sau nhưng vẫn muốn nó nhanh hơn. Các bác giúp e xem e có thể cải tiến thêm mục nào nữa để nó có thể nhanh hơn được k với ạ.
2 - Khi mở ở máy e đang làm và chạy chương trình thì e đo time khoảng 5-6s nhưng khi mở ở máy người khác thì có máy 14-15s có máy 24-25s thì có cách nào khắc phục được k ạ?
3- Trong chương trình của e có đặt password cho phần VBA, khi chạy code mở userform lên thì khi tắt chương trình đi và lưu lại thì nó cứ bị hiện cái bảng nhập password của VBA lên và phải ấn cancel để tắt hẳn, e đã tìm hiểu mà k biết phải khắc phục như nào
Mong các bác xem giúp e ạ, e gửi 1 Sub chạy gây mất thời gian nhất trong chương trình mong các bác có thể giúp! Cảm ơn các bác đã xem!
Bác phải gửi cả file nữa. chứ nhìn code thế kia biết làm thế nào
 
Upvote 0
Bác phải gửi cả file nữa. chứ nhìn code thế kia biết làm thế nào
Tôi thì đọc cái mớ tiếng viết tắt, tiếng Tây mệt quá. Chạy.
Vả lại, code tiêu chuẩn mới là nghề của tôi. Còn tăng tốc thì không phải. Có nhiều bạn khác giỏi hơn.
 
Upvote 0
Bác phải gửi cả file nữa. chứ nhìn code thế kia biết làm thế nào
Đúng nhìn code với tên biết nhức đầu :D
Trong này có một số ý bạn xem thử cải thiện thêm. Muốn cải thiện thì người ta phải hiểu ý bạn đang làm mới đưa ra tư vấn được, còn nhìn code vầy thì bói mù xem voi thôi.
Một số góp ý bạn có xem:
Tăng tốc cho code VBA của bạn
Về tốc độ xử lý của hàm Select Case trong VBA
Mình đoán cái khúc mà bạn bị chậm
PHP:
            For for_DevT = 0 To for_DevT_loop Step 1

                Sheets(i).Select

                Sheets(i).Range(Cells(4 + temp_point, c), Cells(point_copy - temp_point + 3, c + 1)).Copy

                firstPaste = WorksheetFunction.CountA(Scomment.Range("A:A")) + 1
                
                Scomment.Cells(firstPaste, 1).PasteSpecial xlPasteValues

                Scomment.Select
                
                lastRow = WorksheetFunction.CountA(Scomment.Range("A:A"))

                Set RangePaste = Scomment.Range(Cells(firstPaste, 1), Cells(lastRow, 1))

                For Each CellsPaste In RangePaste
                    CellsPaste.Value = symbol(j) & CellsPaste.Value
                Next

                temp_point = temp_point + 100
                point_copy = point_copy + 200
            Next for_DevT
 
Upvote 0
Các bác giúp e với, e mới học lập trình VBA, đang có cái job của công ty và gặp 1 vài vấn đề như này:
1 - e đã cải tiến code và còn như sau nhưng vẫn muốn nó nhanh hơn. Các bác giúp e xem e có thể cải tiến thêm mục nào nữa để nó có thể nhanh hơn được k với ạ.
2 - Khi mở ở máy e đang làm và chạy chương trình thì e đo time khoảng 5-6s nhưng khi mở ở máy người khác thì có máy 14-15s có máy 24-25s thì có cách nào khắc phục được k ạ?
3- Trong chương trình của e có đặt password cho phần VBA, khi chạy code mở userform lên thì khi tắt chương trình đi và lưu lại thì nó cứ bị hiện cái bảng nhập password của VBA lên và phải ấn cancel để tắt hẳn, e đã tìm hiểu mà k biết phải khắc phục như nào
Mong các bác xem giúp e ạ, e gửi 1 Sub chạy gây mất thời gian nhất trong chương trình mong các bác có thể giúp! Cảm ơn các bác đã xem!
Nghiên cứu mảng.Đừng thực hiện trên bảng excel như vậy mỗi lần nó copy 1 cái là excel nó lại phải tính toàn lại toàn bộ dữ liệu.
 
Upvote 0
Hi vọng thớt đọc bài này rồi sửa bài viết nếu còn muốn mọi người hỗ trợ @Ngô Trường
Dạ nó là 1 project to to nên e k gửi được cả file do cũng liên quan đến công ty, e cũng muốn hỏi mọi người về cấu trúc nên k nghĩ là mấy cái viết tắt làm mọi người khó chịu vậy
Bài đã được tự động gộp:

Đúng nhìn code với tên biết nhức đầu :D
Trong này có một số ý bạn xem thử cải thiện thêm. Muốn cải thiện thì người ta phải hiểu ý bạn đang làm mới đưa ra tư vấn được, còn nhìn code vầy thì bói mù xem voi thôi.
Một số góp ý bạn có xem:
Tăng tốc cho code VBA của bạn
Về tốc độ xử lý của hàm Select Case trong VBA
Mình đoán cái khúc mà bạn bị chậm
PHP:
            For for_DevT = 0 To for_DevT_loop Step 1

                Sheets(i).Select

                Sheets(i).Range(Cells(4 + temp_point, c), Cells(point_copy - temp_point + 3, c + 1)).Copy

                firstPaste = WorksheetFunction.CountA(Scomment.Range("A:A")) + 1
               
                Scomment.Cells(firstPaste, 1).PasteSpecial xlPasteValues

                Scomment.Select
               
                lastRow = WorksheetFunction.CountA(Scomment.Range("A:A"))

                Set RangePaste = Scomment.Range(Cells(firstPaste, 1), Cells(lastRow, 1))

                For Each CellsPaste In RangePaste
                    CellsPaste.Value = symbol(j) & CellsPaste.Value
                Next

                temp_point = temp_point + 100
                point_copy = point_copy + 200
            Next for_DevT
cảm ơn bác, đoạn này có bỏ đi thì nó cũng k tăng thời gian lắm, để e làm thử theo bác bên dưới bảo dùng theo mảng xem sao
Bài đã được tự động gộp:

Nghiên cứu mảng.Đừng thực hiện trên bảng excel như vậy mỗi lần nó copy 1 cái là excel nó lại phải tính toàn lại toàn bộ dữ liệu.
để e nghiên cứu dùng theo mảng xem có nhanh hơn k, cảm ơn bác
 
Upvote 0
Dạ nó là 1 project to to nên ...
Đã muốn làm đồ án to thì phải biết giao thiệp, chịu khó viết từ ngữ cho rõ rệt. Bạn không biết mình đã mất gì khi cố tình giữ thái độ.
Tuy GPE có rất nhiều tay code giỏi, giỏi hơn tôi nhiều. Nhưng số người có kinh nghiệm với đồ án không nhiều đâu.
 
Upvote 0
Các bác giúp e với, e mới học lập trình VBA, đang có cái job của công ty và gặp 1 vài vấn đề như này:
1 - e đã cải tiến code và còn như sau nhưng vẫn muốn nó nhanh hơn. Các bác giúp e xem e có thể cải tiến thêm mục nào nữa để nó có thể nhanh hơn được k với ạ.
2 - Khi mở ở máy e đang làm và chạy chương trình thì e đo time khoảng 5-6s nhưng khi mở ở máy người khác thì có máy 14-15s có máy 24-25s thì có cách nào khắc phục được k ạ?
3- Trong chương trình của e có đặt password cho phần VBA, khi chạy code mở userform lên thì khi tắt chương trình đi và lưu lại thì nó cứ bị hiện cái bảng nhập password của VBA lên và phải ấn cancel để tắt hẳn, e đã tìm hiểu mà k biết phải khắc phục như nào
Mong các bác xem giúp e ạ, e gửi 1 Sub chạy gây mất thời gian nhất trong chương trình mong các bác có thể giúp! Cảm ơn các bác đã xem!
Chỉnh tàm tạm hy vong chạy được
Mã:
Sub Find_Comment()
    Dim i, j, c As Integer
    Dim firstPaste, lastRow As Long
    Dim for_sheet, for_sheet_loop As Integer
    Dim for_Device, for_Device_Loop As Integer
    Dim for_time, for_time_loop As Integer
    Dim for_DevT, for_DevT_loop As Integer
    Dim point_copy, temp_point As Integer
    Dim CellsPaste, RangePaste As Range
    Dim symbol()

  symbol() = Array("M", "T", "D", "ZR", "L")
  for_sheet_loop = 18
  point_copy = 5000
  For for_sheet = 10 To for_sheet_loop Step 1
    i = for_sheet - 9 '****
    Select Case for_sheet
        Case 10 'sheet1 - Test
              for_Device_Loop = 2
              for_time_loop = 0
        Case 11 'sheet2 - Init
              for_Device_Loop = 4
              for_time_loop = 1
        Case 12 'sheet3 - Auto
              for_Device_Loop = 2
              for_time_loop = 1
        Case 13 'sheet4 - Error
              for_Device_Loop = 1
              for_time_loop = 0
        Case 14 'sheet5 - Manual
              for_Device_Loop = 0
              for_time_loop = 4
        Case 15 'sheet6 - Motion
              for_Device_Loop = 2
              for_time_loop = 5
        Case 16 'sheet7 - DataCim
              for_Device_Loop = 3
              for_time_loop = 0
        Case 17 'sheet8 - Data Process
              for_Device_Loop = 3
              for_time_loop = 0
        Case Else 'sheet9 - Interface
              for_Device_Loop = 2
              for_time_loop = 5
    End Select
    c = 5
    temp_point = 0
    For for_time = 0 To for_time_loop Step 1
      For for_Device = 0 To for_Device_Loop Step 1
        j = for_Device
        temp_point = 0
        If for_sheet = 11 And for_time = 0 And for_Device > 2 Then
            Exit For
        ElseIf for_sheet = 11 And for_time = 1 And for_Device = 2 Then
            GoTo SkipDevice
        ElseIf for_sheet = 11 And for_time = 1 And for_Device = 3 Then
            GoTo SkipDevice
        ElseIf for_sheet = 11 And for_time = 1 And for_Device = 4 Then
            c = 26
        End If
        If for_sheet = 15 And for_time < 5 And for_Device > 0 Then
            Exit For
        End If
        If for_sheet = 16 And for_Device = 2 Then
            c = c + 3
            GoTo SkipDevice
        End If
        If for_sheet = 17 And for_Device = 3 Then
            temp_point = 2900
        ElseIf for_sheet = 17 And for_Device = 1 Then
          for_DevT_loop = 39
          point_copy = 50
          temp_point = 0
          For for_DevT = 0 To for_DevT_loop Step 1
            With Sheets(i)
              arr = .Range(.Cells(4 + temp_point, c), .Cells(point_copy - temp_point + 3, c + 1)).Value
            End With
            For r = 1 To UBound(arr)
              arr(r, 1) = symbol(j) & arr(r, 1)
            Next r
            firstPaste = Scomment.Range("A" & Rows.Count).End(xlUp).Row + 1
            Scomment.Cells(firstPaste, 1).Resize(UBound(arr), UBound(arr, 2)) = arr
            temp_point = temp_point + 100
            point_copy = point_copy + 200
          Next for_DevT
          GoTo PassPaste
        End If
        With Sheets(i)
          arr = .Range(.Cells(4 + temp_point, c), .Cells(point_copy - temp_point + 3, c + 1)).Value
        End With
        For r = 1 To UBound(arr)
          arr(r, 1) = symbol(j) & arr(r, 1)
        Next r
        firstPaste = Scomment.Range("A" & Rows.Count).End(xlUp).Row + 1
        Scomment.Cells(firstPaste, 1).Resize(UBound(arr), UBound(arr, 2)) = arr
PassPaste:
        If for_Device < for_Device_Loop And for_sheet <> 11 Then
          c = c + 3
        ElseIf for_sheet = 11 And for_time = 0 And for_Device < 2 Then
          c = c + 3
        ElseIf for_sheet = 11 And for_time = 1 And for_Device < for_Device_Loop Then
          c = c + 3
        End If
SkipDevice:
      Next for_Device
      Select Case for_sheet
        Case 11 'sheet2 - Init
              c = c + 7
        Case 12 'sheet3 - Auto
              c = c + 7
        Case 14 'sheet5 - Manual
              c = c + 3
        Case 15 'sheet6 - Motion
              If for_time = 4 Then c = c + 1
        Case 18 'sheet9 - Interface
              c = c + 4
      End Select
    Next for_time
  Next for_sheet
End Sub
 
Upvote 0
3- Trong chương trình của e có đặt password cho phần VBA, khi chạy code mở userform lên thì khi tắt chương trình đi và lưu lại thì nó cứ bị hiện cái bảng nhập password của VBA lên và phải ấn cancel để tắt hẳn, e đã tìm hiểu mà k biết phải khắc phục như nào
Cái này mình tìm hiểu được là do máy có cài chương trình Google Drive, file Excel nào có password VBA khi tắt đi là nó bị vậy. Mình biết nguyên nhân nhưng không biết cách khắc phục.
 
Upvote 0
Chỉnh tàm tạm hy vong chạy được
Mã:
Sub Find_Comment()
    Dim i, j, c As Integer
    Dim firstPaste, lastRow As Long
    Dim for_sheet, for_sheet_loop As Integer
    Dim for_Device, for_Device_Loop As Integer
    Dim for_time, for_time_loop As Integer
    Dim for_DevT, for_DevT_loop As Integer
    Dim point_copy, temp_point As Integer
    Dim CellsPaste, RangePaste As Range
    Dim symbol()

  symbol() = Array("M", "T", "D", "ZR", "L")
  for_sheet_loop = 18
  point_copy = 5000
  For for_sheet = 10 To for_sheet_loop Step 1
    i = for_sheet - 9 '****
    Select Case for_sheet
        Case 10 'sheet1 - Test
              for_Device_Loop = 2
              for_time_loop = 0
        Case 11 'sheet2 - Init
              for_Device_Loop = 4
              for_time_loop = 1
        Case 12 'sheet3 - Auto
              for_Device_Loop = 2
              for_time_loop = 1
        Case 13 'sheet4 - Error
              for_Device_Loop = 1
              for_time_loop = 0
        Case 14 'sheet5 - Manual
              for_Device_Loop = 0
              for_time_loop = 4
        Case 15 'sheet6 - Motion
              for_Device_Loop = 2
              for_time_loop = 5
        Case 16 'sheet7 - DataCim
              for_Device_Loop = 3
              for_time_loop = 0
        Case 17 'sheet8 - Data Process
              for_Device_Loop = 3
              for_time_loop = 0
        Case Else 'sheet9 - Interface
              for_Device_Loop = 2
              for_time_loop = 5
    End Select
    c = 5
    temp_point = 0
    For for_time = 0 To for_time_loop Step 1
      For for_Device = 0 To for_Device_Loop Step 1
        j = for_Device
        temp_point = 0
        If for_sheet = 11 And for_time = 0 And for_Device > 2 Then
            Exit For
        ElseIf for_sheet = 11 And for_time = 1 And for_Device = 2 Then
            GoTo SkipDevice
        ElseIf for_sheet = 11 And for_time = 1 And for_Device = 3 Then
            GoTo SkipDevice
        ElseIf for_sheet = 11 And for_time = 1 And for_Device = 4 Then
            c = 26
        End If
        If for_sheet = 15 And for_time < 5 And for_Device > 0 Then
            Exit For
        End If
        If for_sheet = 16 And for_Device = 2 Then
            c = c + 3
            GoTo SkipDevice
        End If
        If for_sheet = 17 And for_Device = 3 Then
            temp_point = 2900
        ElseIf for_sheet = 17 And for_Device = 1 Then
          for_DevT_loop = 39
          point_copy = 50
          temp_point = 0
          For for_DevT = 0 To for_DevT_loop Step 1
            With Sheets(i)
              arr = .Range(.Cells(4 + temp_point, c), .Cells(point_copy - temp_point + 3, c + 1)).Value
            End With
            For r = 1 To UBound(arr)
              arr(r, 1) = symbol(j) & arr(r, 1)
            Next r
            firstPaste = Scomment.Range("A" & Rows.Count).End(xlUp).Row + 1
            Scomment.Cells(firstPaste, 1).Resize(UBound(arr), UBound(arr, 2)) = arr
            temp_point = temp_point + 100
            point_copy = point_copy + 200
          Next for_DevT
          GoTo PassPaste
        End If
        With Sheets(i)
          arr = .Range(.Cells(4 + temp_point, c), .Cells(point_copy - temp_point + 3, c + 1)).Value
        End With
        For r = 1 To UBound(arr)
          arr(r, 1) = symbol(j) & arr(r, 1)
        Next r
        firstPaste = Scomment.Range("A" & Rows.Count).End(xlUp).Row + 1
        Scomment.Cells(firstPaste, 1).Resize(UBound(arr), UBound(arr, 2)) = arr
PassPaste:
        If for_Device < for_Device_Loop And for_sheet <> 11 Then
          c = c + 3
        ElseIf for_sheet = 11 And for_time = 0 And for_Device < 2 Then
          c = c + 3
        ElseIf for_sheet = 11 And for_time = 1 And for_Device < for_Device_Loop Then
          c = c + 3
        End If
SkipDevice:
      Next for_Device
      Select Case for_sheet
        Case 11 'sheet2 - Init
              c = c + 7
        Case 12 'sheet3 - Auto
              c = c + 7
        Case 14 'sheet5 - Manual
              c = c + 3
        Case 15 'sheet6 - Motion
              If for_time = 4 Then c = c + 1
        Case 18 'sheet9 - Interface
              c = c + 4
      End Select
    Next for_time
  Next for_sheet
End Sub
e cảm ơn bác ạ, để e sửa rồi chạy thử xem sao ạ
Bài đã được tự động gộp:

Cái này mình tìm hiểu được là do máy có cài chương trình Google Drive, file Excel nào có password VBA khi tắt đi là nó bị vậy. Mình biết nguyên nhân nhưng không biết cách khắc phục.
e có tham khảo trên mạng mà cũng chưa biết cách giải quyết như nào ạ
Bài đã được tự động gộp:

Đã muốn làm đồ án to thì phải biết giao thiệp, chịu khó viết từ ngữ cho rõ rệt. Bạn không biết mình đã mất gì khi cố tình giữ thái độ.
Tuy GPE có rất nhiều tay code giỏi, giỏi hơn tôi nhiều. Nhưng số người có kinh nghiệm với đồ án không nhiều đâu.
Cảm ơn bác đã góp ý
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom