Làm thế nào để chèn 2 dòng trống sau 5 dòng (1 người xem)

Liên hệ QC

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

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...
Bạn phải trãi qua các bước sau:
1./ Đưa cột A:A có dữ liệu vô tham biến
2./ Tìm những ô có chứa con số '5'
3./ Ô tìm thấy ta chọn 2 dòng & thêm dòng thôi

Chúc bạn thành công!
 
Upvote 0
Bạn phải trãi qua các bước sau:
1./ Đưa cột A:A có dữ liệu vô tham biến
2./ Tìm những ô có chứa con số '5'
3./ Ô tìm thấy ta chọn 2 dòng & thêm dòng thôi

Chúc bạn thành công!
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
1634127978749.png
Bài đã được tự động gộp:

Cảm ơn mọi người mình đã làm xong !
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn phải trãi qua các bước sau:
1./ Đưa cột A:A có dữ liệu vô tham biến
2./ Tìm những ô có chứa con số '5'
3./ Ô tìm thấy ta chọn 2 dòng & thêm dòng thôi

Chúc bạn thành công!
51, 52, 53, 54 đều chứa số '5'.
Bài này làm tuỳ theo chèn dòng mà có lẫn mẫu mã tô đậm tô màu tùm lum hay không.

Nếu không thì tương đối nhanh:
- đọc dữ liệu vào 1 mảng với số dòng là sd1
- lập mọt mảng mới với số dòng sd2 = Fix(sd1*7/5 + 0.5)
- chép tuần tự bên mảng 1 sang mảng 2, cứ 5 dòng thì bên 2 nhảy thêm 2.
- chép mảng 2 trở vào sheet

Nếu có thì tương đối giản dị nhưng chậm:
- đọc ngược range từ dưới lên, kể từ dòng cuối cùngn chia chẵn cho 5. Bước 5.
- thêm 2 dòng

thành công: hổng dám đâu. Bạn quên mất người quen này rồi à?
 
Lần chỉnh sửa cuối:
Upvote 0
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
View attachment 267681
Bài đã được tự động gộp:

Cảm ơn mọi người mình đã làm xong !
Ban thử code này coi. Nhớ ấn 1 lần thôi nhé
Mã:
Sub Insert_Dong()
Dim i&, iR&, jI&
With ActiveSheet
iR = ActiveSheet.Range("A" & Rows.Count).End(3).Row
    j = -2
    For i = 1 To iR Step 5
        j = j + 7
        .Rows(j + 1).Insert xlDown, xlFormatFromLeftOrAbove
        .Rows(j + 2).Insert xlDown, xlFormatFromLeftOrAbove
    Next
End With
End Sub
 
Upvote 0
Ban thử code này coi. Nhớ ấn 1 lần thôi nhé
Mã:
Sub Insert_Dong()
Dim i&, iR&, jI&
With ActiveSheet
iR = ActiveSheet.Range("A" & Rows.Count).End(3).Row
    j = -2
    For i = 1 To iR Step 5
        j = j + 7
        .Rows(j + 1).Insert xlDown, xlFormatFromLeftOrAbove
        .Rows(j + 2).Insert xlDown, xlFormatFromLeftOrAbove
    Next
End With
End Sub

Tôi chỉ ngược lại bạn luôn nè

Sub Test()
Dim i As Long
For i = 10001 To 5 Step -5
Rows(i).Resize(2).Insert
Next i
End Sub
 
Upvote 0
Ok ok. Haha. Ghi nhận. Em xin ghi nhận
Chỉ tiếp. Nếu muốn không ảnh hưởng công thức, dữ liệu vùng xung quanh. vì sự ảnh hưởng khi ta chèn dòng

Mã:
Sub test()
   Dim i As Long
   For i = 10001 To 5 Step -5
     Cells(i, 1).Resize(2).Insert xlShiftDown
   Next i
End Sub
 
Upvote 0
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.
 
Upvote 0
(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 tham khảo lúc rỗi!]
 
Upvote 0
Giải pháp
Chỉ tiếp. Nếu muốn không ảnh hưởng công thức, dữ liệu vùng xung quanh. vì sự ảnh hưởng khi ta chèn dòng

Mã:
Sub test()
   Dim i As Long
   For i = 10001 To 5 Step -5
     Cells(i, 1).Resize(2).Insert xlShiftDown
   Next i
End Sub
Code này hơi bị dỏm ở chỗ là for i = 1001 nếu nó là 2000 hay 3000 phải sửa lại à
Cho bác code này nè, ngon lành hơn nhiều

Sub chen_dong_trong()
Dim ar(), i As Integer, k As Integer, kq(), j As Integer
ar = Range("A1").CurrentRegion.Value
ReDim kq(1 To UBound(ar) + (Int(UBound(ar) / 5) + 1) * 2, 1 To UBound(ar, 2))
For i = 1 To UBound(ar)
k = k + 1
For j = 1 To UBound(ar, 2)
kq(k, j) = ar(i, j)
Next
If i Mod 5 = 0 Then k = k + 2
Next
Range("A1").Resize(UBound(kq), UBound(kq, 2)) = kq
End Sub
 
