Xin giúp: Nhóm (group data) các dòng trong bảng tính

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

843824

Thành viên mới
Tham gia
23/12/09
Bài viết
39
Được thích
1
Đầu tiên xin cảm ơn mọi người đã dành thời gian đọc bài viết của tôi. Tôi có vấn đề này cần nhờ giúp như sau:
* Nhóm (group) các dòng theo từng hạng mục (cứ 01 hạng mục là thành 01 Group).
- Đính kèm là 1 file excel có 3 sheet với 03 kiểu dữ liệu. Cấu trúc cơ bản như sau:
Cột STT: các Hạng mục được đánh bằng kiểu la mã I - II - III - IV .... hoặc bằng chữ A - B - C - D ...
- Mỗi Hạng mục này có các dòng dữ liệu con (gồm một số lượng dòng bất kỳ): 5 / 10/ 100/ 300/ 500 dòng... tùy cái.
* Sau khi chạy lệnh: thì các dòng con này sẽ được tào thành 1 Group: tương đương thao tác tay là kéo chọn các dòng con => Data => Group / hoặc Tổ hợp phím: Shift + Alt + mũi tên phải.
* Nhưng thao tác này làm rất lâu và có khi bị kéo lẫn (chồng) qua Hạng mục khác. Khi có rất nhiều hạng mục, với số dòng lớn.
===> Vậy xin nhờ các bạn chỉ giúp có cách thao tác nào để làm nhanh công việc này? Hoặc tạo giúp lệnh/ Code để thực hiện nhanh việc này.
- Xin cảm ơn rất nhiều.
 

File đính kèm

  • 11.2023 Hoi Group nhanh.xls
    328 KB · Đọc: 19
Mình cũng hay sử dụng chức năng group ... nhưng toàn làm bằng ..tay hihi. Lót dép hóng phương pháp.
 
Upvote 0
Chạy thử code này nhé.
Vào từng sheet để tạo. Mỗi sheet đều có ô đầu tiên của cột thứ tự là chữ cái. VD: sheet "Kieu 1" là ô A10
Vào code sửa dòng này
Set ce = Range("A10") ' O co stt la chu cai dau tien
(Nếu quên sửa mà treo máy ráng chịu)
(Có thể tại inputbox để nhập ô này. Hoặc trong sheet bạn phải xác định đánh dấu nó là ô đầu tiên.)
Nhấn F5 để chạy code

PHP:
Option Explicit
Sub Group()
'Macro nay tao group theo nguyen tac: dong dau tien bat dau tu o chua ky tu <A-Z>
' dong ke tiep la so TT, cho den khi gap o chua ky tu thi ngung
Dim lr&, i&, k&, rng, bd, ce As Range, arr(1 To 1000, 1 To 2)
lr = Cells(Rows.Count, "A").End(xlUp).Row
Set ce = Range("A10") ' O co stt la chu cai dau tien
On Error Resume Next
ActiveSheet.Rows.Select
Selection.ClearOutline
On Error GoTo 0
With ActiveSheet.Outline
    .AutomaticStyles = True
    .SummaryRow = xlBelow
End With
Do
    If Not IsNumeric(ce) Then
        Set ce = ce.Offset(1, 0)
        k = k + 1: arr(k, 1) = ce.Row
        If ce.Row = lr Then Exit Do
        Do While IsNumeric(ce)
            Set ce = ce.Offset(1, 0)
            If ce.Row = lr Then Exit Do
        Loop
        arr(k, 2) = ce.Row - 1
    End If
    If ce.Row = lr Then Exit Do
Loop
If k = 0 Then Exit Sub
Range("BD106").Resize(k, 2).Value = arr
For i = 1 To k
    Rows(arr(i, 1) & ":" & arr(i, 2) + IIf(i = k, 1, 0)).Select
    Selection.Rows.Group
Next
Range("A10").Select
End Sub
 

File đính kèm

  • abc.xlsm
    149.8 KB · Đọc: 14
Upvote 0
Range("BD106").Resize(k, 2).Value = arr
Xin hỏi anh dòng code này mục đích để kiểm chứng các mảng trong arr thôi phải không?
Em chưa hiểu lắm về câu lệnh .Clearoutline, hình như nó chỉ chuyên dùng trong trường hợp ungroup các đối tượng trong bảng tính, Em cũng chú ý thêm là nếu dùng clearoutline trực tiếp trên bảng tính thì sẽ ko back lại được, không phải như ungroup thông thường.
z4844465662385_91fa116246b510e3deb2145f6200e716.jpg
 
Upvote 0
Xin hỏi anh dòng code này mục đích để kiểm chứng các mảng trong arr thôi phải không?
Em chưa hiểu lắm về câu lệnh .Clearoutline, hình như nó chỉ chuyên dùng trong trường hợp ungroup các đối tượng trong bảng tính, Em cũng chú ý thêm là nếu dùng clearoutline trực tiếp trên bảng tính thì sẽ ko back lại được, không phải như ungroup thông thường.
Dòng đó là trong quá trình viết, để mình in mảng ra kiểm tra thôi mà. Mình quên delete.
Trước khi grouping mới, cần xóa cái group cũ (nếu có), sau đó mới làm lệnh group
 
Upvote 0
Chạy thử code này nhé.
Vào từng sheet để tạo. Mỗi sheet đều có ô đầu tiên của cột thứ tự là chữ cái. VD: sheet "Kieu 1" là ô A10
Vào code sửa dòng này
Set ce = Range("A10") ' O co stt la chu cai dau tien
(Nếu quên sửa mà treo máy ráng chịu)
(Có thể tại inputbox để nhập ô này. Hoặc trong sheet bạn phải xác định đánh dấu nó là ô đầu tiên.)
Nhấn F5 để chạy code
Cám ơn bạn. Mình vừa chạy thử trên file thực tế mình cần.
- Cơ bản chạy ổn nhưng có vấn đề sau bạn sửa giúp được không:
1. Hiện tại Code đang chạy: Với tiêu đề Hạng mục là chữ cái (A - Z). Bạn có thể sửa thêm thành chữ cái hoặc số La Mã Code đều chạy được (nhận diện là Hạng mục). Như bên sheet Kiểu II của file excel đính kèm: thì các Hạng mục đánh số theo kiểu là I -> II -> III ....các dòng con vẫn là số tự nhiên (1 -> n).
2. Khi đến dòng nào ô đầu tiên (STT) này trống thì Code sẽ ngừng: ok hợp lý.
Nhưng không hiểu sao trong file thực tế mình chạy: Code vẫn tiếp tục chạy đến khi hết các nội dung ... cuối của sheet luôn (nhóm luôn cả những dòng ký tá của 2 bên và các nội dung chữ khác (ko cần group)
 
Upvote 0
Code vẫn tiếp tục chạy đến khi hết các nội dung ... cuối của sheet luôn (nhóm luôn cả những dòng ký tá của 2 bên và các nội dung chữ khác (ko cần group)
Nếu vậy bạn phải khao báo thẳng lr luôn , vì code anh bebo viết chỉ dừng khi ce= lr
Hạng mục đánh số theo kiểu là I -> II -> III ....các dòng con vẫn là số tự nhiên (1 -> n).
Số chữ cái (A,B,C..) có khác số la mã (I,II,III) trong code không, vì nó vẫn không phải là number (số) nên kết quả đều trả về False.
Bạn nên test lại khúc này mình thấy code vẫn chạy bt nhé.
 
Upvote 0
Nếu vậy bạn phải khao báo thẳng lr luôn , vì code anh bebo viết chỉ dừng khi ce= lr
Bạn biết cách chỉnh lại code không chỉ giúp mình với .... mù mờ về mấy code quá luôn bạn.
- Mình chạy ok được rồi nhưng mà bị group thêm một số dòng bên dưới nữa (không cần) sau dòng trống. Group đến hết cuối cùng Sheet luôn.
- Thanks bạn
 
Upvote 0
Bạn biết cách chỉnh lại code không chỉ giúp mình với .... mù mờ về mấy code quá luôn bạn.
- Mình chạy ok được rồi nhưng mà bị group thêm một số dòng bên dưới nữa (không cần) sau dòng trống. Group đến hết cuối cùng Sheet luôn.
- Thanks bạn
Làm 1 công tắc On/Off để ẩn/hiện tiểu mục...
 

File đính kèm

  • HideRow.xlsm
    97.4 KB · Đọc: 11
Upvote 0
Làm 1 công tắc On/Off để ẩn/hiện tiểu mục...
Nút bạn làm hay quá bạn. Và câu lệnh chỉ có mấy dòng ... quá tuyệt.
- Nhưng cho mình hỏi tí, trong các cú pháp: thì mình thấy có sự thay đổi i từ (a - b) cho từng sheet. và range cũng phải sửa tương tự.
1. Hai biến a và b này bạn đang quy định như thế nào, tính thế nào chỉ giúp mình tính với (do nếu với 1 bảng tính với số lượng dòng dữ liệu khác sheet trong file thì chắc là sẽ không tự chạy được).
2. Xin hỏi bạn có cách nào cho người dòng nhập vào "a - b" này không? Giống như trước khi chạy lệnh lần đầu tiên (cả sheet chưa có Group) sẽ hỏi 1 lần a và b là bao nhiêu để người dùng nhập.
Cám ơn bạn nhiều.
 
Upvote 0
Nút bạn làm hay quá bạn. Và câu lệnh chỉ có mấy dòng ... quá tuyệt.
- Nhưng cho mình hỏi tí, trong các cú pháp: thì mình thấy có sự thay đổi i từ (a - b) cho từng sheet. và range cũng phải sửa tương tự.
1. Hai biến a và b này bạn đang quy định như thế nào, tính thế nào chỉ giúp mình tính với (do nếu với 1 bảng tính với số lượng dòng dữ liệu khác sheet trong file thì chắc là sẽ không tự chạy được).
2. Xin hỏi bạn có cách nào cho người dòng nhập vào "a - b" này không? Giống như trước khi chạy lệnh lần đầu tiên (cả sheet chưa có Group) sẽ hỏi 1 lần a và b là bao nhiêu để người dùng nhập.
Cám ơn bạn nhiều.
For i = a To b
a = số dòng có STT đầu tiên (1) là dòng 10
b= số dòng có STT cuối cùng (30) là dòng 105
 

File đính kèm

  • Untitled.png
    Untitled.png
    4.6 KB · Đọc: 4
Upvote 0
Tớ thấy mấy cái nhóm (group) này cần người dùng tùy biến nhiều vì mỗi file mỗi kiểu, nên tớ không code mà đưa vào quick access rồi cứ Alt+ number phang tới luôn 1715246454212.png
 
Upvote 0
Tớ thấy mấy cái nhóm (group) này cần người dùng tùy biến nhiều vì mỗi file mỗi kiểu, nên tớ không code mà đưa vào quick access rồi cứ Alt+ number phang tới luôn
Không cần làm vậy. Group nhóm đầu tiên, sau đó là F4.
 
Upvote 0
Web KT
Back
Top Bottom