Nhờ các bạn tìm lỗi của code

  • Thread starter Thread starter cbtm
  • Ngày gửi Ngày gửi
Liên hệ QC

cbtm

Thành viên mới
Tham gia
16/1/07
Bài viết
35
Được thích
0
Nghề nghiệp
WWW.JABIL.COM
PHP:
Function Find_Range(Find_Item As Variant, _
    Search_Range As Range, _
    Optional LookIn As Variant, _
    Optional LookAt As Variant, _
    Optional MatchCase As Boolean) As Range
    Dim c As Range
    If IsMissing(LookIn) Then LookIn = xlValues
    If IsMissing(LookAt) Then LookAt = xlWhole
    If IsMissing(MatchCase) Then MatchCase = True
    With Search_Range
        Set c = .Find( _
        What:=Find_Item, _
        LookIn:=LookIn, _
        LookAt:=LookAt, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlNext, _
        MatchCase:=MatchCase, _
        SearchFormat:=False)
        If Not c Is Nothing Then
            Set Find_Range = c
            firstAddress = c.Address
            Do
                Set Find_Range = Union(Find_Range, c)
                Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> firstAddress
        End If
    End With
End Function
PHP:
Private Sub CommandButton1_Click()

        Sheets("MAI TU").Range("A65000").End(xlUp).Offset(1, 0).Select
        With ActiveCell
            .Value = UserForm1.DTPicker3.Value
            .Offset(0, 1).Value = UserForm1.TextBox1.Value
            .Offset(0, 2).Value = UserForm1.TextBox2.Value
            .Offset(0, 3).Value = Val(UserForm1.TextBox1.Value) * Val("60%") / Val("100")
            .Offset(0, 4).Value = "=RC[-1]/2-RC[-2]"
            .Offset(0, 5).Value = "=RC[-2]/2+RC[-3]"
            .Offset(0, 6).Value = "=RC[-1]+RC[-2]"
        End With
        
        
End Sub
PHP:
Private Sub finddate()
Sheets("Sheet1").Select
    Dim iNumber
    For iNumber = UserForm1.DTPicker1.Value To UserForm1.DTPicker2.Value Step 1
    On Error Resume Next
    Find_Range(iNumber, Columns("A"), MatchCase:=True).EntireRow.Delete
    Next iNumber
    Cells.Select
    Selection.ColumnWidth = 8.43
    Range("A65536").End(xlUp).Select
End Sub
PHP:
Private Sub CommandButton7_Click()
    Dim MoneyCount
    Range("A1").Select
    Do Until ActiveCell.Value = Empty
    If ActiveCell.Value = "DATE" Then
        ActiveCell.Offset(1, 0).Select
    ElseIf Day(DateValue(ActiveCell.Value)) = Day(DateValue(UserForm1.DTPicker1.Value)) Or
    Day(DateValue(ActiveCell.Value)) > Day(DateValue(UserForm1.DTPicker1.Value)) And _
    Day(DateValue(ActiveCell.Value)) = Day(DateValue(UserForm1.DTPicker2.Value)) Or _
    Day(DateValue(ActiveCell.Value)) < Day(DateValue(UserForm1.DTPicker2.Value)) Then
        MoneyCount = (MoneyCount * 1) + (ActiveCell.Offset(0, 6).Value * 1)
        ActiveCell.Offset(1, 0).Select
    Else
        ActiveCell.Offset(0, 1).Select
    End If
    Loop
    UserForm1.TextBox3.Value = MoneyCount
    End Sub
PHP:
Private Sub CommandButton8_Click()
    With UserForm1
        .TextBox4.Value = "$" & WorksheetFunction.Sum(Range("E:E"))
        .TextBox5.Value = "$" & WorksheetFunction.Sum(Range("F:F"))
        .TextBox3.Value = "$" & WorksheetFunction.Sum(Range("G:G"))
    End With
    
End Sub
 
Lần chỉnh sửa cuối:
Hàm đầu tiên, xin giải thích, bạn tự tìm tiếp nha

Để tiện trao đổi, tôi xin chỉnh lại nội dung hàm, như sau

PHP:
Option Explicit
Function Find_Range(Find_Item As Variant, Search_Range As Range, _
   Optional LookIn As Variant, Optional LookAt As Variant, _
   Optional MatchCase As Boolean) As Range
Dim Rng As Range:             Dim firstAddress As String

2 If IsMissing(LookIn) Then LookIn = xlValues
If IsMissing(LookAt) Then LookAt = xlWhole
4 If IsMissing(MatchCase) Then MatchCase = True
   With Search_Range
6      Set Rng = .Find(What:=Find_Item, LookIn:=LookIn, LookAt:=LookAt, _
             SearchOrder:=xlByRows, _
         SearchDirection:=xlNext, MatchCase:=MatchCase, SearchFormat:=False)
       If Not Rng Is Nothing Then
