Đánh Số thứ tự tại cột đã có dữ liệu

Liên hệ QC

vanvan9697

Thành viên chính thức
Tham gia
11/5/12
Bài viết
94
Được thích
5
Em có 1 File dữ liệu cần đánh số thứ tự Theo các điều kiện khai báo sau
1546675362696.png
Số Thứ tự được đánh bắt đầu từ số bắt đầu là 12 Theo điều kiện cùng ngày là 1 số thứ tự có nghĩa là ngày 03/01/2016 kết quả sẽ là KH00000012 đến ngày 04/01/2016 sẽ là KH00000013 ... Theo điều kiện tăng của ngày
Em mong muốn kết quả được đánh luôn vào các ô đang rỗng của Cột dữ liệu A bằng VBA. Rất mong anh (chị) giúp đỡ em ạ !
1546675572906.png
 

File đính kèm

  • GPEthutu.xlsx
    37.2 KB · Đọc: 16
Em có 1 File dữ liệu cần đánh số thứ tự Theo các điều kiện khai báo sau
View attachment 210500
Số Thứ tự được đánh bắt đầu từ số bắt đầu là 12 Theo điều kiện cùng ngày là 1 số thứ tự có nghĩa là ngày 03/01/2016 kết quả sẽ là KH00000012 đến ngày 04/01/2016 sẽ là KH00000013 ... Theo điều kiện tăng của ngày
Em mong muốn kết quả được đánh luôn vào các ô đang rỗng của Cột dữ liệu A bằng VBA. Rất mong anh (chị) giúp đỡ em ạ !
View attachment 210501
Bạn yêu cầu dùng VBA thì cần đăng bài ở: https://www.giaiphapexcel.com/diendan/forums/lập-trình-với-excel.79/
Bạn có thể nhờ Mod chuyển bài qua box lập trình.
Về yêu cầu của bạn, bạn chạy code sau:
PHP:
Sub danhstt()
    Dim Dic As Object, Res(), sArr(), Tmp
    Dim I As Long, J As Long, K As Long, x As Integer
   
   
    Set Dic = CreateObject("Scripting.Dictionary")
    sArr() = Sheet1.Range("B2", Sheet1.Range("B2").End(xlDown)).Value
   
    For I = 1 To UBound(sArr, 1)
        If Not Dic.exists(sArr(I, 1)) Then Dic.Add sArr(I, 1), ""
    Next I
   
    ReDim Res(1 To UBound(sArr, 1), 1 To 1)
   
    x = 12
    Tmp = Dic.keys
    For J = LBound(Tmp) To UBound(Tmp)
        For I = 1 To UBound(sArr, 1)
            If Tmp(J) = sArr(I, 1) Then
                K = K + 1
                Res(K, 1) = "KH" & Format(x, "00000000")
            End If
        Next I
        x = x + 1
    Next J
   
    Sheet1.Range("C2").Resize(K) = Res
    Set Dic = Nothing
   
    MsgBox "Done", vbInformation, "GPE"
End Sub
 
Bạn yêu cầu dùng VBA thì cần đăng bài ở: https://www.giaiphapexcel.com/diendan/forums/lập-trình-với-excel.79/
Bạn có thể nhờ Mod chuyển bài qua box lập trình.
Về yêu cầu của bạn, bạn chạy code sau:
PHP:
Sub danhstt()
    Dim Dic As Object, Res(), sArr(), Tmp
    Dim I As Long, J As Long, K As Long, x As Integer
 
 
    Set Dic = CreateObject("Scripting.Dictionary")
    sArr() = Sheet1.Range("B2", Sheet1.Range("B2").End(xlDown)).Value
 
    For I = 1 To UBound(sArr, 1)
        If Not Dic.exists(sArr(I, 1)) Then Dic.Add sArr(I, 1), ""
    Next I
 
    ReDim Res(1 To UBound(sArr, 1), 1 To 1)
 
    x = 12
    Tmp = Dic.keys
    For J = LBound(Tmp) To UBound(Tmp)
        For I = 1 To UBound(sArr, 1)
            If Tmp(J) = sArr(I, 1) Then
                K = K + 1
                Res(K, 1) = "KH" & Format(x, "00000000")
            End If
        Next I
        x = x + 1
    Next J
 
    Sheet1.Range("C2").Resize(K) = Res
    Set Dic = Nothing
 
    MsgBox "Done", vbInformation, "GPE"
