Nhờ các bác Lập Giúp Hàm Tìm Kiếm (1 người xem)

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

xkun2001

Thành viên mới
Tham gia
16/9/07
Bài viết
34
Được thích
1
Hi all,
Cuối tuần tranh thủ nhờ các bác tí ;)
Mình có 1 danh sách như hình dưới, bao gồm các cột 'Số TT, 'Số BB (số biên bản), 'Ngày tháng, 'Công việc
Mục đích mình muốn là: đánh số cho cột 'Số BB' một cách tự động theo quy tắc tăng dần theo cột 'Ngày tháng' và phân nhóm theo mã HM.

Ví dụ trong hình: Ngày nhỏ nhất trong cột 'Ngày tháng' ứng với mã "ND" sẽ có số biên bản là "ND-01". Tương ứng với ngày 1/3/2014 ở dòng 1.
Với mã "RD" cũng vậy: biên bản "RD-01" sẽ ứng với ngày 1/3/2014, ở dòng 7.

Mình không dùng lệnh 'Soft' cho vùng dữ liệu được vì các ô trong cột 'Ngày tháng' được dùng công thức và liên kết với nhau. Nếu 'Soft' sẽ báo lỗi liên kết.

Với vùng dữ liệu lớn việc đánh số thủ công sẽ rất mệt. Vậy nên nhờ các bác viết giúp 1 macro xử lý việc này. Xin cám ơn các bác trước!
Danh so Bien Ban.jpg

File đính kèm:
 

File đính kèm

Mình đã thử dùng hàm 'Small' trong macro nhưng không biết cách lấy địa chỉ của ô mà hàm tìm thấy. Mình đang tắc chỗ này:
Mã:
nRow=range(Data).Rows.count
For i = 1 To nRows
     Nhap = Application.WorksheetFunction.Small(Range(Data), i)
     'Mình không biết cách tìm địa chỉ của 'Nhap ---- Help !!!
Next i
 
Upvote 0
Mình đã thử dùng hàm 'Small' trong macro nhưng không biết cách lấy địa chỉ của ô mà hàm tìm thấy. Mình đang tắc chỗ này:
Mã:
nRow=range(Data).Rows.count
For i = 1 To nRows
     Nhap = Application.WorksheetFunction.Small(Range(Data), i)
     'Mình không biết cách tìm địa chỉ của 'Nhap ---- Help !!!
Next i
Bài này không dễ nhai nếu không dùng tí tà thuật vào
Nếu không cho Sort thì code chắc điên cái đầu thôi
PHP:
Sub STT()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim r, n
Sheets("Danh Muc NT").[A:D].Copy
With Sheets.Add
   .Paste
   .UsedRange.Sort [D1], , [C1], Header:=1
   For r = 2 To .[D65536].End(3).Row
      If .Cells(r, 4) = .Cells(r + 1, 4) Then
         n = n + 1
         .Cells(r, 2) = .Cells(r, 4) & "-" & Right("00" & n, 2)
      Else
         .Cells(r, 2) = .Cells(r, 4) & "-" & Right("00" & n + 1, 2)
         n = 0
      End If
   Next
   .UsedRange.Sort [A1], Header:=1
   .Range("B2", .[B65536].End(3)).Copy Sheets("Danh Muc NT").[B2]
   .Delete
End With
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
 
Upvote 0
Bài này không dễ nhai nếu không dùng tí tà thuật vào
Nếu không cho Sort thì code chắc điên cái đầu thôi
PHP:
Sub STT()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim r, n
Sheets("Danh Muc NT").[A:D].Copy
With Sheets.Add
   .Paste
   .UsedRange.Sort [D1], , [C1], Header:=1
   For r = 2 To .[D65536].End(3).Row
      If .Cells(r, 4) = .Cells(r + 1, 4) Then
         n = n + 1
         .Cells(r, 2) = .Cells(r, 4) & "-" & Right("00" & n, 2)
      Else
         .Cells(r, 2) = .Cells(r, 4) & "-" & Right("00" & n + 1, 2)
         n = 0
      End If
   Next
   .UsedRange.Sort [A1], Header:=1
   .Range("B2", .[B65536].End(3)).Copy Sheets("Danh Muc NT").[B2]
   .Delete
End With
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

Tà thuật từ dân gian còn gọi là "uýnh bùa" phải hông vậy?
PHP:
Public Function GPE(Rng As Range, Ngay As Range, Ma As Range) As String
Dim sArr(), dArr(), I As Long, NumMin As Long, NumMax As Long, Tem As Long, K As Long
sArr = Rng.Value2
NumMin = Application.WorksheetFunction.Min(Rng)
NumMax = Application.WorksheetFunction.Max(Rng)
ReDim dArr(1 To NumMax - NumMin + 1, 1 To 1)
For I = 1 To UBound(sArr, 1)
    If sArr(I, 2) = Ma Then
        Tem = sArr(I, 1) - NumMin + 1
        dArr(Tem, 1) = sArr(I, 1)
    End If
Next I
For I = 1 To UBound(dArr, 1)
    If dArr(I, 1) <> Empty Then
        K = K + 1
        If dArr(I, 1) = Ngay Then
            GPE = Ma & "-" & Format(K, "00")
            Exit For
        End If
    End If
Next I
End Function
Công thức ô B2:
PHP:
=GPE($C$2:$D$8;C2;D2)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Hi all,
Cuối tuần tranh thủ nhờ các bác tí ;)
Mình có 1 danh sách như hình dưới, bao gồm các cột 'Số TT, 'Số BB (số biên bản), 'Ngày tháng, 'Công việc
Mục đích mình muốn là: đánh số cho cột 'Số BB' một cách tự động theo quy tắc tăng dần theo cột 'Ngày tháng' và phân nhóm theo mã HM.

Ví dụ trong hình: Ngày nhỏ nhất trong cột 'Ngày tháng' ứng với mã "ND" sẽ có số biên bản là "ND-01". Tương ứng với ngày 1/3/2014 ở dòng 1.
Với mã "RD" cũng vậy: biên bản "RD-01" sẽ ứng với ngày 1/3/2014, ở dòng 7.

Mình không dùng lệnh 'Soft' cho vùng dữ liệu được vì các ô trong cột 'Ngày tháng' được dùng công thức và liên kết với nhau. Nếu 'Soft' sẽ báo lỗi liên kết.

Với vùng dữ liệu lớn việc đánh số thủ công sẽ rất mệt. Vậy nên nhờ các bác viết giúp 1 macro xử lý việc này. Xin cám ơn các bác trước!
View attachment 131929

File đính kèm:

Góp vui
Mã:
Function SBB(ng As Range, CrD As Date, CODE As Range)
Dim ngay, ma As Variant, i, j, k As Long
ngay = ng.Value
ma = ng.Offset(, 1).Value
mahm = CODE.Value
k = 1
For i = 1 To UBound(ngay)
    If ma(i, 1) = mahm Then
    MyDate = DateSerial(Year(ngay(i, 1)), Month(ngay(i, 1)), Day(ngay(i, 1)))
        If MyDate < CrD Then
            k = k + 1
        End If
    End If
Next

SBB = mahm & " - " & Format(k, "00")
End Function

Mã:
C2=sbb($C$2:$C$8,C2,D2)
kéo xuống
 
Upvote 0
Các bác nhiệt tình quá. Cám ơn 2 bác!
Tom mất 2 ngày thử qua các kiểu hàm mà ko ra đấy!

