Nhờ đánh số thứ tự theo từng nhóm (1 người xem)

Liên hệ QC

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

nguyenmanhnam

Thành viên tiêu biểu
Tham gia
24/7/10
Bài viết
434
Được thích
266
Nhờ các anh chị giúp em bài toán:

- Các nhóm khác nhau được ngăn cách bởi 1 hoặc nhiều dòng trắng.
- Đánh số thứ tự theo từng nhóm: Các công việc liền nhau tính cùng nhóm --> cùng số thứ tự.
- Đánh số thứ tự các nhóm tư bé đến lớn (bắt đầu là 1): Nếu nhóm nào có ngày của công việc đầu tiên bé nhất sẽ đánh số 1...


(em xin minh họa theo file đính kèm)
 

File đính kèm

Nhờ các anh chị giúp em bài toán:

- Các nhóm khác nhau được ngăn cách bởi 1 hoặc nhiều dòng trắng.
- Đánh số thứ tự theo từng nhóm: Các công việc liền nhau tính cùng nhóm --> cùng số thứ tự.
- Đánh số thứ tự các nhóm tư bé đến lớn (bắt đầu là 1): Nếu nhóm nào có ngày của công việc đầu tiên bé nhất sẽ đánh số 1...


(em xin minh họa theo file đính kèm)
Trong file không hiểu phần minh họa kết quả tại sao lại 1, 3 , 4 rồi quay lại 2
 
Upvote 0
Upvote 0
Nhờ các anh chị giúp em bài toán:

- Các nhóm khác nhau được ngăn cách bởi 1 hoặc nhiều dòng trắng.
- Đánh số thứ tự theo từng nhóm: Các công việc liền nhau tính cùng nhóm --> cùng số thứ tự.
- Đánh số thứ tự các nhóm tư bé đến lớn (bắt đầu là 1): Nếu nhóm nào có ngày của công việc đầu tiên bé nhất sẽ đánh số 1...


(em xin minh họa theo file đính kèm)

cho mình hỏi thêm.
1- "Các đoạn được ngăn bởi dòng trống", cái này mình hiểu, như vậy một đoạn sẻ có nhiêu dòng, khi có dòng trống nó sẻ hiểu là đoạn khác? vậy dòng 20 là dòng trống sao vẫn được đánh liên tục là 2?
2-"Số thứ tự các đoạn được đánh từ nhỏ đến lớn theo công việc đầu tiên trong đoạn" cái này dựa vào ngày (chính xác hơn là tháng) ở cột B hả bạn?
3-" Các đoạn gần nhau liên tục đánh số thứ tự như nhau" cái này có phải hiểu là các dòng (trong một đoạn) phải ko bạn?
mình hơi bị chậm tiêu nên đọc hoài ko hiểu
 
Upvote 0
Nhờ các anh chị giúp em bài toán:

- Các nhóm khác nhau được ngăn cách bởi 1 hoặc nhiều dòng trắng.
- Đánh số thứ tự theo từng nhóm: Các công việc liền nhau tính cùng nhóm --> cùng số thứ tự.
- Đánh số thứ tự các nhóm tư bé đến lớn (bắt đầu là 1): Nếu nhóm nào có ngày của công việc đầu tiên bé nhất sẽ đánh số 1...


(em xin minh họa theo file đính kèm)
Góp một cách viết:
Mã:
Public Sub Stt()
    Dim Vung, I, Mg, K, Tam()
    Set Vung = Range([A2], [A50000].End(xlUp)).Resize(, 2)
    ReDim Mg(39000 To 50000, 1 To 1)
    Mg(Vung(1, 2).Value2, 1) = Vung(1, 1).Address
        For I = 2 To Vung.Rows.Count
            If Vung(I, 1) = "" And Vung(I + 1, 1) <> "" Then
                Mg(Vung(I + 1, 2).Value2, 1) = Vung(I + 1, 1).Address
            End If
        Next I
            For I = LBound(Mg) To UBound(Mg)
                If Mg(I, 1) <> "" Then
                    K = K + 1
                    ReDim Preserve Tam(K)
                    Tam(K) = Mg(I, 1)
                End If
            Next I
                For I = 1 To UBound(Tam)
                    Range(Tam(I)).Select
                    Range(Selection, Selection.End(xlDown)).Offset(, 2) = I
                Next I
