Hỏi về chèn dòng có điều kiện kết hợp tự động điền dòng chữ (vào dòng vừa chèn) (1 người xem)

Liên hệ QC

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

Dauthivan

Thành viên tiêu biểu
Tham gia
15/8/08
Bài viết
565
Được thích
327
Bài toán hôm qua nhờ mọi người góp ý, buổi hôm nay ngồi nghiên cứu viết Code giờ em đã bắt đầu quen dần. Hiện tại, bản thân em đã có thể tự làm được các kiểu bài tương tự rồi.

Em xin nhờ mọi người giúp em thêm 01 bài toán:
DB2_Chendong.jpg


Yêu cầu của đầu bài: Tại mỗi dòng cuối của tất cả công việc, làm thế nào để sau khi chạy Code thì mỗi công việc được tự động chèn thêm 2 dòng, đồng thời nội dung của từng dòng được đánh nội dung vào luôn như sau:
- Dòng thứ nhất xuất hiện dòng chữ: Chi phí chung
- Dòng thứ 2 xuất hiện dòng chữ: Thu nhập chịu thuế tính trước

Trên màn hình kết quả hình ảnh sau khi chèn dòng màu vàng (em làm mẫu công việc số 1)

KQ2_Chendong.jpg
 

File đính kèm

Lần chỉnh sửa cuối:
Khởi động ngày mới! Bạn chạy thử CODE này nhé! Mình cũng đang tập tành học VBA như bạn đó!
PHP:
Sub inSertRow()
Dim fRow, lRow
Dim i As Long
Dim Clls1 As Range
Set Clls1 = Cells(8, 8)

fRow = 4
lRow = Cells(65536, 3).End(xlUp).Row
    Cells(lRow + 1, 3).Resize(2).Value = Clls1.Resize(2).Value
    With Cells(lRow + 1, 3)
        .Resize(2).HorizontalAlignment = xlLeft
        .Resize(2).Font.FontStyle = "Bold"
    End With
For i = lRow To fRow + 2 Step -1
With Cells(i, 1)
    If .Value <> "" Then
        .Resize(2, 1).EntireRow.Insert
        .Offset(-2, 2).Resize(2).Value = Clls1.Resize(2).Value
        With .Offset(-2, 2).Resize(2)
            .HorizontalAlignment = xlLeft
            .Font.FontStyle = "Bold"
        End With
    End If
    End With
Next
End Sub
Bạn thử làm cách khác nhé, dùng vòng lặp không xác định DO WHILE.....LOOP hoặc DO....LOOP UNTIL kết hợp với thuộc tính End() xem sao!Cùng nhau học hỏi!
 
Lần chỉnh sửa cuối:
Upvote 0
Hoa còi suy nghĩ thêm: thử bỏ đoạn code phía trên vòng lặp For. Coi như bài tập suy luận.
Vì đoạn code đó giống y đoạn code bên trong vòng lặp.

Tức là bỏ hẳn đoạn này:
PHP:
    Cells(lRow + 1, 3).Resize(2).Value = Clls1.Resize(2).Value
    With Cells(lRow + 1, 3)
    .Resize(2).HorizontalAlignment = xlLeft
    .Resize(2).Font.FontStyle = "Bold"
    End With
 
Upvote 0
Công việc bận quá giờ mới ghé diễn đàn được, hoa còi thử làm theo gợi ý của sư phụ, thanks sư phụ!
PHP:
Sub inSertRow()
Dim fRow, lRow
Dim i As Long
Dim Clls1 As Range
Set Clls1 = Cells(8, 8)

fRow = 4
lRow = Cells(65536, 3).End(xlUp).Row
    
For i = lRow + 1 To fRow + 2 Step -1
With Cells(i, 1)
    If .Value <> "" Or i = lRow + 1 Then
        .Resize(2, 1).EntireRow.Insert
        .Offset(-2, 2).Resize(2).Value = Clls1.Resize(2).Value
        With .Offset(-2, 2).Resize(2)
            .HorizontalAlignment = xlLeft
            .Font.FontStyle = "Bold"
        End With
    End If
    End With
Next
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Chính xác là như thế!
Lần sau, hễ thấy cái gì giống giống nhau, tìm cách gom lại.
 
Upvote 0
Xin giúp em biết thêm một số đối tượng

