Bài tập về code VBA

Liên hệ QC

today100506

Thành viên chính thức
Tham gia
2/6/10
Bài viết
87
Được thích
41
Nghề nghiệp
IT
[HUUDUCTRAN] CODE MẪU ! XEM & PHÁT TRIỂN ! UPDATE LIÊN TỤC

Xin chào anh chị,

Em xin lập topic này để đưa lên các code mẫu (có kèm file mẫu + code)

Mời anh chị vào xem

Nếu thấy chỗ nào chưa hay, chưa đúng, chưa hợp lý
anh chị cứ góp ý, cứ nói..., cứ sửa...thoải mái !

Em xin chân thành cảm ơn !
 
Lần chỉnh sửa cuối:
[VBA] CODE #7 HÀM TỰ TẠO - fTrim (HOẠT ĐỘNG NHƯ TRIM)



Tôi thắc mắc: Bạn nói fTrim hoạt động như TRIM là như cái gì? Như TRIM trên bảng tính hay như TRIM trong VBA?
Xem kết quả thì có vẻ giống như TRIM trong VBA. Vậy sao không là vầy:
Mã:
Function fTrim(ByVal str As String) As String
    fTrim = Trim(str)
End Function
Khó hiểu thật!
(hay bạn có ý gì khác?)
 
Upvote 0
Tôi thắc mắc: Bạn nói fTrim hoạt động như TRIM là như cái gì? Như TRIM trên bảng tính hay như TRIM trong VBA?
Xem kết quả thì có vẻ giống như TRIM trong VBA. Vậy sao không là vầy:
Mã:
Function fTrim(ByVal str As String) As String
    fTrim = Trim(str)
End Function
Khó hiểu thật!
(hay bạn có ý gì khác?)

Dạ, thưa thầy ndu,
Ý của em là viết lại một hàm nào đó đã có, ví dụ trong code này, là viết lại một hàm hoạt động như Trim


Mục đích ở đây chỉ là học hỏi và trao dồi thêm kinh nghiệm !

+ Đối với em: khi viết lại hàm, là em vừa ôn lại kiến thức hàm, vừa phân tích, suy nghĩ, bắt lỗi...và phát triển khả năng viết code.

+ Đối với các bạn mới: Em sẽ cho các bạn thấy viết một hàm là như thế nào: ta phải phân tích, test thử tất cả các tính huống có thể xảy ra khi tự viết một hàm và bắt lỗi chúng, để khi đưa vào sử dụng thực tế, nó khả dụng ! v.v....

Em không muốn, một ngày đẹp trời nào đó, em muốn làm một việc gì đó, mà vba chưa có sẵn hàm đó cho em làm...
thì em còn biết đường mà viết một hàm... ^_^
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ, thưa thầy ndu,
Ý của em là viết lại một hàm nào đó đã có, ví dụ trong code này, là viết lại một hàm hoạt động như Trim

Mục đích: Viết lại vừa có thể học hỏi, vừa hiểu thêm hàm, vừa phát triển cách viết hàm... ý em là thế đấy ạ !

Nếu bạn nói vậy thì topic này chắc phải sửa thành: BÀI TẬP VỀ CODE VBA quá
(bài tập thì muốn làm gì chẳng được, đúng sai tính sau)
 
Upvote 0
Nếu bạn nói vậy thì topic này chắc phải sửa thành: BÀI TẬP VỀ CODE VBA quá
(bài tập thì muốn làm gì chẳng được, đúng sai tính sau)

Thì mần luôn đi, để lâu hóa bùn mất thôi!
 
