Nhờ anh chị lọc ra những số không trùng nhau. (1 người xem)

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

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

NoPain

Thành viên mới
Tham gia
1/8/12
Bài viết
4
Được thích
0
Chào anh chị, em nhờ anh chị làm cho em một hàm lọc như sau ạ:
- Em muốn lọc những số, là số có 10 chữ số, số có dạng 093xxxxxxx , số thỏa mãn điều kiện là các số không trùng nhau. tức là các số không lặp lại nhau, từ 0 đến 9, không bắt buộc theo thứ tự ạ
- Vì đặc thù là file số , nên số đầu tiên lúc nào cũng là số 0, nên có thể loại 0 ra, số có dạng 93abcdefg, ngoài 93 ra thì abcdefg có thể là 1 hoặc 2 hoặc 4 hoặc 5 hoặc 6 hoặc 7 hoặc 8 , abcdefg không trùng nhau.
- Ví dụ 938246157
- Em đính kèm 1 file số kèm, anh chị làm giúp em ạ. Em cảm ơn anh/ chị nhiều !!!!
 

File đính kèm

Chào anh chị, em nhờ anh chị làm cho em một hàm lọc như sau ạ:
- Em muốn lọc những số, là số có 10 chữ số, số có dạng 093xxxxxxx , số thỏa mãn điều kiện là các số không trùng nhau. tức là các số không lặp lại nhau, từ 0 đến 9, không bắt buộc theo thứ tự ạ
- Vì đặc thù là file số , nên số đầu tiên lúc nào cũng là số 0, nên có thể loại 0 ra, số có dạng 93abcdefg, ngoài 93 ra thì abcdefg có thể là 1 hoặc 2 hoặc 4 hoặc 5 hoặc 6 hoặc 7 hoặc 8 , abcdefg không trùng nhau.
- Ví dụ 938246157
- Em đính kèm 1 file số kèm, anh chị làm giúp em ạ. Em cảm ơn anh/ chị nhiều !!!!

Tại B1 em dùng hàm:
=IF(COUNTIF(A1:A1547,A1)>1,"Trùng"," ")

Rồi Fill xuống, sau đó dùng AutoFilter ở cột B em chọn trùng rồi chọn những dòng có chữ Trùng và click phải chuột chọn Delete Row là không còn trùng nữa.

Hoặc dùng Advanced Filter thì lẹ hơn mà không cần xóa:
Em chọn từ A1 đến A1547 rồi vào Data > Filter > Advanced Filter làm xuất hiện cửa sổ Advanced Filter và đánh dấu chọn vào Copy To Another Location xong Click vào khung bên phải Copy To và vào bảng tính Click vào B1(có thể click vào C1 hoặc D1) là tùy theo bạn muốn đặt dữ liệu ở vị trí nào, sau đó vào cửa sổ Advanced Filter và đánh dấu chọn vào Unique Records Only và nhấn nút OK, vậy là em đã có danh sách những số không trùng lặp.

 
Lần chỉnh sửa cuối:
Upvote 0
Thử với code này xem thế nào
PHP:
Sub loc()
Dim dl(), i, x, k, dk, kq(), j
dl = Range([A1], [a65536].End(3)).Value
ReDim kq(1 To UBound(dl), 1 To 1)
 With CreateObject("scripting.dictionary")
For i = 1 To UBound(dl)
   For x = 3 To 9
      dk = Mid(dl(i, 1), x, 1)
      If Not .exists(dk) Then
         .Add dk, ""
      Else
         k = k + 1
      End If
   Next
   If k = 0 Then
      j = j + 1
      kq(j, 1) = dl(i, 1)
   End If
   k = 0
   .RemoveAll
Next
End With
[B1].Resize(j) = kq
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thử với code này xem thế nào
PHP:
Sub loc()
Dim dl(), i, x, k, dk, kq(), j
dl = Range([A1], [a65536].End(3)).Value
ReDim kq(1 To UBound(dl), 1 To 1)
 With CreateObject("scripting.dictionary")
For i = 1 To UBound(dl)
   For x = 3 To 9
      dk = Mid(dl(i, 1), x, 1)
      If Not .exists(dk) Then
         .Add dk, ""
      Else
         k = k + 1
      End If
   Next
   If k = 0 Then
      j = j + 1
      kq(j, 1) = dl(i, 1)
   End If
   k = 0
   .RemoveAll
Next
End With
[B1].Resize(j) = kq
End Sub
hic, em thử vẫn ko đc
anh hướng dẫn ký hơn cho e đc không ạ
 
