Xin mã VBA tự động thêm dòng phía dưới

Liên hệ QC

datinmeco

Thành viên mới
Tham gia
12/5/21
Bài viết
6
Được thích
0
Mình có 1 file excel như đính kèm.
Mình muốn xin 1 mã VBA, ví dụ khi mình nhập giá trị là 3 (trong cột I11) thì excel tự động insert thêm 3 vòng vào phía dưới dòng 11.
Mình có tìm hiểu trên mạng marco Insert row nhưng chỉ có thể chèn thêm dòng phía bên trên cột I11, không tiện với ý đồ của mình.
Hy vọng có cao nhân nào đó chỉ giáo giúp mình.
1661689732460.png
 

File đính kèm

  • Vent_Material take off.xlsm
    289.4 KB · Đọc: 13
Gõ 3 thêm 3 thì dễ rồi. Nhưng nếu đang 3 đổi thành 2 thì:
1. Thêm 2 thành 5? Hay
2. Bớt 1 còn 2?

Khi nói chuyện code tự động thì phải nghĩ: "xử lý thế nào khi hiệu ứng xảy ra lần thứ 2? Những lần kế tiếp?"
 
Upvote 0
Gõ 3 thêm 3 thì dễ rồi. Nhưng nếu đang 3 đổi thành 2 thì:
1. Thêm 2 thành 5? Hay
2. Bớt 1 còn 2?

Khi nói chuyện code tự động thì phải nghĩ: "xử lý thế nào khi hiệu ứng xảy ra lần thứ 2? Những lần kế tiếp?"
Bác có cách nào giải quyết vấn đề này ko thế :D
Bài đã được tự động gộp:

cảm ơn bác nhé.. để mình nghiên cứu xem
 
Upvote 0
Bác có cách nào giải quyết vấn đề này ko thế :D
...
Tôi hỏi về điều kiện của vấn đề. Thêm hay bớt là QUYẾT ĐỊNH của bạn. Sao lại hỏi tôi?

Chú thích: ko cái mốc xì. Người ta bỏ công giúp bạn mà bên bạn thì không thể lịch sư viết từ ngữ cho rõ ràng sao?
 
Upvote 0
Tôi hỏi về điều kiện của vấn đề. Thêm hay bớt là QUYẾT ĐỊNH của bạn. Sao lại hỏi tôi?

Chú thích: ko cái mốc xì. Người ta bỏ công giúp bạn mà bên bạn thì không thể lịch sư viết từ ngữ cho rõ ràng sao?
Hi xin lỗi bác, hôm qua mình gõ vội quá.
Nếu có thể thì bác viết giúp mình theo yêu cầu đề bài như sau :
Gõ 3 thêm 3 thì dễ rồi. Nhưng nếu đang 3 đổi thành 2 thì:
2. Bớt 1 còn 2?
Còn nếu xóa số 3 (tức là ô ở hàng J để trống) thì sẽ xóa dòng ấy luôn.

Nếu có thể khi thêm hàng, copy nguyên công thức ở hàng bên trên thì càng tốt.
Cảm ơn bác nhiều nhiều nhé.
 
Upvote 0
Mình có 1 file excel như đính kèm.
Mình muốn xin 1 mã VBA, ví dụ khi mình nhập giá trị là 3 (trong cột I11) thì excel tự động insert thêm 3 vòng vào phía dưới dòng 11.
Mình có tìm hiểu trên mạng marco Insert row nhưng chỉ có thể chèn thêm dòng phía bên trên cột I11, không tiện với ý đồ của mình.
Hy vọng có cao nhân nào đó chỉ giáo giúp mình.
View attachment 280420
Cái này sử dụng chức năng Insert cell down, chạy với điều kiện dòng đang gõ ở cuối cùng, bác thêm điều kiện tìm Lrow tại các vị trí khác nhau thử xem
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Not Intersect(Target, Range("I11:E9999")) Is Nothing Then
        lrow = Range("B99999").End(xlUp).Row
        Sheet1.Range("B" & lrow + 1 & ":M" & lrow + 1).Resize(Target.Value).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    End If
End Sub
 
Upvote 0
Hi xin lỗi bác, hôm qua mình gõ vội quá.
Nếu có thể thì bác viết giúp mình theo yêu cầu đề bài như sau :
Gõ 3 thêm 3 thì dễ rồi. Nhưng nếu đang 3 đổi thành 2 thì:
2. Bớt 1 còn 2?
Còn nếu xóa số 3 (tức là ô ở hàng J để trống) thì sẽ xóa dòng ấy luôn.