8         Set Find_Range = Rng
         firstAddress = Rng.Address
10         Do
            Set Find_Range = Union(Find_Range, Rng)
12            Set Rng = .FindNext(Rng)
         Loop While Not Rng Is Nothing And Rng.Address <> firstAddress
14      End If
   End With   
End Function

Hàm này có mục đích: Áp dụng phương thức FIND() để tìm tất thảy các ô thỏa điều kiện của thông số (Find_Item As Variant) mà ta cung cấp cho hàm

Để hiểu về hàm này, theo mình bạn nên đến bài
http://giaiphapexcel.com/forum/showthread.php?t=15116
đọc để hiểu ít nhiều về phương thức này

Một khi bạn đã hiểu tương đối về phương thức đó thì hiểu về hàm là thứ nhỏ lẻ mà thôi!


Giải thích các dòng lệnh:

D1: Khai báo 1 biến có kiểu dữ liệu là Range
D2-D4: Nếu người dùng không cung cấp 3 thông số tùy chọn, thì hãy lấy các thông số của VBA
D5: Với vùng Search_Range (vùng để ta tìm kiếm tại đó)
D6: Dùng phương thức FIND() để tìm ô (Range) đầu tiên chứa trị Find_Item
D7: Điều kiện, nếu tìm thấy (Thì thực thi các lệnh trước dòng lệnh 15)
D8: Ô tìm thấy được gán vô, trở thành 1 thành tố của hàm)
D9: Gán địa chỉ ô tìm thấy đầu tiên vô biến chuỗi firstAddress (Lưu í, Trong hàm của bạn, người ta chưa khai báo biến này; Vì chúng ta học không bài bản, trường lớp, nên tôi luôn có dùng khai báo Option Explicit - Khai báo này bắt buột phải khai báo tất cả các biến trước khi dùng. Do lẽ đó ta thấy khai báo như phần sau của dòng lệnh 1 được thêm vô như trên)
Tại sao phải gán & lưu giữ địa chỉ này chi vậy?
Tại vì ta sẽ tìm nhiều những ô cùng có trị cần tìm. Việc tìm này phải dùng vòng lặp Do . . .Loop Và việc gán vô biến chuỗi địa chỉ tìm thấy, sẽ làm cho ta thoát vòng lặp khi cần thiết (ở dòng lệnh thoát vòng lặp bên dưới)
D10-D13: Tạo vòng lặp để tìm cho hết những ô có chứa trị cần tìm)
D11: Nếu tìm thấy ô nào khác thỏa ta tiếp tục gán vô trở thành thành tố của hàm
D12: Ra lệnh tìm tiếp
D13: Lệnh kết thúc vòng lặp tìm kiếm
Lúc này quá trình tìm kiếm lại trở về ô đầu tiên tìm thấy

Hàm sẽ cho ta vùng chứa các trị trùng với tham số Find_Item mà ta cung cấp cho hàm ngay ban đầu.
:-= --=0
 
Upvote 0
Sửa code lỗi xong.
Ghi chú:
- Code chưa tối ưu, nhưng tạm gọi là dễ hiểu.
- Hàm Find_Range() không cần dùng tới
- CommandButton7 dùng để xóa dòng theo điều kiện
- Xóa dòng từ dưới lên trên
- Sửa điều kiện "< or =" thành "<=""> or =" thành ">=". Dòng này thiếu 1 dấu _ xuống dòng nên sai.
- nhân val("60%") làm gì rồi lại phải chia val("100") ? Sửa lại nhân với 0.6 cho khỏe
 

File đính kèm

Upvote 0
Cám ơn các bạn rất nhiều, và cám ơn bạn ptm0412 giúp đở, thành thật cám ơn các bạn

Nhờ bạn xem hộ lại code
mình muốn cash hiện lên phần cash, check hiện lên phần check, total hiện lên phần check và total cộng lại
cám ơn các bạn
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Private Sub CommandButton7_Click()
    TextBox4 = Format(TextBox1 * 0.3 - TextBox2, "#,###")
    TextBox5 = Format(TextBox1 * 0.3 + TextBox2, "#,###")
    TextBox3 = Format(TextBox4 * 1 + TextBox5 * 1, "#,###")
End Sub
không Do - Loop vì chỉ tính 1 record ngay trên form
 
Upvote 0
Chào Bạn PTM0412.

Mình cám ơn bạn về phần hướng dẩn, phần trên bạn viết đúng ý mình muốn, như phần cash và check thì không hiện lên được. bạn có thể giúp mình một lần nửa không vậy, cám ơn bạn
 
Upvote 0
Xem file, chả có lý nào mà không chạy.
 

File đính kèm

Upvote 0
Chào Bạn

Khi mình chạy thử, thì nó bị run time error 13. hoi end or Debug
 
Upvote 0
Web KT

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

Back
Top Bottom