Bạn thử làm cách khác nhé, dùng vòng lặp không xác định DO WHILE.....LOOP hoặc DO....LOOP UNTIL kết hợp với thuộc tính End() xem sao!Cùng nhau học hỏi!

Trình độ của bác hiện giờ đã tương đối thành thạo rồi, trình của em còi lắm. Một số đối tượng em đọc còn chưa hiểu, bác có biết hiện giờ có sách nào hướng dẫn học tốt nhất về VBA không ? Chỉ giúp cho em biết để em mua về đọc.

Rất mong bác và mọi người giải thích dùm em đoạn sau mới, em không biết nó là gì

PHP:
Set Clls1 = Cells(8, 8)
.............
.Resize(2, 1).EntireRow.Insert
 .Offset(-2, 2).Resize(2).Value = Clls1.Resize(2).Value

(M
ặc dù thuật toán em có hiểu, ví dụ dòng If .Value <> "" Or i = lRow + 1 Then thì em hiểu lựa chọn dòng thứ tự của các công việc (từ công việc thứ 2 trở đi).
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
(Mặc dù thuật toán em có hiểu, ví dụ dòng If .Value <> "" Or i = lRow + 1 Then thì  em hiểu lựa chọn dòng cuối của mỗi công việc, nhưng các thuộc tính,  cách dùng các đối tượng trong VBA nhiều cái em chưa hiểu hết)
Dauthivan hiểu nhầm rồi, cái này không gọi là thuật toán bạn ạ.
Thuật toán là trình tự các bước thực hiện để giải một bài toán hay thực hiện một công việc nào đó tù lúc nhập dữ liệu đến khi ra được kết quả. Cái mà bạn nói ở trên chỉ là các câu lệnh mô phỏng lại thuật toán mà thôi. Hay chính là ngôn ngữ để ta giao tiếp với máy tính để máy tính hiểu được ta muốn làm gì?
---------------------------------------------------------------------
Để làm bài toán này trước hết mình thường suy nghĩ nếu làm bằng bằng tay thì sẽ làm thế nào?
- Đầu tiên mình sẽ dò trên cột A từ dưới lên, cứ gặp ô có giá trị (khác rỗng) thì thực hiện chèn dòng và điền nội dung.
- Xác định xem dò như vậy đến khi nào thì dừng đây? Cái này chính là TÍNH DỪNG (HỮU HẠN) 1 đặc trưng THUẬT TOÁN
- Xét đến các phát sinh :trong bài này có một vấn đề phát sinh là ta phải điền cả nội dung vào 2 ô cuối cùng của vùng dữ liệu trong khi ô điều kiện lại rỗng??? Định dạng lại dữ liệu sau khi chèn và điền nội dung cho đúng yêu cầu...
----------------------------------------------------------------------
Bạn đọc thử cái này xem có hiểu không nhé, HMT diễn giải theo ý hiểu của mình khi viết CODE
PHP:
Sub inSertRow()
Dim fRow, lRow
Dim i As Long
Dim Clls1 As Range
'Do khai bao Clls la doi tuong Range nen khi gan gia tri cho bien doi tuong phai dung tu khoa set
Set Clls1 = Cells(8, 8) ' Clls1 = H8
'Xac dinh dong dau tien cua vung du lieu
fRow = 4
'Xac dinh dong cuoi cung cua vung du lieu
lRow = Cells(65536, 3).End(xlUp).Row
'Duyet tu o cuoi cung len o dau tien
For i = lRow + 1 To fRow + 2 Step -1
'Vi phai chen them 2 dong vao o cuoi cung nen ta phai cong them 1 vao lRow
'Neu duyet den tan fRow thi fRow thoa man khac rong no se chen them 2 dong (trong khi ta lai k can chen vao do) nen fRow + 2
With Cells(i, 1)
    If .Value <> "" Or i = lRow + 1 Then
    'Thoa man dieu kien thi tai o co chi so dong la i,cot 1 mo rong 2 dong, chon ca 2 dong do va thuc hien lenh chen
        .Resize(2, 1).EntireRow.Insert
    'Chen xong thi dien noi dung, tu o co chi so dong i, cot 1 di chuyen len tren 2 dong, dich sang phai 2 cot, mo rong kich thuoc cua vung ra
    'Ban xem them thuoc tinh offset và resize nhe
    ' Noi dung chen duoc dat san o cells(8,8)=H8 nen ta gan value cho no thoi
        .Offset(-2, 2).Resize(2).Value = Clls1.Resize(2).Value
        With .Offset(-2, 2).Resize(2)
        'Cai nay thi ghi macro la biet, he he
            .HorizontalAlignment = xlLeft
            .Font.FontStyle = "Bold"
        End With
    End If
    End With
Next
End Sub
 
Upvote 0
PHP:
(Mặc dù thuật toán em có hiểu, ví dụ dòng If .Value <> "" Or i = lRow + 1 Then thì  em hiểu lựa chọn dòng cuối của mỗi công việc, nhưng các thuộc tính,  cách dùng các đối tượng trong VBA nhiều cái em chưa hiểu hết)
Dauthivan hiểu nhầm rồi, cái này không gọi là thuật toán bạn ạ.
Thuật toán là trình tự các bước thực hiện để giải một bài toán hay thực hiện một công việc nào đó tù lúc nhập dữ liệu đến khi ra được kết quả. Cái mà bạn nói ở trên chỉ là các câu lệnh mô phỏng lại thuật toán mà thôi. Hay chính là ngôn ngữ để ta giao tiếp với máy tính để máy tính hiểu được ta muốn làm gì?
---------------------------------------------------------------------
Để làm bài toán này trước hết mình thường suy nghĩ nếu làm bằng bằng tay thì sẽ làm thế nào?
- Đầu tiên mình sẽ dò trên cột A từ dưới lên, cứ gặp ô có giá trị (khác rỗng) thì thực hiện chèn dòng và điền nội dung.
- Xác định xem dò như vậy đến khi nào thì dừng đây? Cái này chính là TÍNH DỪNG (HỮU HẠN) 1 đặc trưng THUẬT TOÁN
- Xét đến các phát sinh :trong bài này có một vấn đề phát sinh là ta phải điền cả nội dung vào 2 ô cuối cùng của vùng dữ liệu trong khi ô điều kiện lại rỗng??? Định dạng lại dữ liệu sau khi chèn và điền nội dung cho đúng yêu cầu...
----------------------------------------------------------------------
Bạn đọc thử cái này xem có hiểu không nhé, HMT diễn giải theo ý hiểu của mình khi viết CODE
PHP:
Sub inSertRow()
Dim fRow, lRow
Dim i As Long
Dim Clls1 As Range
'Do khai bao Clls la doi tuong Range nen khi gan gia tri cho bien doi tuong phai dung tu khoa set
Set Clls1 = Cells(8, 8) ' Clls1 = H8
'Xac dinh dong dau tien cua vung du lieu
fRow = 4
'Xac dinh dong cuoi cung cua vung du lieu
lRow = Cells(65536, 3).End(xlUp).Row
'Duyet tu o cuoi cung len o dau tien
For i = lRow + 1 To fRow + 2 Step -1
'Vi phai chen them 2 dong vao o cuoi cung nen ta phai cong them 1 vao lRow
'Neu duyet den tan fRow thi fRow thoa man khac rong no se chen them 2 dong (trong khi ta lai k can chen vao do) nen fRow + 2
With Cells(i, 1)
    If .Value <> "" Or i = lRow + 1 Then
    'Thoa man dieu kien thi tai o co chi so dong la i,cot 1 mo rong 2 dong, chon ca 2 dong do va thuc hien lenh chen
        .Resize(2, 1).EntireRow.Insert
    'Chen xong thi dien noi dung, tu o co chi so dong i, cot 1 di chuyen len tren 2 dong, dich sang phai 2 cot, mo rong kich thuoc cua vung ra
    'Ban xem them thuoc tinh offset và resize nhe
    ' Noi dung chen duoc dat san o cells(8,8)=H8 nen ta gan value cho no thoi
        .Offset(-2, 2).Resize(2).Value = Clls1.Resize(2).Value
        With .Offset(-2, 2).Resize(2)
        'Cai nay thi ghi macro la biet, he he
            .HorizontalAlignment = xlLeft
            .Font.FontStyle = "Bold"
        End With
    End If
    End With
Next
End Sub

Đa tạ bác nhiều, xem xong em hiểu ah, buổi chiều em diễn đạt nhầm ah. Qua một số ví dụ từ hôm nọ đọc, nghiên cứu đến giờ em nhận thấy về cơ bản là em xác định trình tự giải quyết khá nhanh, chỉ có điều yếu tố mà em thiếu nhất kinh nghiệm thực tế, chưa có đủ các công cụ để thực hiện giao tiếp với máy (có ý tưởng nhưng không biết cụ thể hoá bằng lệnh như thế nào).

Em sẽ cố gắng tận dụng dịp đón năm mới để trau dồi VBA, em rất mong nhận được sự giúp đỡ của mọi người.
 
Upvote 0
Trình độ của bác hiện giờ đã tương đối thành thạo rồi, trình của em còi lắm. Một số đối tượng em đọc còn chưa hiểu, bác có biết hiện giờ có sách nào hướng dẫn học tốt nhất về VBA không ? Chỉ giúp cho em biết để em mua về đọc
Chưa chắc HMT thành thạo hơn bạn, trình độ của HMT về VBA cũng A,B,C thôi, chắc không hơn bạn là mấy. Có chăng thì HMT được học bài bản hơn bạn 1 chút vì HMT có được sự giúp đỡ rất nhiệt tình của 1 mem trên GPE. Người ấy đã dìu dắt HMT những bước đi chập chững đầu tiên đến với VBA, HMT thực sự rất biết ơn người bạn ấy.
=============
Mình thấy bạn rất đam mê VBA, chịu khó post bài và hỏi bài nữa đó chính là bước khởi đầu tốt đẹp đó
=============
Ngay như đoạn CODE mà HMT sửa khi có gợi ý của sư phụ ptm0412 cũng chưa hay lắm, vẫn có cách khác xóa đoạn CODE thừa mà không cần OR đi OR lại trong FOR bằng cách gán cho dòng cuối cùng cột 1 giá trị khác rỗng, sau đó thực hiện vòng FOR hết vòng FOR ta xóa giá trị đó đi ---> Dauthivan làm thử nhé! HMT làm thấy nó hay hay.

Đôi lời chia sẻ cùng học hỏi, cùng tiến bộ!
 
Lần chỉnh sửa cuối:
Upvote 0
Chưa chắc HMT thành thạo hơn bạn, trình độ của HMT về VBA cũng A,B,C thôi, chắc không hơn bạn là mấy. Có chăng thì HMT được học bài bản hơn bạn 1 chút vì HMT có được sự giúp đỡ rất nhiệt tình của 1 mem trên GPE. Người ấy đã dìu dắt HMT những bước đi chập chững đầu tiên đến với VBA, HMT thực sự rất biết ơn người bạn ấy.
=============
Mình thấy bạn rất đam mê VBA, chịu khó post bài và hỏi bài nữa đó chính là bước khởi đầu tốt đẹp đó
=============
Ngay như đoạn CODE mà HMT sửa khi có gợi ý của sư phụ ptm0412 cũng chưa hay lắm, vẫn có cách khác xóa đoạn CODE thừa mà không cần OR bằng cách gán cho dòng cuối cùng cột 1 giá trị khác rỗng, sau đó thực hiện vòng FOR hết vòng FOR ta xóa giá trị đó đi ---> Dauthivan làm thử nhé! HMT làm thấy nó hay hay.

Đôi lời chia sẻ cùng học hỏi, cùng tiến bộ!

Em sẽ thử nghiên cứu làm xem, em chỉ cần những bài này đầu tiên làm kiểu gì miễn ra kết quả là mừng lắm rồi, sau này khi đã hiểu tương đối lúc đó mình sẽ có cái nhìn đầy đủ hơn, sau đó mới có thể đặt ra vấn đề tối ưu là làm cách nào nhanh, gọn nhất.

Hôm nọ, tình cờ trên diễn đàn em mới biết cách đây khoảng 5 năm về trước thày Ndu96081631 cũng mới bắt đầu như bác bây giờ. Em cũng được biết những ngày đầu tiên khi thày Ndu96081631 bước vào diễn đàn GPE một trong những người thày của thày Ndu96081631 chính là thày Ptm0412.

Khi nhìn lại bài toán trước kia do bản thân giải, giải thày Ndu96081631 viết vui đại ý là...đọc lại bài ngày xưa, không hiểu sao hồi đó...giải... ngu thế", mặc dù tư duy toán của thày Ndu96081631 rất sắc sảo, nhưng có lẽ khi đó thày chưa biết nhiều. Bây giờ, trình độ của thày Ndu96081631 và thày Ptm0412 đều ở mức siêu việt, hoàn hảo ở mức khó tưởng tượng.

Em sẽ cố gắng để không phụ công của bác, của các thày, mọi người trên diễn đàn đã chỉ bảo, em hy vọng sang năm mới em sẽ tiếp thu nhiều cái mới, hạn chế hỏi những câu "ngố quá".
 
Lần chỉnh sửa cuối:
Upvote 0
Xem thử CODE này nhé! Bạn thêm 2 dòng vào là được CODE! Cứ viết đi viết lại, viết sai sửa lại CODE, năng dùng Msgbox, F8 để kiểm tra các bước mình làm, dần dần mình sẽ vỡ ra được nhiều điều. Hoamattroicoi cũng thế đó! Mong bạn nhanh tiến bộ! Nếu rảnh nghiên cứu làm bài này với vòng lặp không xác định nhé! Cùng học hỏi, cùng tiến bộ. Thanks!
PHP:
Sub inSertRow()
Dim fRow, lRow
Dim i As Long
Dim Clls1 As Range
Set Clls1 = Cells(8, 8)
fRow = 4
lRow = Cells(65536, 3).End(xlUp).Row

Cells(lRow + 1, 1).Value = "hoamattroicoi"

For i = lRow + 1 To fRow + 2 Step -1
With Cells(i, 1)
    If .Value <> "" Then
        .Resize(2, 1).EntireRow.Insert
        .Offset(-2, 2).Resize(2).Value = Clls1.Resize(2).Value
        With .Offset(-2, 2).Resize(2)
            .HorizontalAlignment = xlLeft
            .Font.FontStyle = "Bold"
        End With
    End If
    End With
Next

Cells([A65536].End(xlUp).Row, 1).Value = ""

End Sub
 
Upvote 0
Với bài này, ta đã xác định ở cột A, khi gặp cell có dữ liệu thì chèn 2 dòng & gán giá trị, nếu Bé Còi chơi kiểu "nhảy cà tưng" từ dưới lên (sử dụng Do....Loop While & End(XlUp)) thì vòng lặp chỉ nhảy 3 bước là xong, nếu dùng For ...Next phải chạy đủ số dòng. Mình chỉ cảm giác như thế thôi chứ mình hổng biết làm, nếu Còi không làm được thì nhờ Lão Chết Tiệt làm giúp nhé. Hihi
Híc
 
Upvote 0
Xem thử CODE này nhé! Bạn thêm 2 dòng vào là được CODE! Cứ viết đi viết lại, viết sai sửa lại CODE, năng dùng Msgbox, F8 để kiểm tra các bước mình làm, dần dần mình sẽ vỡ ra được nhiều điều.

Sau khi được các thày Concogia, Ptm0412 chỉ bảo em đã vận dụng khá thuần thục chức năng F8, thế còn cách sử dụng chức năngMsgbox để kiểm tra thế nào ah?
 
Upvote 0
Sau khi được các thày Concogia, Ptm0412 chỉ bảo em đã vận dụng khá thuần thục chức năng F8, thế còn cách sử dụng chức năngMsgbox để kiểm tra thế nào ah?
Sử dụng Msgbox để hiện kết quả ra màn hình, kiểm tra các bước của thuật toán rất hay, Bạn tham khảo cách sử dụng của Msgbox theo link này nhé, bài #20!
Sử dụng MSGBOX
Với bài này, ta đã xác định ở cột A, khi gặp cell có dữ liệu thì chèn 2 dòng & gán giá trị, nếu Bé Còi chơi kiểu "nhảy cà tưng" từ dưới lên (sử dụng Do....Loop While & End(XlUp)) thì vòng lặp chỉ nhảy 3 bước là xong, nếu dùng For ...Next phải chạy đủ số dòng. Mình chỉ cảm giác như thế thôi chứ mình hổng biết làm, nếu Còi không làm được thì nhờ Lão Chết Tiệt làm giúp nhé. Hihi
Híc
Chính xác là như vậy, bé CÒI cũng có gợi ý sử dụng vòng lặp không xác định kết hợp với thuộc tính END() ở bài trên nhưng thấy bạn Dauthivan viết như thế này :
Nguyên văn bởi Dauthivan :"Em chỉ cần những bài này đầu tiên làm kiểu gì miễn ra kết quả là mừng lắm rồi, sau này khi đã hiểu tương đối lúc đó mình sẽ có cái nhìn đầy đủ hơn, sau đó mới có thể đặt ra vấn đề tối ưu là làm cách nào nhanh, gọn nhất."
nên làm nhiều cách để bạn ấy biết rút gọn CODE như thế nào sau đó mới tối ưu thuật toán. bé CÒI cũng đang học bằng phương pháp đó!
Vậy chi bằng hãy để bạn ấy luyện công rồi làm thử bài này bằng cách ấy xem thế nào? Chứ bé CÒI hay sư phụ ptm0412 đá típ nữa thì bạn ấy hết cửa suy nghĩ ạ, he he!
Dauthivan cố lên !!!Thanks!
 
Lần chỉnh sửa cuối:
Upvote 0
Sử dụng Msgbox để hiện kết quả ra màn hình, kiểm tra các bước của thuật toán rất hay, Bạn tham khảo cách sử dụng của Msgbox theo link này nhé, bài #20!
Sử dụng MSGBOX

Chính xác là như vậy, bé CÒI cũng có gợi ý sử dụng vòng lặp không xác định kết hợp với thuộc tính END() ở bài trên nhưng thấy bạn Dauthivan viết như thế này :
Nguyên văn bởi Dauthivan :"Em chỉ cần những bài này đầu tiên làm kiểu gì miễn ra kết quả là mừng lắm rồi, sau này khi đã hiểu tương đối lúc đó mình sẽ có cái nhìn đầy đủ hơn, sau đó mới có thể đặt ra vấn đề tối ưu là làm cách nào nhanh, gọn nhất."
nên làm nhiều cách để bạn ấy biết rút gọn CODE như thế nào sau đó mới tối ưu thuật toán. bé CÒI cũng đang học bằng phương pháp đó!
Vậy chi bằng hãy để bạn ấy luyện công rồi làm thử bài này bằng cách ấy xem thế nào? Chứ bé CÒI hay sư phụ ptm0412 đá típ nữa thì bạn ấy hết cửa suy nghĩ ạ, he he!
Dauthivan cố lên !!!Thanks!

Vậy, bác khoan hãy đưa lời giải lên nhé, cho em thời gian suy nghĩ một chút xem em có giải quyết được không, nếu có vướng mắc gì em lại xin phép được hỏi sau ah.
 
Upvote 0
Vậy, bác khoan hãy đưa lời giải lên nhé, cho em thời gian suy nghĩ một chút xem em có giải quyết được không, nếu có vướng mắc gì em lại xin phép được hỏi sau ah.
Ngày hôm nay chưa nghĩ ra thì ngày mai nghĩ tiếp, hôm nay buồn chưa nghĩ ra, mai vui nghĩ tiếp...---> Chả nhẽ mãi mãi không ra??? Không thế nào , đúng không?
Dauthivan cố lên nhé, mình tin bạn có thể làm được vì bài này rất cơ bản mà, cứ lần theo những gợi ý ở trên là là được thôi!
Thanks!
 
Upvote 0
Sau khi được các thày Concogia, Ptm0412 chỉ bảo em đã vận dụng khá thuần thục chức năng F8, thế còn cách sử dụng chức năngMsgbox để kiểm tra thế nào ah?

Kiểm tra thế nào à?
Muốn biết trạng thái, giá trị của cái gì, vào lúc nào thì dùng Msgbox cho hiện ra cái đó.

Thí dụ muốn biết sau khi chạy câu lệnh nào đó, biến abc có giá trị bao nhiêu, hoặc giá trị Arr(s, 3) là bao nhiêu, chỉ việc thêm câu lệnh:
Msgbox abc & chr(10) & Arr(s, 3)

Tuy vậy tôi ít dùng cách này. Có nhiều cách khác hay hơn vì 1 là không phải nhấn nút OK đóng Msgbox, 2 là xem giá trị của biến tại bất kỳ thời điểm nào mình muốn.

1. Dùng F8 như các bài trước đây Cò già nói, nhưng không cần mở cửa sổ Locals Windows. Khi 1 dòng code bị tô vàng, nghĩa là code đang bị pause ngay trước khi thực thi dòng lệnh đó. Thử rà chuột vào các biến xem, rà tới biến nào, nó hiện giá trị biến đó.

2. Dùng F8 bị bắt buộc 1 chuyện là mỗi dòng code đều bị ngưng lại. Nếu chỉ muốn xem giá trị biến nào đó trước và sau khi thực thi dòng lệnh thứ 10, bỏ qua các dòng từ 1 đến 9, hãy đánh dấu dòng lệnh 10 và 11 bằng cách click vào lề code, nguyên dòng code sẽ bị tô đỏ sẫm. (Bên topic kia dauthivan đã hòi). Bây giờ chạy code, nó sẽ chạy cái vèo đến dòng 10 và ngưng lại, hãy rà chuột xem giá trị biến lần 1. Nhấn F5, dòng 10 thực thi, code pause tại dòng 11, xem giá trị biến lần 2. Việc này có ích khi ta muốn biết 1 câu lệnh có thực thi đúng ý ta muốn hay không. Dĩ nhiên việc này có thể dùng Msgbox, nhưng mất công nhấn OK.

3. Kết hợp cả cái hay của Msgbox, cả cái hay của đánh dấu tô đỏ code tại dòng mình muốn, (chứ không phải mỗi dòng lệnh mỗi ngưng như F8), mà không cần nhấn OK của MSgbox. Đó là dùng cửa sổ immediate và câu lện Debug.Print
Đặc biệt là khi ta muốn biết giá trị của 3 biến a, b, c trong 1 vòng lặp For, sau mỗi vòng lặp nó thay đổi thế nào. Chả lẽ For i = 1 to 100, nhấn OK 100 lần, hoặc rà chuột 100 x 3 lần?
Dùng câu lệnh sau trong vòng lặp:
Debug.Print i, a, b, c
và cho code chạy thoải mái, không ngừng. Sau đó xem tất cả những gì hiện ra trong cửa sổ immediate!
 
Lần chỉnh sửa cuối:
Upvote 0
Công việc bận quá giờ mới ghé diễn đàn được, hoa còi thử làm theo gợi ý của sư phụ, thanks sư phụ!
PHP:
Sub inSertRow()
Dim fRow, lRow
Dim i As Long
Dim Clls1 As Range
Set Clls1 = Cells(8, 8)

fRow = 4
lRow = Cells(65536, 3).End(xlUp).Row
    
For i = lRow + 1 To fRow + 2 Step -1
With Cells(i, 1)
    If .Value <> "" Or i = lRow + 1 Then
        .Resize(2, 1).EntireRow.Insert
        .Offset(-2, 2).Resize(2).Value = Clls1.Resize(2).Value
        With .Offset(-2, 2).Resize(2)
            .HorizontalAlignment = xlLeft
            .Font.FontStyle = "Bold"
        End With
    End If
    End With
Next
End Sub

Hình như em đang phức tạp hoá vấn đề hoặc do em chưa hiểu đúng bản chất:
Em đang suy nghĩ sau khi i=26, sau thi thực hiện xong lệnh .Resize(2, 1).EntireRow.Insert thì lRow =31? (không phải = 29?) vì bản chất vùng được mở rộng thêm 2 dòng mà.
 
Upvote 0
lrow xác định từ trước bằng câu lệnh
lRow = Cells(65536, 3).End(xlUp).Row

vậy nếu không gán giá trị khác cho biến lRow, thì lRow có thay đổi không?

Vả lại, hãy thử đứng ở dòng 29, tô 2 dòng 29, 30, nhấn nút insert row, rồi xem vị trí đứng (dòng 29) có bị thay đổi không?

 
Upvote 0
Mình thì nghĩ dùng vòng lặp For ... Next quét từ trên xuống:

For i = 5 To [C65536].End(xlUp).Row + 2 * [A65536].End(xlUp).Value
.......

Next

Vì cột số thứ tự đã điền đầy đủ

Mà sao ở đây chưa có chi phí các dòng : Chi phí trực tiếp khác và cộng chi phí trực tiếp nhỉ?
 
Upvote 0
Web KT

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

Back
Top Bottom