Nếu có thể khi thêm hàng, copy nguyên công thức ở hàng bên trên thì càng tốt.
Cảm ơn bác nhiều nhiều nhé.
Bạn xem thử code, mà xóa hàng tự động này tốt nhất là nên xóa tay chứ đừng lệ thuộc vào auto đôi khi không chính xác hoặc xóa nhầm hàng dữ liệu.
Mã:
Private tVitri

'Su kien ghi nhan gia tri truoc khi thay doi cua cot J - No of branch
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    With ActiveSheet
        'kiem tra gia tri tai cot J nhap vao phai la <Kieu So>
        If IsNumeric(.Cells(Target.Row, 9).Value) = False Then
            MsgBox "Du lieu nhap vao cot I phai la <Kieu So>", vbInformation, "Thong Bao"
            Exit Sub
        End If
        'xac dinh gia tri tai cot J truoc khi thay doi
        If Target.Count = 1 And Target.Column = 9 And Target.Row > 10 Then
            tVitri = Round(.Cells(Target.Row, 9).Value, 0)
        End If
    End With
End Sub

'Su kien ghi nhan gia tri sau khi thay doi cua cot J - No of branch
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Long
    Dim tNum As Integer, tRange As Long
    With ActiveSheet
        Application.ScreenUpdating = False
        If Target.Count = 1 And Target.Column = 9 And Target.Row > 10 Then
            'kiem tra gia tri tai cot J nhap vao phai la <Kieu So>
            If IsNumeric(.Cells(Target.Row, 9).Value) = False Then
                MsgBox "Du lieu nhap vao cot I phai la <Kieu So>", vbInformation, "Thong Bao"
                Exit Sub
            End If
            tNum = Round(.Cells(Target.Row, 9).Value, 0)
            'kiem tra xoa dong trong ben duoi neu vung ben duoi khong co du lieu
            If tNum = 0 Then
                .Range("A" & Target.Row, "N" & Target.Row).EntireRow.Delete
            ElseIf tNum > 0 Then
                tRange = Application.CountA(.Range("A" & Target.Row + 1, "N" & Target.Row + tVitri))
                If tRange = 0 Then
                    .Range("A" & Target.Row + 1, "N" & Target.Row + tVitri).EntireRow.Delete
                End If
            End If
            'Them so dong theo gia tri nhap vao tai cot J
            For i = 1 To tNum
                .Cells(Target.Row + 1, Target.Column).EntireRow.Insert
            Next
        End If
        Application.ScreenUpdating = True
    End With
End Sub
 

File đính kèm

  • Test_Vent_Material take off.xlsm
    293.1 KB · Đọc: 15
Upvote 0
Gõ 3 thêm 3 thì dễ rồi. Nhưng nếu đang 3 đổi thành 2 thì:
1. Thêm 2 thành 5? Hay
2. Bớt 1 còn 2?

Khi nói chuyện code tự động thì phải nghĩ: "xử lý thế nào khi hiệu ứng xảy ra lần thứ 2? Những lần kế tiếp?"
Mọi người ơi, có ai giúp em file này với ạ. TT
Bài đã được tự động gộp:

..................................
 
Lần chỉnh sửa cuối:
Upvote 0
Cái này sử dụng chức năng Insert cell down, chạy với điều kiện dòng đang gõ ở cuối cùng, bác thêm điều kiện tìm Lrow tại các vị trí khác nhau thử xem
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Not Intersect(Target, Range("I11:E9999")) Is Nothing Then
        lrow = Range("B99999").End(xlUp).Row
        Sheet1.Range("B" & lrow + 1 & ":M" & lrow + 1).Resize(Target.Value).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    End If
