- Tham gia
- 8/10/21
- Bài viết
- 10
- Được thích
- -1
(1) Chúc mừng bạn nhiều nha!(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 !
Bạn thử code này nhé!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.
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
Cách tính số dòng của bạn nhiều dòng quá.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
Ngày | Doanh Thu | Ngày | Doanh 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à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....
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.
Em cám ơn bác chỉ ra điểm thiếu sót.@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ày Doanh Thu Ngày Doanh 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 102Tổ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.5Tổng 164.3 3/15/2021 79.5|==>> 3/15/2021 101.2 3/15/2021 94.5|==>> 3/15/2021 79.5Tổng 275.2Tổng công: 685
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
Em cám ơn bác ạ.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.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
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.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âng em cảm ơn.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)