Cách của bác quanghai1969 rất hay nhưng có dòng lệnh Tom ko hiểu, bác có thể giải thích được không:
Mã:
[COLOR=#007700][FONT=monospace]For [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]r [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]2 To [/FONT][/COLOR][COLOR=#007700][FONT=monospace].[[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]D65536[/FONT][/COLOR][COLOR=#007700][FONT=monospace]].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]3[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Row[/FONT][/COLOR]

Hàm của bác Ba Tê thì cực linh động tuy nhiên nếu có 2 ngày trùng nhau và trùng Mã thì số biên bản cũng trùng nhau. Bác điều chỉnh giúp Tom để số biên bản tăng dần trong trường hợp này với!

Chúc các bác Cuối Tuần Vui Vẻ !
 
Upvote 0
Các bác nhiệt tình quá. Cám ơn 2 bác!
Tom mất 2 ngày thử qua các kiểu hàm mà ko ra đấy!

Cách của bác quanghai1969 rất hay nhưng có dòng lệnh Tom ko hiểu, bác có thể giải thích được không:
Mã:
[COLOR=#007700][FONT=monospace]For [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]r [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]2 To [/FONT][/COLOR][COLOR=#007700][FONT=monospace].[[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]D65536[/FONT][/COLOR][COLOR=#007700][FONT=monospace]].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]3[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Row[/FONT][/COLOR]

Nghĩa là kiểm tra dữ liệu từ dòng số 2 của cột D đến dòng cuối có dữ liệu của cột D
 
Upvote 0
Hi all,
Cuối tuần tranh thủ nhờ các bác tí ;)
Mình có 1 danh sách như hình dưới, bao gồm các cột 'Số TT, 'Số BB (số biên bản), 'Ngày tháng, 'Công việc
Mục đích mình muốn là: đánh số cho cột 'Số BB' một cách tự động theo quy tắc tăng dần theo cột 'Ngày tháng' và phân nhóm theo mã HM.
Ví dụ trong hình: Ngày nhỏ nhất trong cột 'Ngày tháng' ứng với mã "ND" sẽ có số biên bản là "ND-01". Tương ứng với ngày 1/3/2014 ở dòng 1.
Với mã "RD" cũng vậy: biên bản "RD-01" sẽ ứng với ngày 1/3/2014, ở dòng 7.
Mình không dùng lệnh 'Soft' cho vùng dữ liệu được vì các ô trong cột 'Ngày tháng' được dùng công thức và liên kết với nhau. Nếu 'Soft' sẽ báo lỗi liên kết.
Với vùng dữ liệu lớn việc đánh số thủ công sẽ rất mệt. Vậy nên nhờ các bác viết giúp 1 macro xử lý việc này. Xin cám ơn các bác trước!
File đính kèm:
Mình không biết VBA, cho mình ké một công thức:
[B2] =D2&"-"&TEXT(COUNTIFS($D$2:$D$8,D2,$C$2:$C$8,"<"&C2)+COUNTIFS($C$2:C2,C2,$D$2:D2,D2),"00")
Híc Híc
 
Upvote 0
Các bác nhiệt tình quá. Cám ơn 2 bác!
Tom mất 2 ngày thử qua các kiểu hàm mà ko ra đấy!

Cách của bác quanghai1969 rất hay nhưng có dòng lệnh Tom ko hiểu, bác có thể giải thích được không:
Mã:
[COLOR=#007700][FONT=monospace]For [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]r [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]2 To [/FONT][/COLOR][COLOR=#007700][FONT=monospace].[[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]D65536[/FONT][/COLOR][COLOR=#007700][FONT=monospace]].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]3[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Row[/FONT][/COLOR]

Hàm của bác Ba Tê thì cực linh động tuy nhiên nếu có 2 ngày trùng nhau và trùng Mã thì số biên bản cũng trùng nhau. Bác điều chỉnh giúp Tom để số biên bản tăng dần trong trường hợp này với!

Chúc các bác Cuối Tuần Vui Vẻ !

Trong yêu cầu và ví dụ ở bài #1 không nói đến chuyện này nên code không đáp ứng được.
Nếu nói rõ từ đầu thì code sẽ khác.
PHP:
Public Function GPE(Rng As Range, Ngay As Range, Ma As Range) As String
Dim sArr(), R As Long, I As Long, K As Long
sArr = Rng.Value
R = Ngay.Row
For I = 1 To UBound(sArr, 1)
    If sArr(I, 2) = Ma Then
        If sArr(I, 1) < Ngay Then
            K = K + 1
        End If
    End If
Next I
For I = 1 To R
    If Rng(I, 2) = Ma Then
        If Rng(I, 1) = Ngay Then K = K + 1
    End If
Next I
GPE = Ma & "-" & Format(K, "00")
End Function
Công thức ô B2:
PHP:
=GPE($C$1:$D$8;C2;D2)
Hoặc thử kết quả của bài #8 xem sao
 
Lần chỉnh sửa cuối:
Upvote 0
Thank bác.
Cách của bác phuocam cũng hay quá đi!
 
Upvote 0

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

Back
Top Bottom