End Sub
Cảm ơn bác, nhưng cái mình muốn thêm dòng đang không ở dòng cuối cùng mới đau :(
Bài đã được tự động gộp:

Bạn xem thử code, mà xóa hàng tự động này tốt nhất là nên xóa tay chứ đừng lệ thuộc vào auto đôi khi không chính xác hoặc xóa nhầm hàng dữ liệu.
Mã:
Private tVitri

'Su kien ghi nhan gia tri truoc khi thay doi cua cot J - No of branch
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    With ActiveSheet
        'kiem tra gia tri tai cot J nhap vao phai la <Kieu So>
        If IsNumeric(.Cells(Target.Row, 9).Value) = False Then
            MsgBox "Du lieu nhap vao cot I phai la <Kieu So>", vbInformation, "Thong Bao"
            Exit Sub
        End If
        'xac dinh gia tri tai cot J truoc khi thay doi
        If Target.Count = 1 And Target.Column = 9 And Target.Row > 10 Then
            tVitri = Round(.Cells(Target.Row, 9).Value, 0)
        End If
    End With
End Sub

'Su kien ghi nhan gia tri sau khi thay doi cua cot J - No of branch
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Long
    Dim tNum As Integer, tRange As Long
    With ActiveSheet
        Application.ScreenUpdating = False
        If Target.Count = 1 And Target.Column = 9 And Target.Row > 10 Then
            'kiem tra gia tri tai cot J nhap vao phai la <Kieu So>
            If IsNumeric(.Cells(Target.Row, 9).Value) = False Then
                MsgBox "Du lieu nhap vao cot I phai la <Kieu So>", vbInformation, "Thong Bao"
                Exit Sub
            End If
            tNum = Round(.Cells(Target.Row, 9).Value, 0)
            'kiem tra xoa dong trong ben duoi neu vung ben duoi khong co du lieu
            If tNum = 0 Then
                .Range("A" & Target.Row, "N" & Target.Row).EntireRow.Delete
            ElseIf tNum > 0 Then
                tRange = Application.CountA(.Range("A" & Target.Row + 1, "N" & Target.Row + tVitri))
                If tRange = 0 Then
                    .Range("A" & Target.Row + 1, "N" & Target.Row + tVitri).EntireRow.Delete
                End If
            End If
            'Them so dong theo gia tri nhap vao tai cot J
            For i = 1 To tNum
                .Cells(Target.Row + 1, Target.Column).EntireRow.Insert
            Next
        End If
        Application.ScreenUpdating = True
    End With
End Sub
Code của bác tuyệt quá, mỗi tội khi nhập giá trị = 0 thì nó xóa luôn cả dòng hiện tại.
Cám ơn bác nhiều nhiều
 
Upvote 0
Bạn xem thử code, mà xóa hàng tự động này tốt nhất là nên xóa tay chứ đừng lệ thuộc vào auto đôi khi không chính xác hoặc xóa nhầm hàng dữ liệu.
Mã:
Private tVitri

'Su kien ghi nhan gia tri truoc khi thay doi cua cot J - No of branch
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    With ActiveSheet
        'kiem tra gia tri tai cot J nhap vao phai la <Kieu So>
        If IsNumeric(.Cells(Target.Row, 9).Value) = False Then
            MsgBox "Du lieu nhap vao cot I phai la <Kieu So>", vbInformation, "Thong Bao"
            Exit Sub
        End If
        'xac dinh gia tri tai cot J truoc khi thay doi
        If Target.Count = 1 And Target.Column = 9 And Target.Row > 10 Then
            tVitri = Round(.Cells(Target.Row, 9).Value, 0)
        End If
    End With
End Sub

'Su kien ghi nhan gia tri sau khi thay doi cua cot J - No of branch
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Long
    Dim tNum As Integer, tRange As Long
    With ActiveSheet
        Application.ScreenUpdating = False
        If Target.Count = 1 And Target.Column = 9 And Target.Row > 10 Then
            'kiem tra gia tri tai cot J nhap vao phai la <Kieu So>
            If IsNumeric(.Cells(Target.Row, 9).Value) = False Then
                MsgBox "Du lieu nhap vao cot I phai la <Kieu So>", vbInformation, "Thong Bao"
                Exit Sub
            End If
            tNum = Round(.Cells(Target.Row, 9).Value, 0)
            'kiem tra xoa dong trong ben duoi neu vung ben duoi khong co du lieu
            If tNum = 0 Then
                .Range("A" & Target.Row, "N" & Target.Row).EntireRow.Delete
            ElseIf tNum > 0 Then
                tRange = Application.CountA(.Range("A" & Target.Row + 1, "N" & Target.Row + tVitri))
                If tRange = 0 Then
                    .Range("A" & Target.Row + 1, "N" & Target.Row + tVitri).EntireRow.Delete
                End If
            End If
            'Them so dong theo gia tri nhap vao tai cot J
            For i = 1 To tNum
                .Cells(Target.Row + 1, Target.Column).EntireRow.Insert
            Next
        End If
        Application.ScreenUpdating = True
    End With
End Sub
Bác có thể thêm code, khi thêm dòng, nó tự động copy các ô có công thức của hàng trên xuống dưới giúp mình được không? Mình mới học VBA mà kém quá
 
Upvote 0
Code của bác tuyệt quá, mỗi tội khi nhập giá trị = 0 thì nó xóa luôn cả dòng hiện tại.
Cám ơn bác nhiều nhiều
Mình làm theo đúng yêu cầu của bạn còn gì: "...Còn nếu xóa số 3 (tức là ô ở hàng J để trống) thì sẽ xóa dòng ấy luôn...."
Hi xin lỗi bác, hôm qua mình gõ vội quá.
Nếu có thể thì bác viết giúp mình theo yêu cầu đề bài như sau :
Gõ 3 thêm 3 thì dễ rồi. Nhưng nếu đang 3 đổi thành 2 thì:
2. Bớt 1 còn 2?
Còn nếu xóa số 3 (tức là ô ở hàng J để trống) thì sẽ xóa dòng ấy luôn.

Nếu có thể khi thêm hàng, copy nguyên công thức ở hàng bên trên thì càng tốt.
Cảm ơn bác nhiều nhiều nhé.
Công thức thì chỉ thấy phát sinh ở cột A và cột F mà cột F công thức đâu phải bằng hàng trên mà là chia cho giá trị tại cột I mà.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn xem thử code, mà xóa hàng tự động này tốt nhất là nên xóa tay chứ đừng lệ thuộc vào auto đôi khi không chính xác hoặc xóa nhầm hàng dữ liệu.
...
Loại công việc này, trước khi làm việc code sẽ copy một bản sao của sheet (nếu dữ liệu dựa vào nhiều sheets thì phải copy luôn - đẻ tránh các sheets ấy thay đổi, dữ liệu không kiểm toán được) và đặt vào chỗ hidden.
Sau đó mới bắt đầu làm việc chính.
 
Upvote 0
Loại công việc này, trước khi làm việc code sẽ copy một bản sao của sheet (nếu dữ liệu dựa vào nhiều sheets thì phải copy luôn - đẻ tránh các sheets ấy thay đổi, dữ liệu không kiểm toán được) và đặt vào chỗ hidden.
Sau đó mới bắt đầu làm việc chính.
Cám ơn anh đã tư vấn thêm, nhờ những bình luận của anh mà em học được thêm rất nhiều kiến thức.
Bác có thể thêm code, khi thêm dòng, nó tự động copy các ô có công thức của hàng trên xuống dưới giúp mình được không? Mình mới học VBA mà kém quá
Khuyên bạn thớt nên xây dựng lại công thức trong file cho hoàn chỉnh đã rồi tính chuyện code Copy công thức sau. Ban đầu mình tính thêm hộp thoại cảnh báo xóa/thêm dòng để kiểm tra chắc chắn trước khi thực hiện:
Mã:
Msg=Msgbox ("Ban co muon them/xoa dong tai vung .... khong",vbyesno,"Thong Bao")
if vbYes then .Range("A" & Target.Row, "N" & Target.Row).EntireRow.Delete
if vbNo then exit sub
nhưng vậy thì thà thêm/xóa bằng tay nhanh hơn dùng code.
 
Upvote 0
Cám ơn anh đã tư vấn thêm, nhờ những bình luận của anh mà em học được thêm rất nhiều kiến thức.

Khuyên bạn thớt nên xây dựng lại công thức trong file cho hoàn chỉnh đã rồi tính chuyện code Copy công thức sau. Ban đầu mình tính thêm hộp thoại cảnh báo xóa/thêm dòng để kiểm tra chắc chắn trước khi thực hiện:
Mã:
Msg=Msgbox ("Ban co muon them/xoa dong tai vung .... khong",vbyesno,"Thong Bao")
if vbYes then .Range("A" & Target.Row, "N" & Target.Row).EntireRow.Delete
if vbNo then exit sub
nhưng vậy thì thà thêm/xóa bằng tay nhanh hơn dùng code.
Cảm ơn 2 bác nhiều nhé. Tại file của mình cần có password, lock 1 số cell trong hàng nên không xóa bằng tay được. Để mình nghiên cứu tiếp xem thế nào.
Diễn đàn GPE toàn cao thủ excel
 
Upvote 0
Web KT

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

Back
Top Bottom