End Sub
Mà có khi nào 2 hoặc nhiều hơn ngày đầu các nhóm..............trùng nhau hông ???? Thí dụ [B6]=[B16], v..v.....
Híc, nếu có trường hợp này, bạn nhờ Thầy Ba Tê sửa giúp nhé
Thân
 

File đính kèm

Upvote 0
Xin cho em hỏi, cái đoạn này, ý nghĩa của nó là gì thế?
Trong lúc đang viết code cho người bạn, muốn dùng mảng sắp xếp không dùng công cụ sort thì gặp bài của bạn nên sẵn trớn ghép vào luôn ( code dư một đoạn, có thể rút ngắn lại)
Trong bài, mình viết thế này: cứ chạy từ trên xuống ( chạy ngược lại cũn được) gặp cell thỏa điều kiện _ có dữ liệu và hàng kế trên trống_ thì gán dữ liệu vào mảng trung gian Mg:
***Số thứ tự là giá trị số của cell bên phải cell thỏa (cột B)
***Giá trị là địa chỉ của cell thỏa
Sau khi chạy xong vòng này ta đã có một mảng được sắp xếp theo ngày ( cột B)........gần hoàn chỉnh. Híc
Còn:
Mg(Vung(1, 2).Value2, 1) = Vung(1, 1).Address
"Mù mù mờ mờ" là:
Số thứ tự Vung(1, 2).Value2 của mảng Mg có giá trị Vung(1, 1).Address
Thân
 
Upvote 0
Trong lúc đang viết code cho người bạn, muốn dùng mảng sắp xếp không dùng công cụ sort thì gặp bài của bạn nên sẵn trớn ghép vào luôn ( code dư một đoạn, có thể rút ngắn lại)
Trong bài, mình viết thế này: cứ chạy từ trên xuống ( chạy ngược lại cũn được) gặp cell thỏa điều kiện _ có dữ liệu và hàng kế trên trống_ thì gán dữ liệu vào mảng trung gian Mg:
***Số thứ tự là giá trị số của cell bên phải cell thỏa (cột B)
***Giá trị là địa chỉ của cell thỏa
Sau khi chạy xong vòng này ta đã có một mảng được sắp xếp theo ngày ( cột B)........gần hoàn chỉnh. Híc
Còn:

"Mù mù mờ mờ" là:
Số thứ tự Vung(1, 2).Value2 của mảng Mg có giá trị Vung(1, 1).Address
Thân

Em cũng lờ mờ đoán được, em muốn hiểu .Value2 có nghĩa là gì? vì em chưa gặp kiểu viết như thế này (liệu có value1, value3...không?). Tức là em muốn tìm hiểu về nó thì đọc ở đâu ah? Nhờ thày chỉ dùm.
 
Upvote 0
Em cũng lờ mờ đoán được, em muốn hiểu .Value2 có nghĩa là gì? vì em chưa gặp kiểu viết như thế này (liệu có value1, value3...không?). Tức là em muốn tìm hiểu về nó thì đọc ở đâu ah? Nhờ thày chỉ dùm.
Cái đó là:
The only difference between this property and the Value property is that the Value2 property doesn’t use the Currency and Date data types. You can return values formatted with these data types as floating-point numbers by using the Double data type.
Không có Value3, 4 gì đâu nha. Bạn vào cửa sổ VBE bôi đen chữ Value2 rồi bấm F1 là biết
'---------------------------------------------------
Thấy mọi người làm vui quá dhn46 cũng "bon chen" 1 cách làm bằng công thức (để tham khào thui nha)
Đặt name
1/ Data
Mã:
=OFFSET(Sheet1!$B$2,,,LOOKUP(2,1/(Sheet1!$B$2:$B$6000<>""),ROW(Sheet1!$B$2:$B$65536)))
2/ rData
Mã:
=IF(NOT(ISNUMBER(OFFSET(Data,-1,0)))*(Data<>""),Data,"")
3/ Công thức mảng tại C2 và kéo xuống
Mã:
=IF($A2="","",IF(NOT(ISNUMBER(OFFSET($B2,-1,0))),SUM(IF($B2>=rData,1,0)),$C1))
 