End Sub
Kết quả em chạy thì còn 1 số dòng không điền được kết quả.
1546678082740.png
Ngoài ra Kết quả em mong muốn theo dạng tăng của ngày nhưng ngày mồng 04/01/2016 thì nó sẽ KH00000013, ngày 07/01 là KH00000014... có nghĩa là sẽ tăng theo ngày mà ở đó dữ liệu là rỗng. Kết quả điền luôn vào cột A không phát sinh thêm cột C. Thank anh ạ
 
Kết quả em chạy thì còn 1 số dòng không điền được kết quả.
View attachment 210507
Ngoài ra Kết quả em mong muốn theo dạng tăng của ngày nhưng ngày mồng 04/01/2016 thì nó sẽ KH00000013, ngày 07/01 là KH00000014... có nghĩa là sẽ tăng theo ngày mà ở đó dữ liệu là rỗng. Kết quả điền luôn vào cột A không phát sinh thêm cột C. Thank anh ạ
Dữ liệu của bạn có nhiều ngày khác nhau, trong khi tôi không biết ngày nào bạn cần lấy mã phát sinh.
Ví dụ: ngày 02/01 không lấy, 03/01 thì bắt đầu, 04/01 thì tiếp theo, 05/01 và 06/01 bỏ quả, 07/01 tiếp theo...
Vậy bạn làm theo hướng sau:
- Bạn lấy danh sách các ngày (không trùng lặp) cần tạo mã ra 1 sheet riêng
- Dùng code trên (sửa lại 1 chút) để tạo danh sách mã KH
- Dùng hàm Vlookup/Index... để điền mã từ danh sách mã KH vừa tạo vào sheet ban đầu.
 
Kết quả em chạy thì còn 1 số dòng không điền được kết quả.
View attachment 210507
Ngoài ra Kết quả em mong muốn theo dạng tăng của ngày nhưng ngày mồng 04/01/2016 thì nó sẽ KH00000013, ngày 07/01 là KH00000014... có nghĩa là sẽ tăng theo ngày mà ở đó dữ liệu là rỗng. Kết quả điền luôn vào cột A không phát sinh thêm cột C. Thank anh ạ
Bạn thử xem sao.
Nếu muốn đánh số vào cột A thì thay .Range("F2").Resize(I - 1) = dArr thành .Range("A2").Resize(I - 1) = dArr
 

File đính kèm

  • GPEthutu.xlsm
    67.2 KB · Đọc: 13
Kết quả em chạy thì còn 1 số dòng không điền được kết quả.
View attachment 210507
Ngoài ra Kết quả em mong muốn theo dạng tăng của ngày nhưng ngày mồng 04/01/2016 thì nó sẽ KH00000013, ngày 07/01 là KH00000014... có nghĩa là sẽ tăng theo ngày mà ở đó dữ liệu là rỗng. Kết quả điền luôn vào cột A không phát sinh thêm cột C. Thank anh ạ
Chẳng hiểu bạn điền TT kiểu gì, và
Ứng dụng làm chi, khi cột A có ô có dữ liệu có ô không?
 
Bạn thử xem sao.
Nếu muốn đánh số vào cột A thì thay .Range("F2").Resize(I - 1) = dArr thành .Range("A2").Resize(I - 1) = dArr
Dạ đúng ý em rồi ạ ! Em cảm ơn chị ạ
Bài đã được tự động gộp:

Chẳng hiểu bạn điền TT kiểu gì, và
Ứng dụng làm chi, khi cột A có ô có dữ liệu có ô không?
Dạ em làm vậy để ứng dụng trong việc lấy các dữ liệu chưa đúng trong bảng dữ liệu anh ạ
 
Bạn thử xem sao.
Nếu muốn đánh số vào cột A thì thay .Range("F2").Resize(I - 1) = dArr thành .Range("A2").Resize(I - 1) = dArr
Sao Phức tạp hóa vấn đề thế, trong khi ngày tháng đã nhập tuần tự từ lớn đến bé, sao phải dùng đủ các loại hàm ...Array2D... JoinIf ... Dictionary nữa
Bài này cứ làm chân phương là được, khỏi cần Dic,
Quét FOR 1 lượt và cho kết quả
 
Sao Phức tạp hóa vấn đề thế, trong khi ngày tháng đã nhập tuần tự từ lớn đến bé, sao phải dùng đủ các loại hàm ...Array2D... JoinIf ... Dictionary nữa
Bài này cứ làm chân phương là được, khỏi cần Dic,
Quét FOR 1 lượt và cho kết quả
Bây giờ em mới xem lại thì Bài này cũng không cần Dictionary như Anh đã nhắc ở trên. Em phòng khi dữ liệu nhà họ không phải 2 cột liên tiếp mới dùng thêm hàm JoinArray và không theo tuần tự từ lớn đến bé mới dùng Sort2DArray ạ. Không mai nhà họ đổi ý lại phải sửa Code Anh ạ
 
