Chuyên mục xử lý, gỡ rối code VBA (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Status
Không mở trả lời sau này.

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,958
Bạn gửi cả CỤM lên đây xem thì mới biết tại sao chậm...
Tức là khi em gán giá trị a khoảng rộng hơn, từ a = Sheet1.Range("B2:C6").Value2 thành a = Sheet1.Range("B2:C5000").Value2 thì code chạy tương đối chậm bác ạ,
Giả sử em thay thế này chẳng hạn
PHP:
Sub bebe()
    Dim a(), arr(), b(), N As Long, Res(), D As Long
    Dim i As Long, k As Long
    a = Sheet1.Range("B2:C10000").Value2
    b = Sheet2.Range("B2:B65000").Value2
    N = UBound(b, 1)
    ReDim Res(1 To N, 1 To 1)
    For i = 1 To UBound(a, 1)
        If a(i, 1) <= a(i, 2) Then
            For D = a(i, 1) To a(i, 2)
                k = k + 1
                ReDim Preserve arr(1 To k)
                arr(k) = D
            Next D
        End If
    Next i
    For i = 1 To N
        If IsError(Application.Match(b(i, 1), arr, 0)) = True Then Res(i, 1) = "Ngh" & ChrW(7881)
    Next i
    Sheet2.Range("C2").Resize(N, 1) = Res
End Sub
 
Upvote 0
Dữ liệu ít -> tới nhiều thì chậm hơn là đúng rồi.
Mà với mảng có 5000 dòng mà chậm thì là vô lý.
Chậm do nhiều nguyên nhân, dữ liệu trên file bạn, format trên file bạn...: có biết file bạn như nào đâu mà phán....
File của em đây bác, khi em thay a = Sheet1.Range("B2:C6").Value2 thành a = Sheet1.Range("B2:C5000").Value2 chẳng hạn thì nó chạy tương đối chậm ạ
 

File đính kèm

Upvote 0
File của em đây bác, khi em thay a = Sheet1.Range("B2:C6").Value2 thành a = Sheet1.Range("B2:C5000").Value2 chẳng hạn thì nó chạy tương đối chậm ạ
Trong file bạn gửi có tí dữ liệu nào tới dòng 5000 nào đâu?
Định tét code chơi cho vui hả?
b = Sheet2.Range("B2:B10000").Value2
Có biết 10,000 dòng là bao nhiêu năm không? Giả sử không bỏ sót ngày nào thì ứng với > 27 năm đó. Không biết công ty có sống thọ tới lúc đó không?

Chạy thử thấy chậm bình thường, chẳng làm sao cả.
 
Upvote 0
Trong file bạn gửi có tí dữ liệu nào tới dòng 5000 nào đâu?
Định tét code chơi cho vui hả?
b = Sheet2.Range("B2:B10000").Value2
Có biết 10,000 dòng là bao nhiêu năm không? Giả sử không bỏ sót ngày nào thì ứng với > 27 năm đó. Không biết công ty có sống thọ tới lúc đó không?

Chạy thử thấy chậm bình thường, chẳng làm sao cả.
Vâng, thực tế là như bác nói. Em cũng có ý test ạ. Mà bác ơi; cái Value với Value2 nó khác nhau chỗ nào ạ, em tìm đọc trên mạng mà chưa hiểu lắm, bác cho em cái link được không? Cảm ơn bác
 
Upvote 0
Cái chỗ chậm là tại vì thuật toán quá tệ.
Đầu tiên, nó tuỳ theo con số k cuối cùng. Cứ mỗi lần k tăng lên 1 là lại phải Redim Preserve cái mảng.
Kế đó, là cái vòng lặp 1 tới N (N = 65000). Bên trong vòng lặp này gọi hàm Match với tham số thứ 3 là 0, dò mệt nghỉ.
Cứ tưởng tượng k = 1000, hàm match sẽ dò trung bình 1000/2 = 500 trị một lượt. 65000 lượt là ...
 
Upvote 0
Cái chỗ chậm là tại vì thuật toán quá tệ.
Đầu tiên, nó tuỳ theo con số k cuối cùng. Cứ mỗi lần k tăng lên 1 là lại phải Redim Preserve cái mảng.
Kế đó, là cái vòng lặp 1 tới N (N = 65000). Bên trong vòng lặp này gọi hàm Match với tham số thứ 3 là 0, dò mệt nghỉ.
Cứ tưởng tượng k = 1000, hàm match sẽ dò trung bình 1000/2 = 500 trị một lượt. 65000 lượt là ...
Bác edit dùm cái được không ạ. Xin cảm ơn
 
Upvote 0
Ok. Cám ớn bác nhé, đã sửa dược lỗi nhưng lại phát sinh lỗi không tra cứu được hàng hóa.
 
Lần chỉnh sửa cuối:
Upvote 0
E đang lập sổ quản lý đơn thư trên Ecxel, nhưng kiến thức còn hạn hẹp, không thể quản lý dữ liệu theo yêu cầu. Nhờ các bác viết giúp cho dđoạn CODE để Cell M6 có thể nhập được dữ liệu (theo list được tạo trước Validation) khi và chỉ khi Cell K6 có dữ liệu giống Cell G3 của Sheet "data". Hay nói cách khác là Ô M6 chỉ được nhận dữ liệu (từ list được tạo ra) nếu Ô K6 có dữ liệu là "CHUYỂN ĐƠN"; còn nếu Ô K6 ko phải dữ liệu là "CHUYỂN ĐƠN" thì M6 bắt buộc phải để trống và không cho nhập dữ liệu
P/S: các bác viết giúp em cho Ô M6 và K6 theo yêu cầu trên ạ, khi e cần thêm dòng thì đã có CODE thêm dòng rồi ạ
Xin cảm ơn!
 

File đính kèm

Upvote 0
E đang lập sổ quản lý đơn thư trên Ecxel, nhưng kiến thức còn hạn hẹp, không thể quản lý dữ liệu theo yêu cầu. Nhờ các bác viết giúp cho dđoạn CODE để Cell M6 có thể nhập được dữ liệu (theo list được tạo trước Validation) khi và chỉ khi Cell K6 có dữ liệu giống Cell G3 của Sheet "data". Hay nói cách khác là Ô M6 chỉ được nhận dữ liệu (từ list được tạo ra) nếu Ô K6 có dữ liệu là "CHUYỂN ĐƠN"; còn nếu Ô K6 ko phải dữ liệu là "CHUYỂN ĐƠN" thì M6 bắt buộc phải để trống và không cho nhập dữ liệu
P/S: các bác viết giúp em cho Ô M6 và K6 theo yêu cầu trên ạ, khi e cần thêm dòng thì đã có CODE thêm dòng rồi ạ
Xin cảm ơn!
Thử xem file này coi có đúng ý bạn không.
 

File đính kèm

Upvote 0
Các bác có hàm nào tham chiếu thay cho cú pháp này của em không ạ. Cái này dùng hàm của execl nhưng đưa vào vba thi báo lỗi vì vùng tham chiếu trong hàm Match báo N/A.
a = Application.WorksheetFunction.IfError(Application.WorksheetFunction.Match(Sheet4.Range("giá trị tham chiếu"), Sheet2.Range("vùng tham chiếu"), 0), 0)
 
Upvote 0
Mình có được file excel DM nhưng bị lỗi như thế này nhờ các bác giúp:
1. khi click đúp chuột trái vào cột A thì Userform hiện lên nhưng vào ô tra cứu không tra được.
2. Khi uesrform hiện lên, ta chọn 1 mã hiệu-> chọn thì ok nhưng tại cột D ( cột định mức) không trả về định dạng kiểu số nên dẫn đến công thức sai.
3. Hiện tại file này chỉ chuyển dữ liệu từ sheet DMHH sang có 4 cột, nếu e muốn chuyển hết 5 hoặc 6 cột thì chỉnh code như thế nào? Nhờ các bác giúp cho.
 

File đính kèm

Upvote 0
Chào các bác!

Mình mới học VBA, mình đang muốn viết 1 đoạn code xử lý dữ liệu từ file text, sau đó lấy một vài thông tin cần thiết và nhập vào file excel. Bác nào cho mình xin đoạn code tham khảo với.
Mình cảm ơn.
 
Upvote 0
Mình có được file excel DM nhưng bị lỗi như thế này nhờ các bác giúp:
1.
2.
3.
. . . .
Cách viết 1 dòng lệnh lại bỏ trống 1 dòng lệnh gây khó đọc quá; Mình không thể đọc nổi & xin chào vậy!
 
Upvote 0
Nhờ chỉ giúp chỗ mình chưa đúng trong đoạn code dưới. . Khi xóa dữ liệu tại cột B thì các cột khác cũng bị xóa ( Mình chỉ muốn xóa dữ liệu tại các cột A, L,M,N ( từ dòng 8 trở xuống ) để gán công thức mỗi khi có dữ liệu ở cột B (từ B8 )
Xin cảm ơn
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
For Each Cll In Intersect(Target.EntireRow, [B:B])
If Cll.Row > 7 Then
If Cll.Value = "" Then
Range("A8:A1000", "L8:N1000").ClearContents

Else
If Range("A" & Cll.Row).Formula = "" Then Range("A" & Cll.Row).FormulaR1C1 = "=IF(RC[1]<>"""",MAX(R7C1:R[-1]C)+1,"""")"
If Range("L" & Cll.Row).Formula = "" Then Range("L" & Cll.Row).FormulaR1C1 = "=IF(RC[-10]="""","""",IF(RC[-5]=""x"",""x"",""/""))"
If Range("M" & Cll.Row).Formula = "" Then Range("M" & Cll.Row).FormulaR1C1 = "=IF(RC[-11]="""","""",IF(RC[-2]=R1C11,""Cdi"",IF(RC[-2]=R2C11,""Cde"",""/"")))"
If Range("N" & Cll.Row).Formula = "" Then Range("N" & Cll.Row).FormulaR1C1 = "=RIGHT(RC[-6],2)"
End If
End If
Next
Application.EnableEvents = True
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nhờ chỉ giúp chỗ mình chưa đúng trong đoạn code dưới. . Khi xóa dữ liệu tại cột B thì các cột khác cũng bị xóa ( Mình chỉ muốn xóa dữ liệu tại các cột A, L,M,N ( từ dòng 8 trở xuống ) để gán công thức mỗi khi có dữ liệu ở cột B (từ B8 )
Xin cảm ơn
Range("A8:A1000", "L8:N1000").ClearContents là lệnh xóa từ cột A đến cột L
muốn xóa từng cột thì dùng lệnh xóa riêng từng cột, hoặc tìm hiểu lệnh Union ghép các cột
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

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

Back
Top Bottom