Làm sao tìm dc 1 MÃ liền kề với MÃ cho trước?

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,912
Tôi gữi file các bạn tham khảo... Các bạn chú ý cột D, đây là toàn bộ MÃ... Giã sử tại 1 cell nào đó tôi gõ 1 MÃ nào đó có trong danh sách, chẳng hạn là GA8, vậy công thức nào đễ tìm ra MÃ liền kề với nó, tức là kết quả tôi mong muốn là GA9... ví dụ tiếp, tôi gõ AA6 thì kết quả mong muốn là AA7... gõ AB9 thì kết quả mong muốn là AC0 vân vân...
Chú ý thêm, danh sách trong cột D chỉ là minh họa.. khi làm thực tế sẽ ko có cột này... Nghĩa là các bạn làm sao ko biết, nhưng tôi xóa luôn cột D nó vẫn ra kết qua như mong muốn!
Mong các bạn góp ý công thức!
ANH TUẤN
 

File đính kèm

anhtuan1066 đã viết:
Tôi gữi file các bạn tham khảo... Các bạn chú ý cột D, đây là toàn bộ MÃ... Giã sử tại 1 cell nào đó tôi gõ 1 MÃ nào đó có trong danh sách, chẳng hạn là GA8, vậy công thức nào đễ tìm ra MÃ liền kề với nó, tức là kết quả tôi mong muốn là GA9... ví dụ tiếp, tôi gõ AA6 thì kết quả mong muốn là AA7... gõ AB9 thì kết quả mong muốn là AC0 vân vân...
Chú ý thêm, danh sách trong cột D chỉ là minh họa.. khi làm thực tế sẽ ko có cột này... Nghĩa là các bạn làm sao ko biết, nhưng tôi xóa luôn cột D nó vẫn ra kết qua như mong muốn!
Mong các bạn góp ý công thức!
ANH TUẤN
Tại sao bác lại không dùng MATCH nhỉ ??
mã liền kề chỉ là MATCH + 1 thôi mà.

-------------------------
Hình như em hiểu sai rồi.
Chắc là làm thành 1 cái UF cho nhanh bác ạ.

Thân!
 
Tuấn xem thử đạt chưa!

Mã:
Option Explicit[B]
Private Sub Worksheet_Change(ByVal Target As Range)[/B]
 Dim LNum As Byte
 Dim StrC As String, Str1 As String, Str2 As String
 If Ucase$(Target) = "ZZ9" Then
    StrC = "QUAN 2 THONG CON KHONG?"
    MsgBox "CFC NGAY DI!", , StrC:             Exit Sub
 End If
 If Not Intersect(Target, Cells(4, 2)) Is Nothing Then
    LNum = CByte(Right(Target, 1))
    Select Case Right(Target, 1)
    Case Is < "9"
        StrC = Left(Target, 2) & CStr(LNum + 1)
    Case Else
        StrC = UCase$(Mid(Target, 2, 1))
        If StrC < "Z" Then
            Str2 = Chr(Asc(StrC) + 1)
            StrC = Left(Target, 1) & Str2 & "0"
        Else
            StrC = Chr(Asc(Left(Target, 1)) + 1) & "A0"
        End If
    End Select
 End If
 MsgBox StrC
[B]End Sub[/B]

--=--
 
Lần chỉnh sửa cuối:
anhtuan1066 đã viết:
Tôi gữi file các bạn tham khảo... Các bạn chú ý cột D, đây là toàn bộ MÃ... Giã sử tại 1 cell nào đó tôi gõ 1 MÃ nào đó có trong danh sách, chẳng hạn là GA8, vậy công thức nào đễ tìm ra MÃ liền kề với nó, tức là kết quả tôi mong muốn là GA9... ví dụ tiếp, tôi gõ AA6 thì kết quả mong muốn là AA7... gõ AB9 thì kết quả mong muốn là AC0 vân vân...
Chú ý thêm, danh sách trong cột D chỉ là minh họa.. khi làm thực tế sẽ ko có cột này... Nghĩa là các bạn làm sao ko biết, nhưng tôi xóa luôn cột D nó vẫn ra kết qua như mong muốn!
Mong các bạn góp ý công thức!
ANH TUẤN

Còn em làm theo dạng UDF, bác xem nhá.

Mã:
[color=darkblue]Function[/color] changecode(oldcode [color=darkblue]As[/color] [color=darkblue]String[/color]) [color=darkblue]As[/color] String
[color=darkblue]Dim[/color] fst [color=darkblue]As[/color] [color=darkblue]Byte[/color], snd [color=darkblue]As[/color] [color=darkblue]Byte[/color], trd [color=darkblue]As[/color] [color=darkblue]Byte[/color]
fst = Asc(UCase(Right(oldcode, 1))) + 1
snd = Asc(UCase(Mid(oldcode, 2, 1)))
trd = Asc(UCase(Left(oldcode, 1)))
    [color=darkblue]If[/color] fst = 58 [color=darkblue]Then[/color]
        fst = 48
        snd = snd + 1
        [color=darkblue]If[/color] snd = 91 [color=darkblue]Then[/color]
            snd = 65
            trd = trd + 1
            [color=darkblue]If[/color] trd = 91 [color=darkblue]Then[/color] trd = 65
    [color=darkblue]End[/color] If:    [color=darkblue]End[/color] If
    
changecode = Chr$(trd) & Chr(snd) & Chr(fst)
End [color=darkblue]Function[/color]
 

File đính kèm

Gợi ý với các bạn cách tôi làm là:
=INDEX(DS, MATCH(cell đang có,DS,0)+1,1)
Mục đích các bạn là đặt name DS ấy như thế nào đễ nó trích dc ra "ông nội" liền kề giống như tôi ví dụ ở trên!