Upvote 0
Chào anh chị, em nhờ anh chị làm cho em một hàm lọc như sau ạ:
- Em muốn lọc những số, là số có 10 chữ số, số có dạng 093xxxxxxx , số thỏa mãn điều kiện là các số không trùng nhau. tức là các số không lặp lại nhau, từ 0 đến 9, không bắt buộc theo thứ tự ạ
- Vì đặc thù là file số , nên số đầu tiên lúc nào cũng là số 0, nên có thể loại 0 ra, số có dạng 93abcdefg, ngoài 93 ra thì abcdefg có thể là 1 hoặc 2 hoặc 4 hoặc 5 hoặc 6 hoặc 7 hoặc 8 , abcdefg không trùng nhau.
- Ví dụ 938246157
- Em đính kèm 1 file số kèm, anh chị làm giúp em ạ. Em cảm ơn anh/ chị nhiều !!!!

Bạn nên viết cho chính xác.
Không thể là: "số thỏa mãn điều kiện là các số không trùng nhau"
Đã là "số" tức 1 "số" thì "các số" là cái gì?

Khi bạn có 1 số thì các "phần tử" nhỏ nhất của nó là "các chữ số". Người ta nói: "Cho một số có bốn chữ số" chứ không ai nói: "Cho một số có bốn số" cả.

Có thể bạn cho là tôi "bới bèo ra bọ" nhưng nếu bạn nói không chính xác thì nhiều người có thói quen đọc thoáng qua sẽ hiểu lầm ý bạn.
Bằng chứng? Nếu tôi không lầm thì trong chủ đề này đã có bạn hiểu sai ý của bạn rồi đấy.

Bạn viết: "số có dạng 093xxxxxxx", nhưng trong tập tin đính kèm còn có các số có dạng 090x...x
Vậy ý bạn muốn gì? Chỉ lấy các các số dạng 093xxxxxxx (trong file thì là dạng 93xxxxxxx) với đk là các chữ số khác nhau từng đôi một?

Và nên thay tiêu đề "Nhờ anh chị lọc ra những số không trùng nhau" bằng "Nhờ anh chị lọc ra những số có các chữ số không trùng nhau". Tôi nghĩ tiêu đề của bạn làm be09 hiểu lầm.
-------------
Tôi mổ xẻ code của quanghai chút.
1. Code của quanghai lấy cả số dạng 90x...x, tôi cho là không hiểu được ý của chủ topic, không tính lỗi này.
2. Code của quanghai xét các chữ số từ 3 tới 9 (For x = 3 To 9) nên sai. Vd. số 935129468 được code chọn vì 7 chữ số cuối (5129468) khác nhau từng đôi một. Nhưng rõ ràng số 935129468 không thỏa đk vì có chữ số 9 lặp lại.
3. Code của quanghai không tối ưu.
[GPECODE=vb]
For x = 3 To 9
dk = Mid(dl(i, 1), x, 1)
If Not .exists(dk) Then
.Add dk, ""
Else
k = k + 1
End If
Next
[/GPECODE]

Ta thấy vòng lặp FOR luôn thực hiện 7 lần, bất kể các chữ số có lặp lại hay không. Trong khi đó nếu gặp trường hợp chữ số nào đó lặp lại thì điều đó có nghĩa là số đang xét chắc chắn "không tốt", vậy ra khỏi ngay vòng lặp cho khỏi tốn điện nước.
Vd. xét số 931145678 --> FOR được thực hiện 7 lần trong khi có thể ra khỏi FOR khi thực hiện vòng lặp thứ 2.

Vậy tôi đề nghị code như sau, có sửa cận dưới của FOR và tối ưu, và bổ sung để chỉ lấy số dạng 93x...x trong đó x cũng phải <> 0, nhưng vẫn giữ ý tưởng của quanghai - dùng "đít to đít nhỏ"

Tôi đề nghị thôi chứ không áp đặt đâu nhé. Mà ở đây ta góp ý cho nhau cũng là để học hỏi thêm một cái gì đó thôi. Đúng sai là chuyện thường, con người mà chứ có phải máy đâu.

[GPECODE=vb]
Sub loc()
Dim dl(), i, x, k, dk, kq(), j, so, bad As Boolean
dl = Range([A1], [a65536].End(3)).Value
ReDim kq(1 To UBound(dl), 1 To 1)
With CreateObject("scripting.dictionary")
For i = 1 To UBound(dl)
so = dl(i, 1)
If Left(so, 2) = "93" Then
.Add "0", ""
.Add "9", ""
.Add "3", ""
bad = False
For x = 3 To 9
dk = Mid(so, x, 1)
If Not .exists(dk) Then
.Add dk, ""
Else
bad = True
Exit For
End If
Next
If Not bad Then
j = j + 1
kq(j, 1) = so
End If
.RemoveAll
End If
Next
End With
[B1].Resize(j) = kq
End Sub
[/GPECODE]

Nếu tôi viết thì có lẽ tôi sẽ dùng code sau:

[GPECODE=vb]
Sub loc()
Dim dl(), i, x, dk, kq(), j, so, bad As Boolean
dl = Range([A1], [a65536].End(3)).Value
ReDim kq(1 To UBound(dl), 1 To 1)
For i = 1 To UBound(dl)
so = dl(i, 1) & "0"
If Left(so, 2) = "93" Then
bad = False
For x = 1 To 9
dk = Mid(so, x, 1)
If InStr(x + 1, so, dk) > 0 Then
bad = True
Exit For
End If
Next
If Not bad Then
j = j + 1
kq(j, 1) = dl(i, 1)
End If
End If
Next
[C1].Resize(j) = kq
End Sub
[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
hic, em thử vẫn ko đc
anh hướng dẫn ký hơn cho e đc không ạ
Thử không được là code chạy không ra kêt quả hay là không biết là sao cho code chạy?
Nói chuyện toàn lưng chừng vậy thì biết hướng dẫn thế nào.

@ Anh siwtom

Nếu so sánh luôn 2 số đầu thì em sẽ cho vòng lặp từ 1 đến 9 luôn chắc là ok. Nếu Mid(...) mà gặp số 0 hoặc k=2 thì em cho nhảy tới 1 label để bỏ qua số này. Nhưng đọc thuật toán của anh xong em mới thấy mình tối dạ quá.
PHP:
Sub loc()
Dim dl(), i, x, k, dk, kq(), j
dl = Range([A1], [a65536].End(3)).Value
ReDim kq(1 To UBound(dl), 1 To 1)
 With CreateObject("scripting.dictionary")
For i = 1 To UBound(dl)
   For x = 1 To 9
      dk = Mid(dl(i, 1), x, 1)
      If Not .exists(dk) Then
         .Add dk, ""
         If dk = 0 Or k > 1 Then GoTo tiep
      Else
         k = k + 1
      End If
   Next
   If k = 0 Then
      j = j + 1
      kq(j, 1) = dl(i, 1)
   End If
tiep:
   k = 0
   .RemoveAll
Next
End With
[B1].Resize(j) = kq
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu sử dụng công thức cho kết quả luôn thì sao nhỉ?

Bài toán này cũng có thể giải được bằng công thức excel
Bạn lập các Name sau để quan sát và viết công thức cho tiện
Name: Data
Mã:
=Sheet1!$A$1:$A$1545
Name: Ma
Mã:
=IF(MMULT(FIND({1,2,4,5,6,7,8},Data&REPT(" ",100)&"1245678",1),ROW(Sheet1!$1:$7)/ROW(Sheet1!$1:$7))<100,ROW(INDIRECT("1:"&COUNTA(Data))),"")
Và công thức tại ô kết quả muốn xuất ra:
Mã:
=IF(ROW(1:1)>COUNT(Ma),"",INDEX(Data,SMALL(Ma,ROW(1:1))))
kéo xuống phía dưới sẽ hiển thị các kết quả tìm được.
 
Upvote 0
Dùng hàm đếm dùm file sau

Mình cần đếm các shop có bao nhiêu loại Rack nào , giúp mình với
 

File đính kèm

Upvote 0
Em vẫn chưa làm đc , anh chị nào hướng dẫn giúp em
 
Upvote 0
Em vẫn chưa làm đc , anh chị nào hướng dẫn giúp em

mình đoán là bạn chưa biết sử dụng macro phải ko?, nếu bạn chưa biết sử dụng macro thì
mình giúp bạn tạo 2 button, ứng với 2 đoạn code của 2 thầy QuangHai và Siwton
bài của bạn được toàn bậc thầy giải giúp đó.

nói thêm:
bạn có thể tự chạy macro bằng cách nhấn phím Alt-F8, rồi chọn macro muốn chạy nhấp run
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
mình đoán là bạn chưa biết sử dụng macro phải ko?, nếu bạn chưa biết sử dụng macro thì
mình giúp bạn tạo 2 button, ứng với 2 đoạn code của 2 thầy QuangHai và Siwton
bài của bạn được toàn bậc thầy giải giúp đó.

nói thêm:
bạn có thể tự chạy macro bằng cách nhấn phím Alt-F8, rồi chọn macro muốn chạy nhấp run

Hướng dẫn cụ thể và rõ ràng như nhapmon thì các bạn mới dễ thực hiện theo..

Topic này toàn cao thủ ra tay giúp...
 
Upvote 0
Dùng hàm sau đơn giản hơn
Function Locso(N as string)
Dim c(6) As integer
For i = 0 To 6
c(i) = Mid(N, Len(N) - i, 1)
For j = 0 To i - 1
If c(i) - c(j) = 0 Then Locso = "trùng"
Next j
Next i
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Các bạn thử dùng hàm sau
Function LS(N)
Dim c(6) As Integer
For i = 0 To 6
c(i) = Mid(N, Len(N) - i, 1)
For j = 0 To i - 1
If c(i) - c(j) = 0 Then LS = "-"
Next j
If LS <> "-" Then LS = N
Next i
End Function
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom