Dùng phương thức Find (2 người xem)

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

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

quykh

Chim non
Tham gia
7/9/11
Bài viết
381
Được thích
46
Giới tính
Nữ
Nghề nghiệp
Công Nhân
Em có file này mong các AC chỉnh lại dùng phương thức Find. Chứ tìm phiếu xuất trong validation cỡ 100 phiếu thì mỏi mắt lắm. Nếu tìm không thấy thì hiện MsgBox" Số Phiếu Này Không Có". Mong các AC giúp đỡ.
 

File đính kèm

Em có file này mong các AC chỉnh lại dùng phương thức Find. Chứ tìm phiếu xuất trong validation cỡ 100 phiếu thì mỏi mắt lắm. Nếu tìm không thấy thì hiện MsgBox" Số Phiếu Này Không Có". Mong các AC giúp đỡ.

thứ nhất cứ làm theo yêu cầu của bạn (không théc méc gì cả!!!)
Mã:
Sub Loc_co_dk()
Dim rng As Range
   [B8:F1000].ClearContents
    With Sheet1
        .Range(.[A3], .[H65536].End(3)).AdvancedFilter 2, [C2:C3], [C7:E7]
        Set rng = .Range(.[B65536].End(xlUp), .[B4]).Find([C3], , xlFormulas, xlWhole) 'tim 1 gia tri duy nhat' + row an?
        If Not rng Is Nothing Then
            [C4] = rng.Offset(, -1)
            [C5] = rng.Offset(, 1)
            [C6] = rng.Offset(, 2)
            Range([C8], [C65536].End(3)).Offset(, -1) = [row(a:a)]
        [COLOR=#0000ff]Else
            MsgBox "khong co Ma này"[/COLOR]
        End If
    End With
End Sub
2- thứ nhi théc méc:
ở sheet2, sự kiện worksheet change của bạn: bạn nạp vào dictionary làm gì? rồi để đó? (chắc là định là nguồn cho validation?)
3- có vẻ như ý tưởng của code là lấy các mã (không trùng) ở cột B sheet1 nạp vào dic rồi nạp vào validation C3 sheet2---> nếu vậy thì chắc chắn là khi tìm là phải có, vì vậy bạn không cần thêm lệnh mà bạn yêu cầu, mà bạn nên thêm lệnh nạp vào validation

phải hong ta???!!!
 
Upvote 0
Ý của em là không tìm số phiếu trên Validation nữa mà tìm bằng cách gỏ thẳng vào Cell C3 của sheet 2.(Nên sử dụng Find, không nạp bằng Dic vào Validation nữa) Nhưng phải thỏa mãn là Sub_SuaSLX phải chạy được. Mong các AC giúp đỡ.
 
Upvote 0
Ý của em là không tìm số phiếu trên Validation nữa mà tìm bằng cách gỏ thẳng vào Cell C3 của sheet 2.(Nên sử dụng Find, không nạp bằng Dic vào Validation nữa) Nhưng phải thỏa mãn là Sub_SuaSLX phải chạy được. Mong các AC giúp đỡ.

Bạn làm như file sau (có bảo hành)
Đã tiến hành bảo dưỡng ở #6
 
Lần chỉnh sửa cuối:
Upvote 0
File của bạn vẫn chưa đúng ý mình. vì gỏ số vào Cell D3 thì chỉ hiện số phiếu ở validation trong cell C3, nhưng khi chọn phiếu thì không hiện thông tin đầy đủ của phiếu đó(ngày, đơn vị nhận hàng..VV.vv) và còn nút Sửa Số phải thực hiện được nữa kìa. Bạn nói file bạn có bảo hành là sao?????????
 
Upvote 0
Cám ơn bạn nhe, cách của bạn cũng hay, nhưng mình có tới mấy trăm phiếu xuất thì tìm trên validation mỏi mắt lắm. chi bằng gỏ thẳng phiếu xuất vào cell C3 luôn để tìm. mình thay code Loc_co_dk bằng đoạn code này mà sao sub_SLX lại không chạy:
Mã:
Sub Loc_co_dk()
      Dim findRng As Range
        With Sheet2
               Set findRng = Range(Sheet1.[B4], Sheet1.[B65536].End(xlUp)) _
                           .Find(.[C3], LookIn:=xlValues, LooKat:=xlWhole)
                   .[B8:F1000,C4,C5,C6].ClearContents
        If findRng Is Nothing Then
                  MsgBox "Khong co so phieu nay!", , "Coi Lai!!!!"
               .[C3].ClearContents
        Else
                Range(Sheet1.[A3], Sheet1.[I65536].End(3)).AdvancedFilter 2, .[C2:C3], .[C7:F7]
                  .[C4] = findRng.Offset(, -1).Value
                  .[C5] = findRng.Offset(, 1).Value
                  .[C6] = findRng.Offset(, 2).Value
            Range(.[C8], .[C65536].End(3)).Offset(, -1) = [row(a:a)]
        End If
           Set findRng = Nothing
    End With
End Sub
Mong các AC giúp đỡ.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình hiểu ý bạn rồi, chủ yếu là bạn cần tìm hàm để lấy LIST khi nhập vào 1 vài chử số có sẳn, mình có hàm đó tuy nhiên do file gốc mình chưa share được, mìnnh đang tùy chỉnh lại cho hợp và sẽ gửi lên sớm cho bạn. mình gửi kèm vi`1 dụ hình chụp, khi mình nhập vào "chuột" thi nó sẽ filter tất cả danh mục có chử chuột để mình click chọn thôi, nếu đúng ý như bạn thì mình sẽ chỉnh sửa code lại ( tại mình tai ngang gà mờ VBA , chưa chỉnh ngay được) :(
 

File đính kèm

  • Capture.JPG
    Capture.JPG
    28.2 KB · Đọc: 55
Upvote 0
Cám ơn bạn nhe, cách của bạn cũng hay, nhưng mình có tới mấy trăm phiếu xuất thì tìm trên validation mỏi mắt lắm. chi bằng gỏ thẳng phiếu xuất vào cell C3 luôn để tìm.

Bạn muốn vứt validation đi và gõ trực tiếp vào C3? Nếu thế thì tại sao lại gửi tập tin có validation lên? Để làm phân tán sự chú ý, làm tối "bức ảnh"?

mình thay code Loc_co_dk bằng đoạn code này mà sao sub_SLX lại không chạy:
Sub Loc_co_dk()
Dim findRng As Range
With Sheet2
Set findRng = Range(Sheet1.[B4], Sheet1.[B65536].End(xlUp)) _
.Find(.[C3], LookIn:=xlValues, LooKat:=xlWhole)
.[B8:F1000,C4,C5,C6].ClearContents
If findRng Is Nothing Then
MsgBox "Khong co so phieu nay!", , "Coi Lai!!!!"
.[C3].ClearContents
Else
Range(Sheet1.[A3], Sheet1.[I65536].End(3)).AdvancedFilter 2, .[C2:C3], .[C7:F7]
.[C4] = findRng.Offset(, -1).Value
.[C5] = findRng.Offset(, 1).Value
.[C6] = findRng.Offset(, 2).Value
Range(.[C8], .[C65536].End(3)).Offset(, -1) = [row(a:a)]
End If
Set findRng = Nothing
End With
End Sub
Mong các AC giúp đỡ.

Đỏ đỏ không chạy hay Loc_co_dk không chạy? Nếu là Loc_co_dk không chạy thì lần sau rút kinh nghiệm nhé. Trước khi gửi nên kiểm tra. Sau khi gửi cũng nên kiểm tra.

Nếu nói về Loc_co_dk thì thử xem:

Mã:
Sub Loc_co_dk()
Dim srcRng As Range, findRng As Range, cellAddress As String
    With Sheet2
        Set srcRng = Sheet1.Range(Sheet1.[B4], Sheet1.[B65536].End(xlUp))
        Set findRng = srcRng.Find(.[C3], LookIn:=xlValues, LookAt:=xlWhole)
        .[B8:F1000,C4,C5,C6].ClearContents
        If findRng Is Nothing Then
            MsgBox "Khong co so phieu nay!", , "Coi Lai!!!!"
            .[C3].ClearContents
        Else
            cellAddress = findRng.Address
            Do
                .[C4] = findRng.Offset(, -1).Value
                .[C5] = findRng.Offset(, 1).Value
                .[C6] = findRng.Offset(, 2).Value
                .[C65536].End(xlUp).Offset(1).Resize(, 3).Value = findRng.Offset(, 4).Resize(, 3).Value
                Set findRng = srcRng.FindNext(findRng)
            Loop Until findRng.Address = cellAddress
        End If
        Set findRng = Nothing
        Set srcRng = Nothing
    End With
End Sub
 
Upvote 0
Em đã thử code loc_co_dk của Anh Siwtom mà cũng không chạy Anh ơi. Ý chính của em là tìm thông tin của số phiếu bằng cách gỏ trực tiếp vào cell C3, khi có thông tin về phiếu đó thì sửa số lượng bằng nút Sửa Số lượng(Sub_SuaSLX)
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Em xin lỗi, code loc_co_dk chạy rồi, nhưng code SuaSLX lại không thay đổi số lượng thực xuất đươc. Mong anh Siwtom giúp đỡ.
 
Upvote 0
Em xin lỗi, code loc_co_dk chạy rồi, nhưng code SuaSLX lại không thay đổi số lượng thực xuất đươc. Mong anh Siwtom giúp đỡ.

Bạn hãy miêu tả SuaSLX làm gì. Nó thao tác trên những dữ liệu đầu vào nào, đọc, ghi gì, ở đâu. Cứ thế mà miêu tả.
Đừng bắt người khác phải đọc, dò từng dòng code để đoán ý.
Nếu có thời gian thì tôi sẽ xem. Nhưng phải miêu tả kỹ
 
Upvote 0
Bạn nhớ hết cả mấy trăm phiếu xuất hay sao mà gõ thẳng vào cell C3?
Theo mình nên làm theo cách này: Nhập dữ liệu bằng Form, khi gõ kí tự đầu tiên của từ cần tìm ví dụ chữ c là nó sẽ hiện lên các phiếu có kí tự đầu tiên là chữ c, ví dụ chuot0106, chuot0107, chuotdong, chuotbach...
Với cách này tác giả có thể không cần nhớ hết các mã phiếu, và cách này trên diễn đàn mình cũng có nhiều rồi mà.
 
Upvote 0
Em thì không nhớ hết được cả trăm phiếu xuất đâu. Em tổng hợp lại để còn đối chiếu với người nắm giữ mặt hàng, bởi vậy khi đối chiếu với người giữ hàng thì biết ngay sai ở phiếu nào liền.Nên em sẽ gỏ thẳng vào để chỉnh số lượng xuất.(vì có thể em gỏ lộn số lượng xuất). Mong các Ac chỉ giáo. Với Anh Siwtom, trước đó(Nạp Dic vào Validation) thì sub_SuaSLX chạy được, nhưng sử dụng Loc_co_dk của Anh thì không. Mong Anh giúp đỡ.
 
Upvote 0
Em thì không nhớ hết được cả trăm phiếu xuất đâu. Em tổng hợp lại để còn đối chiếu với người nắm giữ mặt hàng, bởi vậy khi đối chiếu với người giữ hàng thì biết ngay sai ở phiếu nào liền.Nên em sẽ gỏ thẳng vào để chỉnh số lượng xuất.(vì có thể em gỏ lộn số lượng xuất). Mong các Ac chỉ giáo. Với Anh Siwtom, trước đó(Nạp Dic vào Validation) thì sub_SuaSLX chạy được, nhưng sử dụng Loc_co_dk của Anh thì không. Mong Anh giúp đỡ.

Tôi phát biểu hộ bạn để làm mẫu. Lần sau bạn cứ bắt chước thế.

"Khi gõ mã hàng vào ô C3 của sheet2 thì code Loc_co_dk sẽ lọc từ sheet1 các thông tin về mỗi mã hàng có mã như thế và điền vào các ô của sheet2. Tiếp theo user sẽ kiểm tra xem các dữ liệu ở cột E của sheet2 có đẹp không. Nếu không đẹp hoặc trời mưa (đêm qua vợ cấm vận, thua đề ...) thì user sẽ sửa lại các dữ liệu đó và nhấn nút "sửa số" để chạy SuaSLX để đập các dữ liệu ở cột E trở lại vào nơi mà trước đó chúng đã ra đi"

Với cách miêu tả như thế người ta sẽ biết bạn sẽ định làm những gì và trình tự thao tác như thế nào.
-----------
Tôi thêm Data Row vào cột F để ghi nhớ các dòng mà từ đó "SL Thực xuất" đã ra đi. Mục đích để khi chạy sub SuaSLX thì không phải tìm lại những chỗ mà "SL Thực xuất" đã ra đi nữa.

Riêng về sub SortNgay thì tôi thấy chả lý gì lại chạy mỗi khi chạy sub SuaSLX. Chính ra nó chỉ nên chạy mỗi khi user nhập dữ liệu mới vào sheet1, vì chỉ khi đó cột ngày tháng có thể cần sắp xếp lại. Nhưng tôi vẫn để nguyên như bạn muốn.

0. Nhập vào ô F7 của sheet2 giá trị "Data Row"
1. Xóa toàn bộ code của Worksheet_SelectionChange
2. Thay 2 SUB cũ bằng 2 SUB mới trong Module1
Mã:
Sub Loc_co_dk()
Dim srcRng As Range, findRng As Range, currRng As Range, cellAddress As String
    With Sheet2
        Set srcRng = Sheet1.Range(Sheet1.[B4], Sheet1.[B65536].End(xlUp))
        Set findRng = srcRng.Find(.[C3], LookIn:=xlValues, LookAt:=xlWhole)
        .[B8:F1000,C4,C5,C6].ClearContents
        If findRng Is Nothing Then
            MsgBox "Khong co so phieu nay!", , "Coi Lai!!!!"
            .[C3].ClearContents
        Else
            Set currRng = .[C65536].End(xlUp).Offset(1)
            cellAddress = findRng.Address
            Do
                .[C4] = findRng.Offset(, -1).Value
                .[C5] = findRng.Offset(, 1).Value
                .[C6] = findRng.Offset(, 2).Value
                currRng.Resize(, 3).Value = findRng.Offset(, 4).Resize(, 3).Value
                currRng.Offset(, 3).Value = findRng.Row
                Set findRng = srcRng.FindNext(findRng)
                Set currRng = currRng.Offset(1)
            Loop Until findRng.Address = cellAddress
        End If
        Set findRng = Nothing
        Set srcRng = Nothing
        Set currRng = Nothing
    End With
End Sub

Sub SuaSLX()
Dim TenHH As Range
    Application.ScreenUpdating = False
    Set TenHH = Sheet2.[C65536].End(xlUp)
    Do While TenHH.Row > 7
        Sheet1.Range("H" & TenHH.Offset(, 3).Value).Value = TenHH.Offset(, 2).Value
        Set TenHH = TenHH.Offset(-1)
    Loop
    
    MsgBox ("Sua phieu xong")
    SortNgay
    Sheet2.[B8:F1000,C3,C4,C5,C6].ClearContents
    
    Application.ScreenUpdating = True
End Sub
 
Upvote 0
Mong Anh Siwtom giải thích dùm em chổ này: Nhập vào ô F7 của sheet2 giá trị "Data Row" Em không biết làm gì hết.
 
Upvote 0
Mong Anh Siwtom giải thích dùm em chổ này: Nhập vào ô F7 của sheet2 giá trị "Data Row" Em không biết làm gì hết.

Bạn chưa nhập dữ liệu bao giờ? Vd. nhập vào cell: Củ cải, Máy tính bảng, Nữ, Giám đốc, Ghi chú v...v
Thì gõ / nhập / viết vào F7 một chuỗi là "Data Row" thôi.

Trích
Tôi thêm Data Row vào cột F để ghi nhớ các dòng mà từ đó "SL Thực xuất" đã ra đi

Vậy tôi nói bạn phải nhập chuỗi "Data Row vào F7 để người khác hoặc bạn sau một thời gian còn biết là những số trong cột F có nghĩa là gì.
Đơn giản chỉ là tiêu đề như STT, Tên hàng hóa, ĐVT, SL Thực xuất. Bạn không nhập thì code vẫn chạy. Tiêu đề là cho bạn chứ không phải cho code
 
Lần chỉnh sửa cuối:
Upvote 0
Mình gửi bạn file này xem thử. bạn chỉ cần click vào C3 nhập 2 số đầu thì sẽ ra list hoá đơn. sau đó bạn chọn thì sẽ ra dữ liệu.
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom