Làm thế nào để chèn 2 dòng trống sau 5 dòng

Liên hệ QC

BinhCan997

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
8/10/21
Bài viết
10
Được thích
-1
Chào các bạn. Mình cần 1 mã code để chạy tự động chèn thêm 2 dòng trống sau 5 dòng ( Không phân biệt ô đó có dữ liệu hay không có dữ liệu ). Hiện tại mình chỉ biết cách chèn thủ công. Nên không biết viết code. Nhờ anh chị diễn đàn giúp. Xin cảm ơn

1634128138008.png
 
Lần chỉnh sửa cuối:
Giải pháp
(2) Số 5 đó minh họa thôi bạn. Mình chỉ muốn đơn giản từ dòng 1 đến dòng 1000 chẳng hạn. Thì cứ 5 dòng chèn 2 dòng trống
(1) Cảm ơn mọi người mình đã làm xong !
(1) Chúc mừng bạn nhiều nha!
(2) Có 1 cách duyệt từ dòng 1 cho đến dòng cuối
2.0 Xác định dòng cuối & ấn nó vô tham biến Rws;
2.1 Khai báo biến mảng có số dòng là 120% Rws
2.3 Tạo vòng lặp duyệt từ dòng đầu đến Rws;
Trong khi duyệt, nếu chỉ số dòng <> 5 (không chia hết cho 5) thì ghi dữ liệu của dòng vô mảng;
Khi gặp dòng chia hết cho 5 thì:
a./ Cũng ghi dữ liệu như 4 dòng trên
b./ Tăng chỉ số của biến mảng lên 2 dòng
& cứ thế tiếp cho đến hết dữ liệu
2.4 'Đập' (phương ngữ GPE.COM) lên trang tính dữ liệu có trong mảng

[Viết cho những ai quan tâm thêm 1...
Cũng đề bài này mà nâng cấp 1 chút.VD chèn số dòng trống (bằng Input box) sau số dòng( bằng Input box). VD mình nhập 4, rồi 6: tức là chèn 4 dòng trống sau 6 dòng..........kiểu như vậy thì code thế nào các huynh.
Bạn thử code này nhé!

PHP:
Function InsertBlankRows(SourceRange As Range, EachRows As Integer, NumAddBlankRows As Integer) As Variant
    'SourceRange: Vung du lieu goc
    'EachRows: Tan suat thuc hien chen dong trang
    'NumAddBlankRows: So dong trang chen them tung lan
    
    Dim sArr(), Res()
    Dim I As Long, K As Long, J As Long
    
    'Kiem tra bao dam Vung du lieu goc chi co 1 cot
    If SourceRange.Columns.Count > 1 Then Exit Function
    'Kiem tra bao dam cac dieu kien la so nguyen lon hon 0
    If EachRows < 1 Or NumAddBlankRows < 1 Then Exit Function
    
    'Gan Vung du lieu goc sang mang
    sArr() = SourceRange
    'Xac dinh kich thuoc mang ket qua
    ReDim Res(1 To UBound(sArr, 1) + Int(UBound(sArr, 1) / EachRows) * NumAddBlankRows, 1 To 1)
    
    'Chay vong lap qua tung phan tu cua Mang du lieu goc
    For I = 1 To UBound(sArr, 1)
        K = K + 1
        Res(K, 1) = sArr(I, 1)
        'Truong hop chi so cua phan tu chia het cho Tan suat dong
        If I Mod EachRows = 0 Then
            K = K + NumAddBlankRows
        End If
    Next I
    
    InsertBlankRows = Res
End Function
 
Upvote 0
Bạn thử code này nhé!

'Chay vong lap qua tung phan tu cua Mang du lieu goc
For I = 1 To UBound(sArr, 1)
K = K + 1
Res(K, 1) = sArr(I, 1)
'Truong hop chi so cua phan tu chia het cho Tan suat dong
If I Mod EachRows = 0 Then
K = K + NumAddBlankRows
End If
Next I
Cách tính số dòng của bạn nhiều dòng quá.

K = I + ((I - 1) \ EachRows) * NumAddBlankRows

Code trên thành ra:
For I = 1 To UBound(sArr, 1)
Res(I + ((I - 1) \ EachRows) * NumAddBlankRows, 1) = sArr(I, 1)
Next I
 
Upvote 0
@VanThinh3001: Bạn có công đoạn kiểm tra số cột dữ liệu (DL) & cho rằng số cột lớn hơn 1 thì nghỉ chơi;
Mình cho rằng như vậy là bạn giải bài toán không có trong thực tiển.
Mình cho là người ta phải thêm 1 hay vài dòng trắng là để thêm công thức hay số liệu tính tổng hay trung bình của các đoạn/nhóm kết quả.
(Tất nhiên từ 'người ta' ở đây không bao hàm tác giả của chủ bài đăng!)
Từ đề bài của #1, ta có thể nêu ra dòng họ các bài này như sau:

#C++: Tính tổng doanh thu từng ngày sau khi đã thêm 2 dòng trắng của mỗi 1 ngày bán hàng:

NgàyDoanh ThuNgàyDoanh Thu
3/13/2021​
80​
3/13/2021​
80​
3/13/2021​
75​
3/13/2021​
75​
3/13/2021​
90.5​
|==>>
3/13/2021​
90.5​
3/13/2021​
102​
Tổng
245.5
3/14/2021​
79.6​
3/14/2021​
84.7​
|==>>
3/14/2021​
79.6​
3/15/2021​
101.2​
3/14/2021​
84.7​
3/15/2021​
94.5​
Tổng
164.3
3/15/2021​
79.5​
|==>>
3/15/2021​
101.2​
3/15/2021​
94.5​
|==>>
3/15/2021​
79.5​
Tổng
275.2
Tổng công:
685
 
Lần chỉnh sửa cuối:
Upvote 0
...

Theo tôi thì cái đáng học ở bài này là: làm sao nhìn bài #1 hì biết ngay là 'người quen'?
Làm được điều này, bạn học được kỹ năng thống kê và phỏng đoán theo dạng 'pattern recognition'

Gợi ý: pattern số 1 là cứ khoảng 1 tháng thì đăng ký 1 cái tên mới. Đăng bài hỏi, nhưng cái bổn tánh hung hăng không chừa cho nên chỉ mọt thời gian ngắn là gây hết mọt số đông. Dẫu không bị ban của ban đỏ thì cũng bị bà con GPE tẩy chay. Tên ấy hết công dụng, trở lại 'pattern' đăng tên mới.
Làm sao mà bác thấy được "người quen" chỉ bằng cách đọc bài #1 được bác nhỉ? Gợi ý pattern ấy tôi chưa tiếp thu được.
 
Upvote 0
@VanThinh3001: Bạn có công đoạn kiểm tra số cột dữ liệu (DL) & cho rằng số cột lớn hơn 1 thì nghỉ chơi;
Mình cho rằng như vậy là bạn giải bài toán không có trong thực tiển.
Mình cho là người ta phải thêm 1 hay vài dòng trắng là để thêm công thức hay số liệu tính tổng hay trung bình của các đoạn/nhóm kết quả.
(Tất nhiên từ 'người ta' ở đây không bao hàm tác giả của chủ bài đăng!)
Từ đề bài của #1, ta có thể nêu ra dòng họ các bài này như sau:

#C++: Tính tổng doanh thu từng ngày sau khi đã thêm 2 dòng trắng của mỗi 1 ngày bán hàng:

NgàyDoanh ThuNgàyDoanh Thu
3/13/2021​
80​
3/13/2021​
80​
3/13/2021​
75​
3/13/2021​
75​
3/13/2021​
90.5​
|==>>
3/13/2021​
90.5​
3/13/2021​
102​
Tổng
245.5
3/14/2021​
79.6​
3/14/2021​
84.7​
|==>>
3/14/2021​
79.6​
3/15/2021​
101.2​
3/14/2021​
84.7​
3/15/2021​
94.5​
Tổng
164.3
3/15/2021​
79.5​
|==>>
3/15/2021​
101.2​
3/15/2021​
94.5​
|==>>
3/15/2021​
79.5​
Tổng
275.2
Tổng công:
685
Em cám ơn bác chỉ ra điểm thiếu sót.
Em sửa lại như sau ạ.
PHP:
Function InsertBlankRows(SourceRange As Range, EachRows As Integer, NumAddBlankRows As Integer) As Variant
    'SourceRange: Vung du lieu goc
    'EachRows: Tan suat thuc hien chen dong trang
    'NumAddBlankRows: So dong trang chen them tung lan
    
    Dim sArr(), Res()
    Dim I As Long, K As Long, J As Long
  
    'Kiem tra bao dam cac dieu kien la so nguyen lon hon 0
    If EachRows < 1 Or NumAddBlankRows < 1 Then Exit Function
    
    'Gan Vung du lieu goc sang mang
    sArr() = SourceRange
    'Xac dinh kich thuoc mang ket qua
    ReDim Res(1 To UBound(sArr, 1) + Int(UBound(sArr, 1) / EachRows) * NumAddBlankRows, 1 To UBound(sArr, 2))
    
    'Chay vong lap qua tung phan tu cua Mang du lieu goc
    For I = 1 To UBound(sArr, 1)
        K = K + 1
        For J = 1 To UBound(sArr, 2)
            Res(K, J) = sArr(I, J)
        Next J
        'Truong hop chi so cua phan tu chia het cho Tan suat dong
        If I Mod EachRows = 0 Then
            K = K + NumAddBlankRows
        End If
    Next I
    
    InsertBlankRows = Res
End Function
Bài đã được tự động gộp:

Cách tính số dòng của bạn nhiều dòng quá.

K = I + ((I - 1) \ EachRows) * NumAddBlankRows

Code trên thành ra:
For I = 1 To UBound(sArr, 1)
Res(I + ((I - 1) \ EachRows) * NumAddBlankRows, 1) = sArr(I, 1)
Next I
Em cám ơn bác ạ.
Em vốn học toán thuộc loại khá xoàng nên chưa nghĩ ra phương án nhanh gọn như vậy ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Cách tính số dòng của bạn nhiều dòng quá.

K = I + ((I - 1) \ EachRows) * NumAddBlankRows

Code trên thành ra:
For I = 1 To UBound(sArr, 1)
Res(I + ((I - 1) \ EachRows) * NumAddBlankRows, 1) = sArr(I, 1)
Next I
Hay nhỉ bác nhiều cái rút gọn được nhiều công đoạn tính số vòng lặp mà giờ em mới biết là số thứ tự bị lẻ trong mảng nó tự làm tròn.Mà em không hiểu sao nó lại như thế này là sao nhỉ bác.
1634180570405.png
 
Lần chỉnh sửa cuối:
Upvote 0
Hay nhỉ bác nhiều cái rút gọn được nhiều công đoạn tính số vòng lặp mà giờ em mới biết là số thứ tự bị lẻ trong mảng nó tự làm tròn.Mà em không hiểu sao nó lại như thế này là sao nhỉ bác.
Vì chỉ số của mảng phải là số nguyên cho nên nếu biểu thức tính chỉ số ở dạng số thập phân thì VBA tự ép kiểu thành số nguyên.
Con toán chia trong máy tính ít khi ra tròn số như ta tính tay. Vì vậy phép ép kiểu có thể ép 3,50000001 thành 4 và 4,49999999 thành 4 luôn. Muốn chắc điều này, bạn phải làm một dãy test khoảng vài trăm số.

Để tránh sự bất ngờ vì VBA ép kiểu, người lập trình có kinh nghiệm luôn tự quyết định làm tròn số lẻ trong con toán chia số nguyên.
Bạn phân tích kỹ biểu thức tôi viết ở bài #22 sẽ thấy con toán chia tôi dùng \ tức là chia 2 số nguyên, không lấy thập phân (nếu dùng / thì có thập phân). VBA không cần ép kiểu trong biểu thức này.

Trong lập trình cổ điển, cách tự kiểm soát làm tròn là dùng hàm FIX.
Muốn làm tròn xuống thì FIX(x). Muốn làm tròn lên thì FIX(x + SIGN(x)*0.5)
 
Upvote 0
Vì chỉ số của mảng phải là số nguyên cho nên nếu biểu thức tính chỉ số ở dạng số thập phân thì VBA tự ép kiểu thành số nguyên.
Con toán chia trong máy tính ít khi ra tròn số như ta tính tay. Vì vậy phép ép kiểu có thể ép 3,50000001 thành 4 và 4,49999999 thành 4 luôn. Muốn chắc điều này, bạn phải làm một dãy test khoảng vài trăm số.

Để tránh sự bất ngờ vì VBA ép kiểu, người lập trình có kinh nghiệm luôn tự quyết định làm tròn số lẻ trong con toán chia số nguyên.
Bạn phân tích kỹ biểu thức tôi viết ở bài #22 sẽ thấy con toán chia tôi dùng \ tức là chia 2 số nguyên, không lấy thập phân (nếu dùng / thì có thập phân). VBA không cần ép kiểu trong biểu thức này.

Trong lập trình cổ điển, cách tự kiểm soát làm tròn là dùng hàm FIX.
Muốn làm tròn xuống thì FIX(x). Muốn làm tròn lên thì FIX(x + SIGN(x)*0.5)
Vâng em cảm ơn.
 
Upvote 0
Web KT

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

Back
Top Bottom