Em phòng khi dữ liệu nhà họ không phải 2 cột liên tiếp mới dùng thêm hàm JoinArray và không theo tuần tự từ lớn đến bé mới dùng Sort2DArray ạ. Không mai nhà họ đổi ý lại phải sửa Code Anh ạ
sao không dự phòng luôn dữ liệu không là date
Bên cột đầu không phải ô trống bình thường, mà có ký tự trắng (với char-code 32, 160,...)
Rồi không dự phòng luôn là ngày trước 1900

thế thì dự phòng hết, thay luôn cả phần mềm EXCEL
 
sao không dự phòng luôn dữ liệu không là date
Bên cột đầu không phải ô trống bình thường, mà có ký tự trắng (với char-code 32, 160,...)
Rồi không dự phòng luôn là ngày trước 1900

thế thì dự phòng hết, thay luôn cả phần mềm EXCEL
Hí hí. Đúng là không có sức để phòng mấy cái đó ạ
 
Dạ đúng như vậy ạ bởi dữ liệu của em có thể là số ngày nó không sắp xếp từ trên xuống dưới ạ. Nếu có thể anh (chị) có thể giúp em code ngắn hơn được không ạ !
 
Dạ đúng như vậy ạ bởi dữ liệu của em có thể là số ngày nó không sắp xếp từ trên xuống dưới ạ. Nếu có thể anh (chị) có thể giúp em code ngắn hơn được không ạ !
Ngày không xếp thứ tự
Mã:
Sub GPE()
  Dim i As Long, sR As Long, tMax As Long, tMin As Long, j As Long
  Dim sArr(), Res(), tArr(), S, id As Long
  With Sheets("Sheet1")
    id = .Range("E3").Value - 1
    
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = Range("A2:B" & i).Value2
    sR = UBound(sArr)
    ReDim Res(1 To sR, 1 To 1)
    
    tMax = Application.Max(Range("B2:B" & i).Value2)
    tMin = Application.Min(Range("B2:b" & i).Value2)
    ReDim tArr(tMin To tMax)
  End With
    
  For i = 1 To sR
    If Len(sArr(i, 1)) = 0 Then
      tArr(sArr(i, 2)) = tArr(sArr(i, 2)) & "," & i
    Else
      Res(i, 1) = sArr(i, 1)
    End If
  Next i
 
  For i = tMin To tMax
    If Len(tArr(i)) > 0 Then
      id = id + 1
      S = Split(tArr(i), ",")
      For j = 1 To UBound(S)
        Res(CLng(S(j)), 1) = "KH" & Format(id, "00000000")
      Next j
    End If
  Next i
  Sheets("Sheet1").Range("F2").Resize(sR) = Res
End Sub
 
Ngày không xếp thứ tự
Mã:
Sub GPE()
  Dim i As Long, sR As Long, tMax As Long, tMin As Long, j As Long
  Dim sArr(), Res(), tArr(), S, id As Long
  With Sheets("Sheet1")
    id = .Range("E3").Value - 1
   
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = Range("A2:B" & i).Value2
    sR = UBound(sArr)
    ReDim Res(1 To sR, 1 To 1)
   
    tMax = Application.Max(Range("B2:B" & i).Value2)
    tMin = Application.Min(Range("B2:b" & i).Value2)
    ReDim tArr(tMin To tMax)
  End With
   
  For i = 1 To sR
    If Len(sArr(i, 1)) = 0 Then
      tArr(sArr(i, 2)) = tArr(sArr(i, 2)) & "," & i
    Else
      Res(i, 1) = sArr(i, 1)
    End If
  Next i

  For i = tMin To tMax
    If Len(tArr(i)) > 0 Then
      id = id + 1
      S = Split(tArr(i), ",")
      For j = 1 To UBound(S)
        Res(CLng(S(j)), 1) = "KH" & Format(id, "00000000")
      Next j
    End If
  Next i
  Sheets("Sheet1").Range("F2").Resize(sR) = Res
End Sub
Anh @HieuCD ơi !. Anh giúp em đánh số thự tự nếu ngày tháng đó định dạng text với ạ !
 
Anh @HieuCD ơi !. Anh giúp em đánh số thự tự nếu ngày tháng đó định dạng text với ạ !
Bạn đưa file có dữ liệu "lu xu bu" giống thật lên để xem có bao nhiêu chuyện xảy ra, tính một lượt cho xong.
Chứ đưa 1 kiểu, rồi "ví dụ" thêm 1 kiểu, xong lại "nếu ......"
 
Web KT
Back
Top Bottom