Find Method cho kết quả sai? (1 người xem)

Liên hệ QC

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

ngoyeubebu

Thành viên chính thức
Tham gia
7/6/13
Bài viết
89
Được thích
5
Mình vào sheet HoaDon rồi nhấn nút Loa Sua Hoa Don nó hiên lên các danh sách gồm số hóa đơn , ngày , mã khách hàng , và tên khách hàng để lựa chọn . nhưng khi chọn hóa đơn cần sửa thì nó lại load hết các hóa đơn khác nữa . Các Pro giúp mình với
Thanks
 

File đính kèm

Mình vào sheet HoaDon rồi nhấn nút Loa Sua Hoa Don nó hiên lên các danh sách gồm số hóa đơn , ngày , mã khách hàng , và tên khách hàng để lựa chọn . nhưng khi chọn hóa đơn cần sửa thì nó lại load hết các hóa đơn khác nữa . Các Pro giúp mình với
Thanks
Không phải Pro có giúp được bạn không?

Trong đoạn Code của nút Chọn có đoạn
Mã:
Set Cl = .Find(Me.ListBox1.Value, LookIn:=xlValues)

Bạn sửa thành
Mã:
Set Cl = .Find(Me.ListBox1.Value, LookIn:=xlValues[B][COLOR=#ff0000],[/COLOR][/B] [B][COLOR=#ff0000]Lookat:=xlWhole[/COLOR][/B])
 
Upvote 0
Thanks ban rất nhiều hihi.
Mình đã sửa đoạn code như bạn và nó ko lỗi nữa
Bạn có thể giải thích cho mình hiểu thêm 1 chút không hihi tại mình không hiểu rõ tại sao thêm lại thêmLookat:=xlWhole
Mình còn 1 vấn đề nữa cần bạn giúp nữa . hihi
Trong cái bảng Nhập hàng trên sheet HoaDon ý, list trong Form thì ghi là Ủng Nữ Nâu nhưng khi mình kích vào thì trên hóa đơn nó lại hiện là Ủng Nữ Đen . Mình không hiểu tại sao nữa .
thanks ban nhiều nhiều
 
Upvote 0
Thanks ban rất nhiều hihi.
Mình đã sửa đoạn code như bạn và nó ko lỗi nữa
Bạn có thể giải thích cho mình hiểu thêm 1 chút không hihi tại mình không hiểu rõ tại sao thêm lại thêmLookat:=xlWhole
Mình còn 1 vấn đề nữa cần bạn giúp nữa . hihi
Trong cái bảng Nhập hàng trên sheet HoaDon ý, list trong Form thì ghi là Ủng Nữ Nâu nhưng khi mình kích vào thì trên hóa đơn nó lại hiện là Ủng Nữ Đen . Mình không hiểu tại sao nữa .
thanks ban nhiều nhiều
Mình trả lời 2 thắc mắc của bạn
1/ Lookat:=xlWhole: Khi bạn tiến hành tìm kiếm không có đoạn này Excel sẽ tìm kiếm theo kiểu tương đối. Tức là tìm những ô có chứa ký tự tìm kiếm (VD: tìm số 1 thì các ô trả về có thể là 1, 10, 121, 00081, 562123 => Có chứa ký tự 1 trong chuỗi). Do đó kết quả trả về là ô đầu tiên thỏa mãn
2/ Màu của Ủng: bạn dựa vào câu lệnh sau để tìm kiếm trong sheet DATA dựa vào Mã
Mã:
Set Cl = Sheet1.Columns("B").Find(what:=Me.LBData.Value)
=> Code sẽ tìm kiếm tại cột B dòng đầu tiên có mã. Vậy với ủng nữ bạn có 1 mã MU02 nhưng tương ứng lại có 2 màu đen và nâu, đen là ô đứng trên => Code tìm được mã và ô bên trên là Nâu.
* Vậy bạn có thể thêm 1 tiền tố vào mã để tìm hoặc bạn đặt điều kiện so sánh để thiết đặt (chắc cái này bạn làm được)
=> Góp ý:
1/ Bạn nên dùng tìm kiếm chính xác trong câu lệnh Find để tránh sai sót
2/ Khi chọn từ Form vào sheet bạn có thể dùng trực tiếp sự kiện LBData_Change() để đưa dữ liệu từ Form qua sheet, không cần truy vấn lại sheet
 
Upvote 0
Mình trả lời 2 thắc mắc của bạn
1/ Lookat:=xlWhole: Khi bạn tiến hành tìm kiếm không có đoạn này Excel sẽ tìm kiếm theo kiểu tương đối. Tức là tìm những ô có chứa ký tự tìm kiếm (VD: tìm số 1 thì các ô trả về có thể là 1, 10, 121, 00081, 562123 => Có chứa
Thí nghiệm:
- Mở 1 file Excel trắng
- Gõ 221100 vào A3
- Gõ 11 vào A4
Viết code:
Mã:
Sub Test()
  Dim rng As Range
  Set rng = Range("A1:A10")
  [COLOR=#ff0000]rng.Find("11").Select[/COLOR]
End Sub
- Chạy code trên, cell A3 sẽ được chọn (chứng tỏ nó tìm tương đối)
- Sửa code thành:
Mã:
Sub Test()
  Dim rng As Range
  Set rng = Range("A1:A10")
  r[COLOR=#ff0000]ng.Find("11", , xlValues, xlWhole).Select[/COLOR]
End Sub
- Chạy code, cell A4 sẽ được chọn (chứng tỏ nó tìm chính xác)
- Giờ lại sửa code thành:
Mã:
Sub Test()
  Dim rng As Range
  Set rng = Range("A1:A10")
  [COLOR=#ff0000]rng.Find("11").Select[/COLOR]
End Sub
Tức là giống như lúc đầu
- Chạy code, ta sẽ thấy cell A4 vẫn được chọn (thay vì cell A3 như code đầu tiên)
- Kiểm tra: Bấm Ctrl + F mở hộp Find and Replace ra, bấm nút Options, ta sẽ thấy mục "Match entire cell contents" đã được check
-----------------
Tóm lại: Trong Find Method, nếu không ghi đầy đủ các thông số thì Find sẽ tìm theo những thiết lập trước đó
 
Upvote 0
Bạn ghi Macro các thao tác find sẽ thấy:

Lookat:=xlWhole tương ứng tìm trọn ô giống như vậy (Match entire cell contents)
 
Upvote 0
Mọi người ơi . Mình đã fix xong các lỗi trên nhưng khi mình nhấn lưu hóa đơn thì tốc độ lưu vẫn hơi chậm . Có cách nào cải thiện hay loại bỏ các đoạn code thừa để cải thiện tốc độ sử lý không ạ.
Và khi nhập dữ liệu từ hóa đơn như vào sheet HĐ 2013 như của mình trong file thì sử lý dữ liệu như thế nào vậy mọi người. Ví dư Như tính tổng tiền theo Ngày, Tháng , Loại hàng trong tháng chẳng hạn . Có nên dùng được Sub Tottal ko mọi người
mong mọi người cho ý kiến.
Thanks
 

File đính kèm

Upvote 0
Mình thấy cái sai cơ bản của Sheet Hoá đơn phải sửa đã, còn cái chuyện nhập sẽ sử lý sau:
1/Cái Form Data giờ không dùng chung cho nhiều Sheet mà nó chỉ áp dụng cho Sheet Hoá đơn nên bạn phải điều chỉnh lại:

+Xoá Code Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) trong This Workbook.

+Thêm trong phần Code của Sheet Hoa don:

Mã:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim i
i = 11
   Do
     If Cells(i, 4) = "" And Cells(i, 5) = "" And Cells(i, 6) = "" And Cells(i, 7) = "" Then
        Cells(i, 4).Select
        frmData.Show
        Exit Do
     End If
     i = i + 1
   Loop
End Sub

Giờ thì Form mới trả về dữ liệu đúng vị trí chứ. (Vì bạn thêm cột nên code phải thay đổi theo)
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn sửa thêm Sub PrintData

-Bỏ khai báo Cl và gán Cl qua tìm kiếm vì nó làm chậm tốc độ nạp vì LBData đã có đủ dữ liệu.
-Thêm 1 đoạn để nhập số lượng luôn


Mã:
Sub PrintData()
Dim j As Integer, Sl As Long
For j = 0 To 3
ActiveCell.Offset(, j) = Me.LBData.Column(j)
Next
Do
Sl = Application.InputBox("Nhap So luong cua ma " & Me.LBData, "NHAP DL", , , , , , 1)
If Sl > 0 Then
ActiveCell.Offset(, 4) = Sl
Exit Do
End If
Loop
ActiveCell.Offset(1).Select
End Sub
 
Upvote 0
Thanks bạn rất nhiều. hihi
Nhưng còn một vấn để nữa là khi mình muốn thay đổi số lượng trên sheet hóa đơn thì tổng giá trị hóa đơn sẽ thay đổi nhưng khi mình thay đổi giá các mặt hàng thì tổng hóa đơn lại không thay đổi.
Có cách nào khắc phục điều này ko bạn.
thanks
 

File đính kèm

Upvote 0
Mình không biết chuyện gì đã diễn ra qua các bài đến giờ; Nhưng mình có vài góp ý nhỏ

.....“lạc đề” một chút:

(1) Đã làm việc với VBA thì tên trang tính không nên là “HĐ2013’ mà nên là ‘HD2013’;

(2) Ở trang ‘NO2013’ ba dòng kể từ dòng 6 bạn tô màu nguyên dòng là chưa biết tiết kiệm! Theo mình chỉ nên tô các ô có dữ liệu mà thôi; Cụ thể là tô đến cột ‘DT’ là đủ xài rồi. Đừng có xả láng như vậy chứ bạn!

(3) Các câu lệnh viết trong các macro của bạn rất khó nhìn, như

Mã:
[B]Private Sub CmdLuuHD_Click()[/B]
Dim Cl As Range, i, j
'Kiem tra truoc khi nhap
If Ktra() Then
'Xoa nhung chung tu trung so
i = Sheet4.Cells(Sheet4.Rows.Count, 1).End(3).Row
Do
If i < 2 Then Exit Do
If Sheet4.Cells(i, 1).Value = Sheet2.[D6].Value Then
Sheet4.Cells(i, 1).Resize(, 12).Delete Shift:=xlUp
End If
i = i - 1
Loop
'Nhap du lieu vao luu
Set Cl = Sheet4.Cells(Sheet4.Rows.Count, 1).End(3).Offset(1)
For i = 11 To 29
If Sheet2.Cells(i, 4) <> "" And Sheet2.Cells(i, 8) <> 0 Then
Cl.Value = Sheet2.[D6].Value
Cl.Offset(, 1).Value = Sheet2.[H6].Value
Cl.Offset(, 2).Value = Sheet2.[H8].Value
Cl.Offset(, 3).Value = Sheet2.[E8].Value
For j = 4 To 9
Cl.Offset(, j).Value = Sheet2.Cells(i, j).Value
Next
Cl.Offset(, 10).Value = Sheet2.[I30].Value
Cl.Offset(, 11).Value = Sheet2.[I31].Value
Cl.Offset(, 12).Value = Sheet2.[I32].Value
Cl.Offset(, 13).Value = Sheet2.[I33].Value
Set Cl = Cl.Offset(1)
End If
Next
CmdNhapMoi_Click
End If
[B]End Sub [/B]

Nên tập thói quen để viết như sau:

PHP:
 Private Sub CmdLuuHD_Click()
  Dim Cl As Range, I As Long, J As Byte          '<=|'
  'Kiem Tra Truóc Khi Nhap:'
  If Ktra() Then
    'Xoa Nhung Chúng Tù Trùng Só:'
    I = Sheet4.Cells(Sheet4.Rows.Count, 1).End(3).Row
    Do
        If I < 2 Then Exit Do
        If Sheet4.Cells(I, 1).Value = Sheet2.[D6].Value Then
            Sheet4.Cells(I, 1).Resize(, 12).Delete Shift:=xlUp
        End If
        I = I - 1
    Loop
    'Nhap Du Lieu Vào "Luu":'
    Set Cl = Sheet4.Cells(Sheet4.Rows.Count, 1).End(3).Offset(1)
    For I = 11 To 29
        If Sheet2.Cells(I, 4) <> "" And Sheet2.Cells(I, 8) <> 0 Then
            Cl.Value = Sheet2.[D6].Value
            Cl.Offset(, 1).Value = Sheet2.[H6].Value
            Cl.Offset(, 2).Value = Sheet2.[H8].Value
            Cl.Offset(, 3).Value = Sheet2.[E8].Value
            For J = 4 To 9
                Cl.Offset(, J).Value = Sheet2.Cells(I, J).Value
            Next            '<=| Nen Là Next J'
            Cl.Offset(, 10).Value = Sheet2.[I30].Value
            Cl.Offset(, 11).Value = Sheet2.[I31].Value
            Cl.Offset(, 12).Value = Sheet2.[I32].Value
            Cl.Offset(, 13).Value = Sheet2.[I33].Value
            Set Cl = Cl.Offset(1)
        End If
    Next                    '<=| Nen Là Next i'
    CmdNhapMoi_Click
 End If
End Sub

Thói quen này sẽ giúp bạn tránh những lỗi thô thiển như
có ‘Do’ mà không có ‘Loop’
Có ‘For’ mà thiếu ‘Next’
Có If mà thiếu ‘End If’, . . . . .

Bỏ quá cho mình, nếu đọc thấy fiền lòng!
 
Upvote 0
Thanks bạn rất nhiều. hihi
Nhưng còn một vấn để nữa là khi mình muốn thay đổi số lượng trên sheet hóa đơn thì tổng giá trị hóa đơn sẽ thay đổi nhưng khi mình thay đổi giá các mặt hàng thì tổng hóa đơn lại không thay đổi.
Có cách nào khắc phục điều này ko bạn.
thanks

Bạn thêm 1 cái If nữa trong Code Private Sub Worksheet_Change(ByVal Target As Range) như sau:

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
  If Not Intersect(Target, [H11:H29]) Is Nothing Then
        Target.Offset(, 1).Value = Target.Offset(, -1).Value * Target.Value
            [I30].Value = Evaluate("=sum(I11:I29)")
                [I33].Value = [I30].Value - [I31].Value - [I32].Value
                    End If
    If Not Intersect(Target, [G11:G29]) Is Nothing Then
        Target.Offset(, 2).Value = Target.Offset(, 1).Value * Target.Value
            [I30].Value = Evaluate("=sum(I11:I29)")
                [I33].Value = [I30].Value - [I31].Value - [I32].Value
                    End If
    If Not Intersect(Target, [I31:I32]) Is Nothing Then
         [I30].Value = Evaluate("=sum(I11:I29)")
            [I33].Value = [I30].Value - [I31].Value - [I32].Value
                End If
End Sub
 
Upvote 0
Thanks bạn rất nhiều. hihi
Nhưng còn một vấn để nữa là khi mình muốn thay đổi số lượng trên sheet hóa đơn thì tổng giá trị hóa đơn sẽ thay đổi nhưng khi mình thay đổi giá các mặt hàng thì tổng hóa đơn lại không thay đổi.
Có cách nào khắc phục điều này ko bạn.
thanks

Topic này càng lúc càng đi xa so với chủ đề ban đầu, chả liên quan gì đến Find Method cả
Đề nghị chủ topic xem lại, nếu hỏi vấn đề không liên quan thì vui lòng mở topic khác mà hỏi
(Tôi định tách bài ra mà cũng không biết là đang hỏi về vấn đề gì nữa)
 
Upvote 0
Bạn thêm 1 cái If nữa trong Code Private Sub Worksheet_Change(ByVal Target As Range) như sau:

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
  If Not Intersect(Target, [H11:H29]) Is Nothing Then
        Target.Offset(, 1).Value = Target.Offset(, -1).Value * Target.Value
            [I30].Value = Evaluate("=sum(I11:I29)")
                [I33].Value = [I30].Value - [I31].Value - [I32].Value
                    End If
    If Not Intersect(Target, [G11:G29]) Is Nothing Then
        Target.Offset(, 2).Value = Target.Offset(, 1).Value * Target.Value
            [I30].Value = Evaluate("=sum(I11:I29)")
                [I33].Value = [I30].Value - [I31].Value - [I32].Value
                    End If
    If Not Intersect(Target, [I31:I32]) Is Nothing Then
         [I30].Value = Evaluate("=sum(I11:I29)")
            [I33].Value = [I30].Value - [I31].Value - [I32].Value
                End If
End Sub

Bạn ơi mình đã thêm 1 hàm If nưa nhưng khi nhấn Nhập Mới trên sheet hóa đơn nó lại bị lỗi.
Mình ko hiểu nữa tại sao lại thế nữa.
Thanks ban
 
Upvote 0
Topic này càng lúc càng đi xa so với chủ đề ban đầu, chả liên quan gì đến Find Method cả
Đề nghị chủ topic xem lại, nếu hỏi vấn đề không liên quan thì vui lòng mở topic khác mà hỏi
(Tôi định tách bài ra mà cũng không biết là đang hỏi về vấn đề gì nữa)

Thanks ban đã góp ý.
 
Upvote 0

Nếu bạn đã cảm ơn, chứng tỏ đã hiểu được VẤN ĐỀ.
Vậy bạn có 2 lựa chọn:
1> Gợi ý cho tôi 1 cái tiêu đề nào đó, tôi sẽ dời những bài không liên quan sang 1 topic khác phù hợp
2> Tự bạn mở 1 topic khác để hỏi
Đương nhiên vẫn có lựa chọn thứ 3: Tôi sẽ xóa toàn bộ các bài không liên quan ra khỏi topic này
Chờ câu trả lời của bạn
---------------
1 topic mà hỏi lung tung đủ loại chủ đề thì GPE sẽ nhanh chóng trở thành đống rác. Mai này muốn tìm kiếm 1 chủ đề nào đó cũng không phải chuyện dễ. Vậy nên tôi muốn dọn dẹp sạch ngay từ đâu. Hy vọng các bạn hợp tác cho
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu bạn đã cảm ơn, chứng tỏ đã hiểu được VẤN ĐỀ.
Vậy bạn có 2 lựa chọn:
1> Gợi ý cho tôi 1 cái tiêu đề nào đó, tôi sẽ dời những bài không liên quan sang 1 topic khác phù hợp
2> Tự bạn mở 1 topic khác để hỏi
Đương nhiên vẫn có lựa chọn thứ 3: Tôi sẽ xóa toàn bộ các bài không liên quan ra khỏi topic này
Chờ câu trả lời của bạn
---------------
1 topic mà hỏi lung tung đủ loại chủ đề thì GPE sẽ nhanh chóng trở thành đống rác. Mai này muốn tìm kiếm 1 chủ đề nào đó cũng không phải chuyện dễ. Vậy nên tôi muốn dọn dẹp sạch ngay từ đâu. Hy vọng các bạn hợp tác cho

Ko có gi đó là công việc của bạn mà
Tại càng làm thì nó càng phát sinh thêm nhưng vấn đề khác nên mình ko muốn lập topic mới.vì toàn những lỗi nhỏ đơn giản nên lập ra topic cũng ko biêt gọi tên thế nào hi hi
Bạn chuyển những bài của mình sang một topic khác cũng được. nhưng đợi bác Sealand giải đáp nốt thắc mắc trên của mình đã nha.
Thanks ban nhiều
 
Upvote 0

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

Back
Top Bottom