Cột D là danh sách, đồng ý! Nhưng ở đây tôi show lên là đễ mọi người nhìn thấy nguyên tắc của danh sách thôi... Tất nhiên nếu trong file ta có sẳn danh sách này thì còn nói làm gì nữa... Nhưng sẽ có 1 điều bất tiện là nếu danh sách dài đến 60.000 dòng thì.. file sẽ "mệt" ngay... Chính vì lẽ đó mà tôi muốn làm sao có 1 mãng "ảo" nào đó nó mà mỗi phần tử trong mãng ấy giống y chang như mãng của cột D... lúc này thì rõ ràng là cần gì đến cột D nữa chứ, đúng ko? Truy xuất phần tử thứ n trong mãng "ảo" này thì tương đương với truy xuất phần tử thứ n trong mãng cột D...

Làm sao ko biết, miển tôi xóa cột D đi, nhập vào A1= AB8 chẳng hạn thì tôi sẽ dùng 1 công thức đễ lấy dc "ông nội" liền kề với AB8, đó chính là AB9..
Công việc chính của chúng ta là tìm cho ra dc cái mãng "ảo" ấy và đặt nó thành 1 Name.. giã sử tên là DS... Lúc này thì tại cell A2 có phải là tôi sẽ gõ công thức:
=INDEX(DS, MATCH(cell đang có,DS,0)+1,1)

Trong công thức này đâu có chổ nào nói đến cột D đâu, nên xóa đi cũng ko ảnh hưởng... ha.. ha... (tất nhiên DS cũng ko liên quan gì đến cột D cả)

Giãi quyết luôn bài này nha! Đễ ý sẽ thấy file củ nội cái danh sách ở cột D đã chiếm dung lượng khá lớn, hơn 400KB... File này sửa lại ko còn danh sách ấy nữa mà vẫn bảo đãm yêu cầu, dung lượng chỉ còn 13.5K...quá nhẹ!
Các bạn xem nha!

Mời các bạn xem tiếp file này... Đây là file lọc danh sách duy nhất, cũng thấy nhiều trên diển đàn này rồi... Nhưng tôi đang có tham vọng làm cách nào cũng đặt name sao đó đễ bỏ luôn CỘT PHỤ...
Hic.. bài này thì thật sự tôi chưa nghĩ ra... cũng có hướng như chưa đi tới đích dc... Các bạn giúp với.. Hic
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Bài #12 là cho cái post nói về vấn đề hàm indirect mà không xài cột phụ như không ai bỏ qua đây vậy hè?

Tại sao anh không xài advanced filter rồi lọc lấy unique value?

Mến
 
Tôi nói rồi... ko nhất thiết là INDIRECT hay hàm gì cả... miển làm sao ko dùng VBA và cột phụ mà vẫn trích ra dc dữ liệu như ý muốn... Tôi cũng nghĩ nát óc, cuối cùng mới nghĩ ra cái trò INDIRECT... và tôi dám chắc nếu INDIRECT làm việc dc với mãng thì tôi sẽ giãi dc bài này... Hic..
Hoặc giả như dùng ADDRESS cũng dc, nhưng sao nó chẳng ăn thua gì trong bài này cả:
VD: COUNTIF($A$2:$A$100,$A2).. kéo fill xuống.. tôi thay bằng:
COUNTIF($A$2:$A$100,ADDRESS(ROW($A$2:$A$100),1)) Ctrl + Shift + Enter
Thấy cũng khá hợp lý nhưng ko ra kết quả...
Đây chỉ là 1 vài hướng mà tôi nghĩ ra dc... Ko biết các cao thủ khác nghĩ thế nào?
ANH TUẤN
 
anhtuan1066 đã viết:
Mời các bạn xem tiếp file này... Đây là file lọc danh sách duy nhất, cũng thấy nhiều trên diển đàn này rồi... Nhưng tôi đang có tham vọng làm cách nào cũng đặt name sao đó đễ bỏ luôn CỘT PHỤ...
Hic.. bài này thì thật sự tôi chưa nghĩ ra... cũng có hướng như chưa đi tới đích dc... Các bạn giúp với.. Hic

Cách lọc danh sách duy nhất không dùng cột phụ:

http://www.giaiphapexcel.com/forum/showpost.php?p=33205&postcount=61

LM
 

File đính kèm

Tôi thấy cách của Phong là OK mà
 

File đính kèm

Tôi xin rút gọn ct trong file digita
Ma=OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A$1:$A$1000),1): Danh mục cần lấy duy I
SoMa=SUMPRODUCT((1/COUNTIF(Ma,Ma))*1) : Số Mã hàng
MaHang=OFFSET(Sheet1!$A$1,MATCH(0,MMULT(--TRANSPOSE(TRANSPOSE(Ma)=Sheet1!B$1:B1),ROW(INDIRECT("1:"&ROW()-1))/ROW(INDIRECT("1:"&ROW()-1))),0)-1,0,1,1)
B1=A1
B2=IF(COUNTA($B$1:$B1)<SoMahang,mahang,"") ie nếu số mã chưa = số mã hàng thì lấy mahang.
Còn ct thì tôi cũng không dám hiểu.
 

File đính kèm

Lần chỉnh sửa cuối:
Thật ra ai mà nhìn vào mấy công thức này chắc là tối tăm mặt mũi chứ đừng nói là hiểu... Tôi nghĩ quan trọng nhất vẩn là hiểu dc cái nào là "mấu chốt" trong 1 đóng dài lằng nhằng kia...
Theo tôi mấu chốt ở đây chính là công thức mãng:
 
Web KT

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

Back
Top Bottom