Upvote 0
Code kiểm tra file Excel đã mở hay chưa (bài #11) nếu file chứa code và file cần kiểm tra được mở bằng 2 session khác nhau thì coi như tèo (false). Chưa thể gọi là code mẫu được.

---------------------------------------------------------------
Bạn nói rằng bạn mới học code
"mười mươi bữa" mà tôi nhìn chữ ký bạn thật kêu, kinh!
 
Upvote 0
[HUUDUCTRAN] CODE MẪU ! XEM & PHÁT TRIỂN ! UPDATE LIÊN TỤC

Xin chào anh chị,

Em xin lập topic này để đưa lên các code mẫu (có kèm file mẫu + code)

Mời anh chị vào xem

Nếu thấy chỗ nào chưa hay, chưa đúng, chưa hợp lý
anh chị cứ góp ý, cứ nói..., cứ sửa...thoải mái !

Em xin chân thành cảm ơn !

Mình xin có 1 ý kiến nhỏ về loạt Topic của Today100506 như sau:
Khi đã nói đến mẫu thì cái đó phải chuẩn mực đại diện cho hàng loạt các đối tượng đồng loại. Vậy mà Code của bạn còn đang tập viết và xin ý kiến thì không thể nói là mẫu được.
Mình cũng nói thêm, Code do anh Duyệt hay HoangDanh viết gửi lên GPE cũng không thể gọi là mẫu được vì như vậy sẽ không đánh giá đúng cái Tâm và cái Tầm của các anh ấy. Khi viết bài hướng dẫn nhau, trợ giúp nhau có thể còn tồn tại nhiều thứ, thiếu chỉnh trang rõ ràng xúc tích. Các bạn thấy các bài có tính mô phạm thì các anh ấy cũng như anh Tuấn "Nghị Hách" và 1 số cao thủ khác viết nó rõ ràng thậm chí còn giải thích cũng như chỉnh trang xịn như hàng Bill Gate ấy chứ.

Trong khi đó GPE là 1 diễn đàn khoa học và nghiêm túc trên mạng Internet được viếng thăm không chỉ có thành viên chúng ta mà có cả các khách thăm khác (Thậm chí là người nước ngoài vào tham khảo). Vậy việc đặt tiêu đề hay ngôn ngữ viết bài làm sao thể hiện được cái CHÂN của nó, ngược lại dễ bị bỏ qua khi nghe tên quá kêu mà bài không đúng vậy thì cũng ít người đủ kiên nhẫn đọc đến bài cuối.
Mong chủ Topic xem lại.
 
Upvote 0
/(/hưng như trên đã nói: Người dân không thể tự sửa tiêu đề của mình hay của người khác được!

Lần cuối xin đề nghị các SMOD hãy thảo luận & cho 1 tiêu đề loạt bài này cho thích hợp hơn./.
 
Upvote 0
Thật ra tiêu đề gì cũng không sao (miễn phù hợp với nội quy). Vấn đề ở đây là cái tiêu đề CODE MẪU GPE có thể khiến các thành viên ngộ nhận, tưởng rằng đây là code chuẩn mực từ GPE, dẫn đến khi họ áp dụng có trục trặc gì đó rồi lại đổ tội cho GPE ta. Thậm chí nếu chỉ là CODE MẪU cũng chưa thể chấp nhận được
Từ lý do trên, tôi quyết định sửa tiêu đề lại thành BÀI TẬP VỀ CODE VBA
Nếu các bạn và BQT không có ý kiến gì khác thì ta thống nhất thế nhé!
Cảm ơn!
ANH TUẤN
(chúng ta có thể thảo luận thêm về các code của tác giả, đánh giá tính chính xác, hay, dở hoặc đưa lên thêm những đoạn code khác)
 
Lần chỉnh sửa cuối:
Upvote 0
Rất cảm ơn SMOD!

Vậy mình xin góp 1 bài tạp làm lịch tháng:

PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim Dat0 As Date, Dat As Date
 Dim Ngay As Byte, Thu As Long, J As Byte, Ww As Byte
 
 If Not Intersect(Target, [S1]) Is Nothing Then
    Dat = DateSerial([u1].Value, Target.Value, 1)
    Thu = Weekday(Dat)
    If Thu < 3 Then
        Ngay = Switch(Thu = 1, 6, Thu = 2, 0)
    Else
     Ngay = Thu - 2
    End If
    Dat0 = Dat - Ngay:                          [P3].Resize(6, 7).Clear
    For J = 3 To 8
        For Ww = 0 To 6
            With Cells(J, 16).Offset(, Ww)
                If (Month(Dat0) < [S1].Value) Xor (Month(Dat0) = 12 And [S1].Value = 1) Then
                Else
                    .Value = Dat0
                End If
                .NumberFormat = "DD"
            End With
            Dat0 = Dat0 + 1
            If [S1].Value > 1 Then
                If Month(Dat0) > [S1].Value Then Exit Sub
            Else
                If Day(Dat0) = 1 And Month(Dat0) = 2 Then Exit Sub
            End If
        Next Ww
    Next J
 End If
End Sub
 

File đính kèm

Upvote 0
Thật ra tiêu đề gì cũng không sao (miễn phù hợp với nội quy). Vấn đề ở đây là cái tiêu đề CODE MẪU GPE có thể khiến các thành viên ngộ nhận, tưởng rằng đây là code chuẩn mực từ GPE, dẫn đến khi họ áp dụng có trục trặc gì đó rồi lại đổ tội cho GPE ta. Thậm chí nếu chỉ là CODE MẪU cũng chưa thể chấp nhận được
Từ lý do trên, tôi quyết định sửa tiêu đề lại thành BÀI TẬP VỀ CODE VBA
Nếu các bạn và BQT không có ý kiến gì khác thì ta thống nhất thế nhé!
Cảm ơn!
ANH TUẤN
(chúng ta có thể thảo luận thêm về các code của tác giả, đánh giá tính chính xác, hay, dở hoặc đưa lên thêm những đoạn code khác)

Tuy em không phải là người khởi sướng cái tên topic "Code mẫu GPE"
Nhưng em cũng bị vạ lây, các pác tranh luận sôi nổi quá, hihi...

Giờ thì cái topic của em đã có một cái tên rồi, em xin cảm ơn !

Nào anh chị, hãy vào góp ý, post code lên nào....
 
Upvote 0
Tôi đã có khuyên tác giả hãy bình tĩnh, từ tốn nhưng có vẻ không si nhê ghì cả.

Bởi vậy tôi chỉ cảnh báo cho "các bạn mới" điều này:

...
+ Đối với các bạn mới: Em sẽ cho các bạn thấy viết một hàm là như thế nào: ta phải phân tích, test thử tất cả các tính huống có thể xảy ra khi tự viết một hàm và bắt lỗi chúng, để khi đưa vào sử dụng thực tế, nó khả dụng ! v.v....

Với trình độ người viết code cái hàm fTrim này, và với cách phân giải cũng như cách viết code; câu này là quá sức tự đại. "test thử tất cả các tính huống" là trình độ tương đối cao, nó đòi hỏi hiểu biết về kỹ thuật test và kỹ thuật phân tích.

Sự luộm thuộm của fTrim:
- Khai báo biến bừa bãi. Tuy biết kiểu cần dùng của nó (Integer) nhưng vẫn khai theo kiểu Variant
- Không biết tiết kiệm biến. Tiện đâu xài đó rồi chuyển sang nơi trữ khác.
- Exit Function trước khi gán trị -> code nguy hiểm. Tuy không gán thì string mặc định là "" nhưng theo nguyên tắc thì vẫn là cách code cẩu thả.
Sự yếu kém về giải thuật của fTrim:
- Gọi hàm LEN những 2 lần. Theo nguyên tắc, nếu chuỗi khôg thay đổi thì code phải làm thế nào để gọi hàm định tính chất càng ít càng tốt (LEN là một trong nhóm hàm định tính chất của chuỗi)
- Gợi ý: người biết phân tích làm con toán duyệt khoảng trống ở đuôi chuỗi trước. Sau đó duyệt đầu chuõi chỉ tới giới hạn này thôi.
 
Upvote 0
[VBA] [SERIES HÀM TỰ TẠO]: CODE #2: fIsBlank (HOẠT ĐỘNG GẦN GIỐNG HÀM ISBLANK CỦA EXCEL)

Mã:
[COLOR=#008000]'if cell is xl error(#DIV/0!, #VALUE!...)
'fIsBlank will return err 13: type mismatch
'hien tai, chi giai quyet duoc nhu the nay, khong biet con cach nao hay hon khong !
[/COLOR]
Function fIsBlank(ByVal cll As Range) As Boolean
    Dim iErrNum As Integer
    
[COLOR=#0000ff]    On Error Resume Next[/COLOR]
    If cll.Value = "" Then: fIsBlank = True
    iErrNum = Err.Number
[COLOR=#0000ff]    On Error GoTo 0[/COLOR]
    
    If iErrNum = 13 Then: fIsBlank = False [COLOR=#008000]'catch error[/COLOR]

End Function


HIỆN TẠI, EM CHỈ VIẾT ĐƯỢC NHƯ THẾ NÀY,
EM THẤY NÓ SAO SAO ẤY, CHẮC CHẮN PHẢI CÓ CÁI HÀM GÌ QUẢN LÝ MẤY CÁI GIÁ TRỊ ERROR CỦA EXCEL.
MONG CÁC ANH CHỊ RA TAY CHỈ GIÁO....!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
MONG CÁC ANH CHỊ RA TAY CHỈ GIÁO....!
Chỉ giáo thì không dám nhưng lời khuyên thì vầy:
Dám cá với bạn trên GPE này chưa chắc ai có đủ bản lĩnh để viết 1 hàm giống như Microsoft đã viết, dù là hàm đơn giản nhất.
Vậy nên:
Lời khuyên 1: Hàm đang có sẵn thì cứ thế mà xài, chẳng dại gì đi đụng đầu vào tường. Bạn nên nhớ rằng hàm ISBLANK nó hoạt động được với nguyên 1 khối cell và trả về kết quả là 1 mảng chứ không đơn giản đối số chỉ là 1 cell đơn đâu nha (ví dụ: =ISBLANK(A2:A8) )
Thêm nữa: Nếu phải chọn 1 hàm do "ai đó" viết hoặc do anh Bill viết thì đương nhiên tôi (và số đông) sẽ chọn anh Bill cho nó xịn (chẳng cớ gì phải dùng hàng rẻ tiền)
Lời khuyên 2: Chúng ta nên viết hàm hoặc code gì đó mà anh Bill chưa viết (hoặc quên viết)
Bạn nói rằng:
fIsBlank (HOẠT ĐỘNG NHƯ HÀM ISBLANK CỦA EXCEL)
Là hơi QUÁ. Cá với bạn rằng hàm của bạn chẳng giống tí nào so với ISBLANK của anh Bill, thậm chí là khác xa 1 trời 1 vực (và.. trật lất)
--------------------------
(Trước đây tôi định viết 1 hàm gần giống hàm SUM mà viết hoài chả được, chán nên thôi)
 
Lần chỉnh sửa cuối:
Upvote 0
Mình xin gợi í chủ topic 1 câu:

Bạn viết thử hàm MaxIf() tương tợ như MAXIF() trong E2007 để xài trong E2003 xem sao?

Coi như là bạn tập để luyện khả năng lập trình đi vậy & chúc thành công!
 
Upvote 0
Bạn viết thử hàm MaxIf() tương tợ như MAXIF() trong E2007 để xài trong E2003 xem sao?

Coi như là bạn tập để luyện khả năng lập trình đi vậy & chúc thành công!
Em đính chính: Excel 2007 không hề có MAXIF, thậm chí Excel 2010 cũng không
Nhưng như thế lại càng hay, vì ta khỏi bị áp lực "so sánh"
 
Upvote 0
Chỉ giáo thì không dám nhưng lời khuyên thì vầy:
Dám cá với bạn trên GPE này chưa chắc ai có đủ bản lĩnh để viết 1 hàm giống như Microsoft đã viết, dù là hàm đơn giản nhất.
Vậy nên:
Lời khuyên 1: Hàm đang có sẵn thì cứ thế mà xài, chẳng dại gì đi đụng đầu vào tường. Bạn nên nhớ rằng hàm ISBLANK nó hoạt động được với nguyên 1 khối cell và trả về kết quả là 1 mảng chứ không đơn giản đối số chỉ là 1 cell đơn đâu nha (ví dụ: =ISBLANK(A2:A8) )
Thêm nữa: Nếu phải chọn 1 hàm do "ai đó" viết hoặc do anh Bill viết thì đương nhiên tôi (và số đông) sẽ chọn anh Bill cho nó xịn (chẳng cớ gì phải dùng hàng rẻ tiền)
Lời khuyên 2: Chúng ta nên viết hàm hoặc code gì đó mà anh Bill chưa viết (hoặc quên viết)
Bạn nói rằng:

Là hơi QUÁ. Cá với bạn rằng hàm của bạn chẳng giống tí nào so với ISBLANK của anh Bill, thậm chí là khác xa 1 trời 1 vực (và.. trật lất)
--------------------------
(Trước đây tôi định viết 1 hàm gần giống hàm SUM mà viết hoài chả được, chán nên thôi)

Dạ,
Thật ra mục đích của của em là tự tạo ra bài tập cho mình làm,
Rồi sẵn đấy ôn lại kiến thức...
Các anh chị đừng quá bức xúc...
Thật sự, em mới biết cho mấy hàm à, em chỉ muốn rèn luyện, chứ em đâu phải muốn đưa code lên để ra vẻ gì với ai đâu ạ...
Mong anh chị chỉ giáo thêm !
 
Lần chỉnh sửa cuối:
Upvote 0
[VBA] [SERIES HÀM TỰ TẠO]: CODE #3: fMod (HOẠT ĐỘNG GẦN GIỐNG HÀM MOD CỦA EXCEL)

Mã:
[COLOR=#008000]'tested data
'               num -divisor            divisor             Abs(divisor-num)
'mod(4,2)        (2)                     2     after loop      4-4 = 0
'mod(4,3)        (1)                     3                     3-4 =-1
'mod(4,4)        (0)                     4                     4-4 = 0
'mod(4,5)        (-1)                    5                     5-4 = 1
'mod(4.4,2)      (2.4)                   2                     4-4.4 = 0.4
'mod(4.6,2)      (2.6)                   2                     4-6.4 = 0.6
'mod(0,2)                                2                     0
'mod(2,0)        (catch error at 0)      2                     return xlError: #DIV/0!
'mod(FALSE,2)                            2                     0
'mod(text,2)     (catch error at text)   2                     return xlError: #VALUE!
'mod(xlError,2)  (catch error at xlError)2                     return xlError...

'*Note:
'Han che: Ham fMod hien tai chi co the nhan tham chieu la doi so, hoac cell.

'Algorithms:
'step 1: check input value...
'step 2: processing data...
[/COLOR]
Function fMod(ByVal num As Variant, ByVal divisor As Variant) As Variant
    Dim iTmp As Double
    Dim wsf As WorksheetFunction
    Set wsf = Application.WorksheetFunction
        
[COLOR=#008000]    'Right here, when argument not vaild.
        'code will be error [error 13: type mismatch] first
                'and return xlError as #VALUE! in Microsoft Excel and stop !
[/COLOR]
[COLOR=#008000]    'step 1: check input value is valid
[/COLOR]    If IsError(num) Then: fMod = procXlError(num): Exit Function[COLOR=#008000] 'iserror?[/COLOR]
    If IsError(divisor) Then: fMod = procXlError(num): Exit Function
    
    If wsf.IsNonText(num) And wsf.IsNonText(divisor) Then[COLOR=#008000] 'isnontext ?[/COLOR]
        Select Case num [COLOR=#008000]'exceptions case[/COLOR]
            Case 0: fMod = 0: Exit Function
            Case Else
                If divisor = 0 Then
                    fMod = CVErr(xlErrDiv0): Exit Function
                Else
                    GoTo lxulychung
                End If
        End Select
    Else
        fMod = CVErr(xlErrValue): Exit Function
    End If
        
[COLOR=#008000]'step 2: processing data...
[/COLOR][COLOR=#0000ff]lxulychung:
[/COLOR]    iTmp = divisor
    Do Until iTmp > num - divisor
        iTmp = iTmp + divisor
    Loop
    fMod = Abs(iTmp - num)

    Set wsf = Nothing
End Function

Function procXlError(ByVal cll As Variant) As Variant
    Select Case cll
        Case CVErr(xlErrName): procXlError = CVErr(xlErrName)
        Case CVErr(xlErrDiv0): procXlError = CVErr(xlErrDiv0)
        Case CVErr(xlErrValue): procXlError = CVErr(xlErrValue)
        Case CVErr(xlErrNum): procXlError = CVErr(xlErrNum)
        Case CVErr(xlErrRef): procXlError = CVErr(xlErrRef)
        Case CVErr(xlErrNA): procXlError = CVErr(xlErrNA)
        Case CVErr(xlErrNull): procXlError = CVErr(xlErrNull)
    End Select
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Chủ topic có vẻ muốn lên SAO nhanh chóng.. ẹc ẹc...
 
Upvote 0
SAO có đổi ra tiền được hôn? Mà điều kiện lên SAO như thế nào vậy?
SAO trên GPE hôn đổi được ra tiền mà thể hiện những đóng góp cho diễn đàn...
Rất xin lỗi chủ topic nếu có j mạo phạm
CHUỒN LẸ thôi ,,,,,,,
Xin cảm ơn..
 
Upvote 0
Web KT

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

Back
Top Bottom