Nhờ các anh chị xử lý tăng tốc hàm người dùng (1 người xem)

  • Thread starter Thread starter adua29
  • Ngày gửi Ngày gửi

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

adua29

Real-life Girls Super Сasual Dating
Tham gia
29/4/08
Bài viết
162
Được thích
113
Giới tính
Nam
Nghề nghiệp
Health
Nhờ các anh chị tăng tốc 2 hàm sau:
Function dungsai(chuoi As Range, maxa As Byte, maxo As Byte, nx As Boolean)


Dim m, N, i, j As Byte
Dim trung As Boolean
Dim bebe As String


trung = True
bebe = WorksheetFunction.Trim(chuoi.Value)


If nx = False And Len(bebe) > maxo Then
trung = False
End If
If nx = True And Len(bebe) < (maxa - maxo) Then
trung = False
End If

For i = 1 To Len(bebe)
For j = i + 1 To Len(bebe)
If Mid(bebe, i, 1) = Mid(bebe, j, 1) Then
trung = False
End If
Next
If Mid(bebe, i, 1) > maxa Then
trung = False
End If
Next
dungsai = trung
End Function
Function dem(vung As Range, maxd As Long, nxd As Boolean)


Dim cls As Range, Rng As Range
Dim tong As Long


For Each cls In vung
Set Rng = cls.Find("*" & maxd & "*", LookIn:=xlValues, LookAt:=xlWhole)
If nxd = False And Not Rng Is Nothing And cls.Value > 0 Then
tong = tong + 1
Else
If nxd = True And Rng Is Nothing And cls.Value > 0 Then
tong = tong + 1
End If
End If
Next
dem = tong
End Function

Trên máy của em khi sử dụng hàm dungsai, hàm đưa ra kết quả sau 1 - 1,5 giây

Nhờ các anh chị tìm giải pháp tăng tốc độ để hàm xử lý được nhanh hơn
 
Nhờ các anh chị tăng tốc 2 hàm sau:
Function dungsai(chuoi As Range, maxa As Byte, maxo As Byte, nx As Boolean)


Dim m, N, i, j As Byte
Dim trung As Boolean
Dim bebe As String


trung = True
bebe = WorksheetFunction.Trim(chuoi.Value)


If nx = False And Len(bebe) > maxo Then
trung = False
End If
If nx = True And Len(bebe) < (maxa - maxo) Then
trung = False
End If

For i = 1 To Len(bebe)
For j = i + 1 To Len(bebe)
If Mid(bebe, i, 1) = Mid(bebe, j, 1) Then
trung = False
End If
Next
If Mid(bebe, i, 1) > maxa Then
trung = False
End If
Next
dungsai = trung
End Function
Function dem(vung As Range, maxd As Long, nxd As Boolean)


Dim cls As Range, Rng As Range
Dim tong As Long


For Each cls In vung
Set Rng = cls.Find("*" & maxd & "*", LookIn:=xlValues, LookAt:=xlWhole)
If nxd = False And Not Rng Is Nothing And cls.Value > 0 Then
tong = tong + 1
Else
If nxd = True And Rng Is Nothing And cls.Value > 0 Then
tong = tong + 1
End If
End If
Next
dem = tong
End Function

Trên máy của em khi sử dụng hàm dungsai, hàm đưa ra kết quả sau 1 - 1,5 giây

Nhờ các anh chị tìm giải pháp tăng tốc độ để hàm xử lý được nhanh hơn
Bây giờ vầy nhé! Công dụng của hàm bạn là gì vậy? áp dụng dữ liệu nào? có file demo mới dễ. Tôi thì ngạy xem cái đám rừng code đó lắm, có file thực tế, nêu yêu cầu cụ thể hy vọng có giải thuật hợp lý.
 
hàm dungsai dùng để kiểm tra điều kiện dữ liệu số trong một ô nếu có ký tự số lớn hơn maxa hoặc số các chữ số trong ô vượt max0 thì cho kết quả sai (hoặc ngược lại khi nx sai)
hàm này em dùng để kiểm phiếu bầu cử
 
Hàm dem dùng để đếm số lượng ký tự maxd xuất hiện trong một mảng ô vung (và ngược lại khi nxd sai), hàm này em cũng dùng để cộng số phiếu bầu cử
 
hàm dungsai dùng để kiểm tra điều kiện dữ liệu số trong một ô nếu có ký tự số lớn hơn maxa hoặc số các chữ số trong ô vượt max0 thì cho kết quả sai (hoặc ngược lại khi nx sai)
hàm này em dùng để kiểm phiếu bầu cử
Nếu bạn không thích up file thì đợi người khác giúp vậy.
 
file của em 1,6mb đã vượt dung lượng giới hạn nên không tải lên GPE được, em chỉ chia sẻ qua gmail thôi
 
Cả 2 hàm của bạn đều khắc phục được tốc độ, nhưng không có dữ liệu để test ngạy sửa lắm, sửa xong bạn lại nói chưa đúng, sai chổ này, dữ liệu thật áp dụng không được... Thôi thì bạn tự sửa đi. Có thể góp ý thêm cho bạn như sau: Bạn nên sử dụng cấu trúc IF THEN ELSE cho đầy đủ, nên ghép những điều kiện giống nhau lại (để khỏi xét nhiều lần mất thời gian), khi đã thỏa điều kiện rồi thì kết thúc vòng lặp và cho kết quả luôn (không cần phải xét nửa sẽ mất nhiều thời gian cho dù cuối cùng vẫn đạt kết quả như ban đầu). Mà quên nửa bạn có thể up file vào trang Mediafire.com
 