File đính kèm

Upvote 0
Nhờ các anh chị giúp em bài toán:

- Các nhóm khác nhau được ngăn cách bởi 1 hoặc nhiều dòng trắng.
- Đánh số thứ tự theo từng nhóm: Các công việc liền nhau tính cùng nhóm --> cùng số thứ tự.
- Đánh số thứ tự các nhóm tư bé đến lớn (bắt đầu là 1): Nếu nhóm nào có ngày của công việc đầu tiên bé nhất sẽ đánh số 1...


(em xin minh họa theo file đính kèm)

Bạn minh họa sai rồi. Mà bạn có 5 nhóm chứ không phải là 4

Đặt name Data

Mã:
=IF((Sheet1!$B$2:$B$1000>0)*NOT(ISNUMBER(Sheet1!$B$1:$B$999));Sheet1!$B$2:$B$1000;"")

Công thức cho ô B2, kéo xuống dưới

Mã:
=IF($B2="";"";IF(NOT(ISNUMBER($B1));SUMPRODUCT(--($B2>=Data));$C1))
 
Upvote 0
Mình chưa gặp yêu cầu nào "quái" như thế này, theo mình hiểu thì yêu cầu của bạn là:

1. Đánh STT các nhóm theo điều kiện mỗi nhóm (cách nhóm bằng các dòng trống) chọn ra ngày cũ nhất, so sánh các ngày này với nhau, ngày cũ nhất sẽ bắt đầu từ STT 1 rồi tăng dần lên.

2. Nếu các nhóm có trùng ngày nhỏ nhất thì STT được đánh từ nhỏ đến lớn theo thứ tự từ trên xuống dưới.

Như vậy có nghĩa nếu các nhóm cập nhật sau này nếu nhóm nào có ngày cũ hơn nữa sẽ thành 1, rồi tăng dần cho các nhóm khác theo điều kiện như trên.

Cột ngày tháng bạn nên nhập ngày tháng thôi, đừng nhập thêm text vào nữa (VD "tháng 04/2012"), những ngày như vậy sẽ ảnh hưởng đến sự chính xác khi dò giá trị, theo mình tốt nhất nên đánh những ngày như vậy là ngày 1 và thêm 1 cột đánh dấu "X" hay gì đó vào để phân biệt.

Nếu đúng yêu cầu như vậy thì bạn xem file nhé, mình chỉ dùng công thức thôi, bài này kể ra cũng khó gặm thật.
Do mình sửa lại ngày để check các trường hợp xảy ra nên STT mình đánh sẽ không giống như lúc đầu của bạn đâu nhe.


View attachment So thu tu.xls
 
Upvote 0
Nhờ sửa dùm Code để có thể chạy được file ở dưới đính kèm

Em chưa hiểu tại sao trong đoạn
PHP:
 ReDim Mg(39000 To 50000, 1 To 1)
lại chọn từ 39000 đến 50000

Em có sửa Code trên để áp dụng file dưới
PHP:
Sub Stt()
    Dim Vung, I, Mg, K, Tam()
    Set Vung = Range([B5], [B50000].End(xlUp)).Resize(, 9)
    ReDim Mg(39000 To 50000, 1 To 1)
        Mg(Vung(1, 4).Value2, 1) = Vung(1, 1).Address
    For I = 2 To Vung.Rows.Count
        If Vung(I, 1) = "" And Vung(I + 1, 1) <> "" Then
            Mg(Vung(I + 1, 4).Value2, 1) = Vung(I + 1, 1).Address
        End If
    Next I
       For I = LBound(Mg) To UBound(Mg)
        If Mg(I, 1) <> "" Then
            K = K + 1
            ReDim Preserve Tam(K)
            Tam(K) = Mg(I, 1)
        End If
    Next I
    For I = 1 To UBound(Tam)
        Range(Tam(I)).Select
        Range(Selection, Selection.End(xlDown)).Offset(, 8) = I
    Next I
End Sub
nhưng chạy bị lỗi, mong nhận được sự giúp đỡ.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em chưa hiểu tại sao trong đoạn
PHP:
 ReDim Mg(39000 To 50000, 1 To 1)
lại chọn từ 39000 đến 50000
nhưng chạy bị lỗi, mong nhận được sự giúp đỡ.
Đó là giới hạn vùng ngày nhập, bạn dùng hàm N(ngảy nhỏ nhất) & N (ngày lớn nhất) trong file của bạn sẽ hình dung ra tại sao dùng các số ấy

Trong bài trứơc mình đã hỏi bạn:
Mà có khi nào 2 hoặc nhiều hơn ngày đầu các nhóm..............trùng nhau hông ???? Thí dụ [B6]=[B16], v..v.....
Híc, nếu có trường hợp này, bạn nhờ Thầy Ba Tê sửa giúp nhé
Thân
Bạn chẳng trả lời hay trả vốn gì cả, trong bài hôm nay xuất hiện [E5]=[E13] và cũng chẳng nói cách giải quyết vấn đề này như thế nào nữa. Híc, bó tay

Thêm tình tiết mới, trong các nhóm có xuất hiện nhóm chỉ có 1 dòng nên phải chỉnh code lại
Túm lại, dữ liệu của bạn thì bạn biết nó như thế nào để đặt các vấn đề trong câu hỏi cho chính xác, đỡ cực cho bạn & người muốn làm giúp bạn
Thân
 
Upvote 0
Đó là giới hạn vùng ngày nhập, bạn dùng hàm N(ngảy nhỏ nhất) & N (ngày lớn nhất) trong file của bạn sẽ hình dung ra tại sao dùng các số ấy

Trong bài trứơc mình đã hỏi bạn:

Bạn chẳng trả lời hay trả vốn gì cả, trong bài hôm nay xuất hiện [E5]=[E13] và cũng chẳng nói cách giải quyết vấn đề này như thế nào nữa. Híc, bó tay

Thêm tình tiết mới, trong các nhóm có xuất hiện nhóm chỉ có 1 dòng nên phải chỉnh code lại
Túm lại, dữ liệu của bạn thì bạn biết nó như thế nào để đặt các vấn đề trong câu hỏi cho chính xác, đỡ cực cho bạn & người muốn làm giúp bạn
Thân

Dạ mấy hôm nay em bận làm quá nên chưa có điều kiện xem lại, em xin phép được nhờ thày giúp cho, trong file thực tế của em gửi ở bài trên em muốn có kết quả như sau ah:

- STT được đánh ở cột J (thay cho cột C bài trước),
- Cột ngày tháng là cột E (thay cho cột B bài trước;
- Trong trường hợp công việc đầu tiên của các nhóm xuất hiện cùng ngày thì nếu nhóm nào xếp trên sẽ được ưu tiên đánh số thứ tự nhóm nhỏ hơn.

kính mong thày và các anh, chị chỉ, sửa giúp code bài trên dùm em.
 
Upvote 0
Dạ mấy hôm nay em bận làm quá nên chưa có điều kiện xem lại, em xin phép được nhờ thày giúp cho, trong file thực tế của em gửi ở bài trên em muốn có kết quả như sau ah:

- STT được đánh ở cột J (thay cho cột C bài trước),
- Cột ngày tháng là cột E (thay cho cột B bài trước;
- Trong trường hợp công việc đầu tiên của các nhóm xuất hiện cùng ngày thì nếu nhóm nào xếp trên sẽ được ưu tiên đánh số thứ tự nhóm nhỏ hơn.

kính mong thày và các anh, chị chỉ, sửa giúp code bài trên dùm em.

Vậy lúc nào rảnh thì bạn thông báo, để mọi người bắt đầu giúp - không có thì không có người đối thoại, thì mọi người giúp sai, khó đạt yêu cầu mông muốn

vậy đợi bạn rảnh
 
Upvote 0
Vậy lúc nào rảnh thì bạn thông báo, để mọi người bắt đầu giúp - không có thì không có người đối thoại, thì mọi người giúp sai, khó đạt yêu cầu mông muốn

vậy đợi bạn rảnh

Em thực sự xin lỗi, bởi công việc bận đột xuất quá nên chưa trả lời kịp thời.

Em xin cảm ơn các thày, các anh chị đã rất nhiệt tình giúp đỡ rất nhiều.
 
Upvote 0
lâu lâu không bit RANGE là gì, đụng lại xem sao

Em thực sự xin lỗi, bởi công việc bận đột xuất quá nên chưa trả lời kịp thời.

Em xin cảm ơn các thày, các anh chị đã rất nhiệt tình giúp đỡ rất nhiều.

Hy vọng là bạn rảnh rui

Lâu không làm việc với RANGE thử lại vài nhát xem sao,

Bạn kiểm tra kết quả nhé,

Tôi chỉ suy luận từ những gì bạn viết trên, và dữ liệu mới nhất đây (DL ngày luôn đúng là kiểu date của excel - tức là là số đầy đủ tháng ngày năm) ==> BẠN tự kiểm tra lại sự hợp lý và chính xác của kết quả

trong File kèm bấm nút Rank Sort để thực thi và nhận kết quả

PHP:
Sub RankSort()
    Dim Cel As Range, ceL1 As Range, ceL2 As Range
    Dim k As Long, j As Long, jt As Long
    Dim NgArr(), jK() As Long, tg, rR() As Long
    
    Application.ScreenUpdating = False
    Set Cel = Sheet1.[E5]
    
    Set ceL1 = Cel
    ReDim rR(1 To 2, 1 To 1) As Long
    k = 0
    Do While ceL1.Row < 65000 And ceL1 <> ""
        If ceL1.Offset(1) <> "" Then
                Set ceL2 = ceL1.End(xlDown)
        Else:   Set ceL2 = ceL1:    End If
        
        k = k + 1
        ReDim Preserve NgArr(1 To k)
        ReDim Preserve jK(1 To k) As Long
        ReDim Preserve rR(1 To 2, 1 To k) As Long
        
        NgArr(k) = ceL1.Value
        jK(k) = k
        rR(1, k) = ceL1.Row - Cel.Row
        rR(2, k) = ceL2.Row - ceL1.Row + 1
        
        '''sap xep lai ngay k va jk
        For j = k To 2 Step -1
            If NgArr(j) < NgArr(j - 1) Then
                tg = NgArr(j):  NgArr(j) = NgArr(j - 1):    NgArr(j - 1) = tg
                jt = jK(j):     jK(j) = jK(j - 1):          jK(j - 1) = jt
            Else:   Exit For:       End If
        Next j
        
        Set ceL1 = ceL2.End(xlDown)
    Loop
    
    Cel.Offset(, 5).Resize(65000).ClearContents
    For j = 1 To k
        Cel.Offset(rR(1, jK(j)), 5).Resize(rR(2, jK(j))).Value = j
    Next j
    Application.ScreenUpdating = True
End Sub

chú ý: tạm giới hạn vùng dữ liệu đến 65000 dòng dĩ nhiên bạn sử dụng excel 2007 có thể tăng số dòng này lên hàng triệu (chắc không dùng hết 65000 dòng đâu - tuy vậy vẫn lưu ý để biết hạn chế)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Hy vọng là bạn rảnh rui

Lâu không làm việc với RANGE thử lại vài nhát xem sao,

Bạn kiểm tra kết quả nhé,

Tôi chỉ suy luận từ những gì bạn viết trên, và dữ liệu mới nhất đây (DL ngày luôn đúng là kiểu date của excel - tức là là số đầy đủ tháng ngày năm) ==> BẠN tự kiểm tra lại sự hợp lý và chính xác của kết quả

trong File kèm bấm nút Rank Sort để thực thi và nhận kết quả

PHP:
Sub RankSort()
    Dim Cel As Range, ceL1 As Range, ceL2 As Range
    Dim k As Long, j As Long, jt As Long
    Dim NgArr(), jK() As Long, tg, rR() As Long
    
    Application.ScreenUpdating = False
    Set Cel = Sheet1.[E5]
    
    Set ceL1 = Cel
    ReDim rR(1 To 2, 1 To 1) As Long
    k = 0
    Do While ceL1.Row < 65000 And ceL1 <> ""
        If ceL1.Offset(1) <> "" Then
                Set ceL2 = ceL1.End(xlDown)
        Else:   Set ceL2 = ceL1:    End If
        
        k = k + 1
        ReDim Preserve NgArr(1 To k)
        ReDim Preserve jK(1 To k) As Long
        ReDim Preserve rR(1 To 2, 1 To k) As Long
        
        NgArr(k) = ceL1.Value
        jK(k) = k
        rR(1, k) = ceL1.Row - Cel.Row
        rR(2, k) = ceL2.Row - ceL1.Row + 1
        
        '''sap xep lai ngay k va jk
        For j = k To 2 Step -1
            If NgArr(j) < NgArr(j - 1) Then
                tg = NgArr(j):  NgArr(j) = NgArr(j - 1):    NgArr(j - 1) = tg
                jt = jK(j):     jK(j) = jK(j - 1):          jK(j - 1) = jt
            Else:   Exit For:       End If
        Next j
        
        Set ceL1 = ceL2.End(xlDown)
    Loop
    
    Cel.Offset(, 5).Resize(65000).ClearContents
    For j = 1 To k
        Cel.Offset(rR(1, jK(j)), 5).Resize(rR(2, jK(j))).Value = j
    Next j
    Application.ScreenUpdating = True
End Sub

chú ý: tạm giới hạn vùng dữ liệu đến 65000 dòng dĩ nhiên bạn sử dụng excel 2007 có thể tăng số dòng này lên hàng triệu (chắc không dùng hết 65000 dòng đâu - tuy vậy vẫn lưu ý để biết hạn chế)

Rất chuẩn rồi anh ah, cảm ơn anh nhiều lắm
--
Em xin mạn phép hỏi thêm chút nữa: Trong file của anh, em thấy đuôi dạng .xlsm chứ không phải là .xls, xin chỉ dùm khi lưu dưới dạng định dạng trên nó có ưu điểm gì.
 
Upvote 0
Em xin mạn phép hỏi thêm chút nữa: Trong file của anh, em thấy đuôi dạng .xlsm chứ không phải là .xls, xin chỉ dùm khi lưu dưới dạng định dạng trên nó có ưu điểm gì.
Có gì phải chú ý đâu bạn, anh vodoi2x anh làm file của bạn trên phiên bản OFFICE 2010 nên file Excel có đuôi dạng .xlsm. Bạn đang dùng phiên bản OFFICE 2003 nên đuôi file excel là .xls.
 
Upvote 0
Rất chuẩn rồi anh ah, cảm ơn anh nhiều lắm
--
Em xin mạn phép hỏi thêm chút nữa: Trong file của anh, em thấy đuôi dạng .xlsm chứ không phải là .xls, xin chỉ dùm khi lưu dưới dạng định dạng trên nó có ưu điểm gì.


xls - file excel cho các phiên bản từ office 2003 trở về trước - có thể chứa cả macro

từ phiên bản 2007 trở lên, Excel đã phân loại thành dạng file định dạng theo dang XLM, trong đó có

- xlsx file - file chứa các worksheet, chart,... nhưng không chứa macro
- xlsm file - như file xlsx nhưng có thể chứa được macro (enable macro)
và ... nhiều dạng file mới nữa


vì thấy file bạn đưa lên là 123.xlsx ==> tôi lưu dưới dạng xlsm cho tiện lợi và nhanh

Có nhiều ưu điểm thì nhiều, bạn xem chi tiết link sau sẽ rõ
http://office.microsoft.com/en-001/help/introduction-to-new-file-name-extensions-HA010006935.aspx

cứ google trợ giúp thì không gì là không thể trả lời được.
 
Upvote 0

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

Back
Top Bottom