Upvote 0
Con có biết gì đâu. Anh ấy chỉ lại là tốt rồi. Cái nào hay. Thì còn chắt lọc để học cũng được mà chú
Thớt là dân chuyên Xê Cọng Cọng. Cho nên chỉ thích những code gọn nhẹ.
Toi chỉ chả hiểu tại sao tự xưng dân xịn Xê Cọng Cọng mà không thấy chút hiểu biết nào về test biên trị (boundary test).

(*1) dân viết các lớp (classes) cho Xê cọng cọng luôn phải sử dụng tối thiểu 2 loại tests: boudary test và unit test.
 
Upvote 0
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.
PHP:
Sub ThemDongTheoYeuCau()
 Dim SoDgThem As Byte, KC As Integer, Rws As Long, Col As Integer
 Dim J As Long, W As Long, Hg As Integer, Cot As Integer
 
 Rws = [B2].CurrentRegion.Rows.Count
 Col = [B2].CurrentRegion.Columns.Count
 SoDgThem = InputBox("Sô Dòng Thêm:", "GPE.COM", 3)
 KC = InputBox("Khoang Cách Dòng:", "GPE.COM", 7)
 If SoDgThem < 3 Or SoDgThem > 6 Then SoDgThem = 3
 If KC < 7 Or KC > 9 Then KC = 7
 ReDim Arr(1 To 9 * Rws, 1 To Col)
 For J = 2 To Rws Step KC
    For Hg = 1 To KC
        W = W + 1
        For Cot = 1 To Col
            Arr(W, Cot) = Cells(J + Hg - 1, Cot).Value
        Next Cot
    Next Hg
    W = W + SoDgThem
 Next J
 Cells(2, Col + 2).Resize(W, Col).Value = Arr()
End Sub
 
Upvote 0
Code này hơi bị dỏm ở chỗ là for i = 1001 nếu nó là 2000 hay 3000 phải sửa lại à
Cho bác code này nè, ngon lành hơn nhiều

Sub chen_dong_trong()
Dim ar(), i As Integer, k As Integer, kq(), j As Integer
ar = Range("A1").CurrentRegion.Value
ReDim kq(1 To UBound(ar) + (Int(UBound(ar) / 5) + 1) * 2, 1 To UBound(ar, 2))
For i = 1 To UBound(ar)
k = k + 1
For j = 1 To UBound(ar, 2)
kq(k, j) = ar(i, j)
Next
If i Mod 5 = 0 Then k = k + 2
Next
Range("A1").Resize(UBound(kq), UBound(kq, 2)) = kq
End Sub
Hơi ngạo nghễ nha em. trình độ còn Non và xanh lắm em trai. Ví dụ dữ liệu như thế này thì cứ 5 dòng cách 2 dòng có được không? Cần tìm kiểu kỳ trước khi phát biểu nha em.

1634135666876.png
 
Upvote 0
Hơi ngạo nghễ nha em. trình độ còn Non và xanh lắm em trai. Ví dụ dữ liệu như thế này thì cứ 5 dòng cách 2 dòng có được không? Cần tìm kiểu kỳ trước khi phát biểu nha em.

View attachment 267688
Em biết lỗi rồi, em chỉ là hạt cát trong sa mạc, giọt nước giữa đại dương mênh mông thôi........Xin kính cẩn nghiêng mình đứng nép 1 bên để lắng nghe và học hỏi.
 
Upvote 0
Con có biết gì đâu. Anh ấy chỉ lại là tốt rồi. Cái nào hay. Thì còn chắt lọc để học cũng được mà chú
Nick VetBikini đó đã bị Bank Nick 1 tháng rồi. Vì tội Hỗn láo với nhiều thành viên. bạn không nên trách nick đó làm gì. Riêng mình thì bài viết của Thành viên VetBikini mình coi như rác đổ đi. Nên không bao giờ quan tâm câu trả lời của thành viên này
 
Upvote 0
....Xin kính cẩn nghiêng mình đứng nép 1 bên để lắng nghe và học hỏi.
.... Thì còn chắt lọc để học cũng được mà chú
Đói với dân đòi lấy tiền 200 đô Mỹ một tiết dạy Xê Cọng Cọng thì bạn nghĩ là bạn có thể học phơ-ri à?

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.
 
Upvote 0
Em biết lỗi rồi, em chỉ là hạt cát trong sa mạc, giọt nước giữa đại dương mênh mông thôi........Xin kính cẩn nghiêng mình đứng nép 1 bên để lắng nghe và học hỏi.

Đói với dân đòi lấy tiền 200 đô Mỹ một tiết dạy Xê Cọng Cọng thì bạn nghĩ là bạn có thể học phơ-ri à?

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.

Đói với dân đòi lấy tiền 200 đô Mỹ một tiết dạy Xê Cọng Cọng thì bạn nghĩ là bạn có thể học phơ-ri à?

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.
Thành viên đã từng bị ban Nick 1 tháng vì tội hỗn Láo. Già rồi mà Láo. Bị ban nick 1 tháng chưa chừa cái tật nói nhiều à.
 
Upvote 0
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

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

Back
Top Bottom