file của em 1,6mb đã vượt dung lượng giới hạn nên không tải lên GPE được, em chỉ chia sẻ qua gmail thôi
Function dungsai(chuoi As Range, maxa As Byte, maxo As Byte, nx As Boolean)
bạn không cần tải nguyên file, bạn tạo file mới có một số giá trị của tham số như chuoi, maxa, maxo , nx và giải thích cách xử lý và kết quả tạo ra
tương tự cho Function còn lại
 
Mình thành thật khuyên bạn nên viết hàm có dạng dễ nhìn như sau:

PHP:
Option Explicit
Function DungSai(Chuoi As Range, maxA As Byte, maxO As Byte, nX As Boolean) As Boolean
 Dim M, N, I, J As Byte
 Dim Trung As Boolean:                      Dim beBe As String
 Trung = True
 beBe = WorksheetFunction.Trim(Chuoi.Value)
 If nX = False And Len(beBe) > maxO Then
    Trung = False
 End If
 If nX = True And Len(beBe) < (maxA - maxO) Then
    Trung = False
 End If
 For I = 1 To Len(beBe)
    For J = I + 1 To Len(beBe)
        If Mid(beBe, I, 1) = Mid(beBe, J, 1) Then
            Trung = False
        End If
    Next J
    If Mid(beBe, I, 1) > maxA Then
        Trung = False
    End If
 Next I
 DungSai = Trung
End Function
1.0 Bạn viết cho mọi người khác nhìn nhận vấn đề, nên cần rất tường minh mới fải
Viết như bạn mình có thể qui kết là bạn thiếu ton trọng những người có nhã í giúp mình.
1.1 Lí ra bạn cũng nên nêu các tham biến bạn cung cấp là gì, ở khoảng bao nhiêu; Hàm dùng làm gì ngay từ đầu.

2.0 Vấn đề nữa, chỉ mong bạn xem xét, vì chưa khẳng định được đúng hay sai:
Hình như sau mỗi dòng lệnh
Trung =False ta có thể cho thoát ngay khỏi chương trình thì fải (Exit Function)
Nếu là đúng như vậy thì bạn cũng đã tăng tốc đáng kể cho hàm. (Theo mình hiểu thì chỉ cần 1 điều kiện không thỏa sẽ thoát ngay khoải xét tiếp các điều kiện sau)

3.0 Đứng là bạn nên có file giả lập lên; Cái cớ file quá lớn là không chính đáng!
Hay chí ít mô tả công việc thật chi tiết thì đã có đáp án ngay từ đầu.

Chào bạn & chúc ngày mới vui vẻ!
 
Ít nhất bạn phải giải thích là bạn muốn tính cái gì.
Luật căn bản của hàm gồm có hàm trả về cái gì, tham số là gì, công thức/phương pháp tính, và các trường hợp ngoại lệ (ví dụ trường hợp tính không ra).
 
Cảm ơn các anh, em đã tìm ra lỗi chạy chậm, lý do không ở cấu trúc hàm mà do em sử dụng hàm nhiều lần (5000 cel) trong 1 sheet
Sau khi rút gọn xuống 1500 cel em đã thấy tốc độ xử lý nhanh hơn hẳn.
 
Nhưng dù sao bạn cũng nên xem xét viết lại các hàm cho khúc chiết, mạch lạc hơn.
Nhất là hàm thứ 2

Vấn đề nữa là ta có thể xài dòng lệnh sau để thay thế:

Set Rng= Cls.Find(maxd , LookIn:=xlValues, LookAt:=xlPart)
 
Nhưng dù sao bạn cũng nên xem xét viết lại các hàm cho khúc chiết, mạch lạc hơn.
Nhất là hàm thứ 2

Vấn đề nữa là ta có thể xài dòng lệnh sau để thay thế:

Set Rng= Cls.Find(maxd , LookIn:=xlValues, LookAt:=xlPart)

Cảm ơn anh, thật ra em chỉ đưa ra yêu cầu về 2 hàm nêu trên và nhờ các ace GPE xây dựng đã từ lâu để ứng dụng trong file kiểm phiếu bầu cử đại biểu quốc hội và hđnd các cấp.
Về nội dung cấu trúc xử lý của hàm thì em mù tịt, em chỉ hiểu cơ bản về excel, ghi macro, còn viết VBA thì em chịu.
 
Cảm ơn anh, thật ra em chỉ đưa ra yêu cầu về 2 hàm nêu trên và nhờ các ace GPE xây dựng đã từ lâu để ứng dụng trong file kiểm phiếu bầu cử đại biểu quốc hội và hđnd các cấp.
Về nội dung cấu trúc xử lý của hàm thì em mù tịt, em chỉ hiểu cơ bản về excel, ghi macro, còn viết VBA thì em chịu.
Tôi cũng đã xem được file kiểm phiểu bầu cử của bạn rồi, rõ ràng chạy hơi chậm, cải thiện code chút và sửa một số công thức thì file chạy nhanh hẳn, lấy ví dụ Name NHAP_PHIEU của bạn tham chiếu quá nhiều dòng mặc dù trong khi nhập phiếu bầu chỉ vài dòng thôi mà nó tham chiếu vậy thì chạy chậm là đúng rồi. Thôi thấy bạn không cần thiết và không cần sự góp ý của người khác thì thôi vậy.
 

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

Back
Top Bottom