VBA copy công thức khi thêm dòng.

Liên hệ QC

Duong gia

Thành viên thường trực
Tham gia
15/1/07
Bài viết
352
Được thích
118
Các Bác ơi giúp với, trong bảng tính Excel khi Insert dòng có cách nào VBA copy công thức từ trên xuống không? Thanks in advance.
 
Lần chỉnh sửa cuối:
Duong gia đã viết:
Các Bác ơi giúp với, trong bảng tính Excel khi Insert dòng có cách nào VBA copy công thức từ trên xuống không? Thanks in advance.
Ví dụ khi bạn chèn ở dòng 4, bạn tham khảo code sau
Mã:
With Rows("4:4").Select
    Selection.Insert Shift:=xlDown
    Selection.FillDown
End With

TDN
 
Tedaynui bạn nói rõ hơn được không, thanks
 
Lần chỉnh sửa cuối:
Nếu chỉ insert 1 dòng ngay ô chọn rồi copy công thức ( và format ) dòng trên đó xuống bạn có thể sử dụng code này xem sao
Mã:
Sub insert_row()
'
' insert_row Macro
' Macro recorded 12-11-2007 by TDE
'
'
Selection.EntireRow.Insert
ActiveCell.Offset(-1, 0).Rows("1:1").EntireRow.Select
Selection.Copy
ActiveCell.Offset(1, 0).Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End Sub
tôi có sử dụng trường hợp này để tự động làm " nở" vùng lưu dư liệu có chứa công thức.
thí dụ : tôi có sheet1 làm form phiếu xuất, sheet2 là lưu dữ liệu phiếu xuất có 1 vùng tên là dulieu_xuat.nếu vùng này lớn thì các link làm máy chậm, nếu vùng này nhỏ thí đến 1 lúc nào đó sẽ đầy.cho nên trước khi cho chạy macro in phiếu xuất nó sẽ kiểm tra nếu vùng dulieu_xuat còn dưới 50 dòng thì nó chèn vô 500 dòng. Sau đó nó tìm đến dòng có chứa công thức ngay trên vùng 500 dòng mới insert copy dòng này vào vùng mới chèn ( trong ví dụ vùng dulieu_xuat là (A:L), "o1_vstt_xuat","bottom_vstt_xuat" là ô đầu tiên và ô cuối cùng của vùng dữ liệu có chứa công thức
Mã:
Sub resize_xuat()
'
' resize_xuat Macro
' Macro recorded 03-11-2007 by TDE
'
    Range("A1").Select
    Application.Goto Reference:="bottom_vstt_xuat"
    ActiveCell.Range("A1:A500").Select
    Selection.EntireRow.Insert
    Application.Goto Reference:="o1_vstt_xuat"
    Selection.End(xlDown).Select
    ActiveCell.Range("A1:l1").Select
    Selection.Copy
    Range(Selection, Selection.End(xlDown)).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Range("A1").Select
End Sub
 
Lần chỉnh sửa cuối:
NHG đã viết:
Tedaynui nói rất đúng trong trường hợp chèn vào dòng thứ 4, nhưng mình muốn hỏi nếu chèn vào một dòng bất kỳ thì nó tự động Fill công thức ở dòng trên xuống thì làm thế nào
Muốn chèn một dòng và fill công thức xuống, thì Excel phải biết hành động chèn dòng, và hành động này chỉ xảy ra trong 1 sheet này. Nhưng làm điều này thì tôi chưa làm được.
Để sheet có thể nhận biết chúng ta muốn chèn dòng, trong InsertRow tôi dùng hành động doubleclick gán cho nó. Khi DoubleClick, Excel sẽ kiểm tra các ô ở dòng trên, nếu ô nào là công thức thì copy xuống.
Mã:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
r = Target.Row   'xác định dòng chèn
If r = 1 Then Exit Sub  'nếu chèn dòng 1 bỏ qua
cc = Target.SpecialCells(xlCellTypeLastCell).Column 'xác định cột dữ liệu cuối cùng
Target.EntireRow.Insert
For c = 1 To cc
  If Cells(r - 1, c).HasFormula = True Then   'kiểm tra ô có công thức
    Cells(r, c).FormulaR1C1 = Cells(r - 1, c).FormulaR1C1
  End If
Next
End Sub
 

File đính kèm

  • InsertRow.zip
    8.4 KB · Đọc: 628
NHG đã viết:
Tedaynui nói rất đúng trong trường hợp chèn vào dòng thứ 4, nhưng mình muốn hỏi nếu chèn vào một dòng bất kỳ thì nó tự động Fill công thức ở dòng trên xuống thì làm thế nào
Nếu chèn dòng bất kỳ và chỉ chép ô công thức thì bạn làm theo cách của thầy Long (Kiểm tra ô nào là công thức mới copy)

Nếu chèn dòng bất kỳ tại ô hiện hành và Fill cả dòng xuống thì bạn làm như sau
Mã:
With ActiveCell.EntireRow.Select
    Selection.Insert Shift:=xlDown
    Selection.FillDown
End With

TDN
 
Muốn chèn một dòng và fill công thức xuống, thì Excel phải biết hành động chèn dòng, và hành động này chỉ xảy ra trong 1 sheet này. Nhưng làm điều này thì tôi chưa làm được.
Để sheet có thể nhận biết chúng ta muốn chèn dòng, trong InsertRow tôi dùng hành động doubleclick gán cho nó. Khi DoubleClick, Excel sẽ kiểm tra các ô ở dòng trên, nếu ô nào là công thức thì copy xuống.
Mã:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
r = Target.Row   'xác định dòng chèn
If r = 1 Then Exit Sub  'nếu chèn dòng 1 bỏ qua
cc = Target.SpecialCells(xlCellTypeLastCell).Column 'xác định cột dữ liệu cuối cùng
Target.EntireRow.Insert
For c = 1 To cc
  If Cells(r - 1, c).HasFormula = True Then   'kiểm tra ô có công thức
    Cells(r, c).FormulaR1C1 = Cells(r - 1, c).FormulaR1C1
  End If
Next
End Sub
Cho hỏi nếu muốn dùng cách này mà khi click đúp chuột thì nó chèn bên dưới chứ không phải bên trên dòng hiện thời thì làm thế nào bác ơi?
 
Muốn chèn một dòng và fill công thức xuống, thì Excel phải biết hành động chèn dòng, và hành động này chỉ xảy ra trong 1 sheet này. Nhưng làm điều này thì tôi chưa làm được.
Để sheet có thể nhận biết chúng ta muốn chèn dòng, trong InsertRow tôi dùng hành động doubleclick gán cho nó. Khi DoubleClick, Excel sẽ kiểm tra các ô ở dòng trên, nếu ô nào là công thức thì copy xuống.
Mã:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
r = Target.Row   'xác định dòng chèn
If r = 1 Then Exit Sub  'nếu chèn dòng 1 bỏ qua
cc = Target.SpecialCells(xlCellTypeLastCell).Column 'xác định cột dữ liệu cuối cùng
Target.EntireRow.Insert
For c = 1 To cc
  If Cells(r - 1, c).HasFormula = True Then   'kiểm tra ô có công thức
    Cells(r, c).FormulaR1C1 = Cells(r - 1, c).FormulaR1C1
  End If
Next
End Sub
Cái này có thể thay thế DoubleClick chuột trái bằng CommandButton được không ạ. DoubleClick chuột trái thấy bất tiện quá :=\+:=\+:=\+
 
Nếu chỉ insert 1 dòng ngay ô chọn rồi copy công thức ( và format ) dòng trên đó xuống bạn có thể sử dụng code này xem sao
Mã:
Sub insert_row()
'
' insert_row Macro
' Macro recorded 12-11-2007 by TDE
'
'
Selection.EntireRow.Insert
ActiveCell.Offset(-1, 0).Rows("1:1").EntireRow.Select
Selection.Copy
ActiveCell.Offset(1, 0).Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End Sub
tôi có sử dụng trường hợp này để tự động làm " nở" vùng lưu dư liệu có chứa công thức.
thí dụ : tôi có sheet1 làm form phiếu xuất, sheet2 là lưu dữ liệu phiếu xuất có 1 vùng tên là dulieu_xuat.nếu vùng này lớn thì các link làm máy chậm, nếu vùng này nhỏ thí đến 1 lúc nào đó sẽ đầy.cho nên trước khi cho chạy macro in phiếu xuất nó sẽ kiểm tra nếu vùng dulieu_xuat còn dưới 50 dòng thì nó chèn vô 500 dòng. Sau đó nó tìm đến dòng có chứa công thức ngay trên vùng 500 dòng mới insert copy dòng này vào vùng mới chèn ( trong ví dụ vùng dulieu_xuat là (A:L), "o1_vstt_xuat","bottom_vstt_xuat" là ô đầu tiên và ô cuối cùng của vùng dữ liệu có chứa công thức
Mã:
Sub resize_xuat()
'
' resize_xuat Macro
' Macro recorded 03-11-2007 by TDE
'
    Range("A1").Select
    Application.Goto Reference:="bottom_vstt_xuat"
    ActiveCell.Range("A1:A500").Select
    Selection.EntireRow.Insert
    Application.Goto Reference:="o1_vstt_xuat"
    Selection.End(xlDown).Select
    ActiveCell.Range("A1:l1").Select
    Selection.Copy
    Range(Selection, Selection.End(xlDown)).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Range("A1").Select
End Sub


Anh làm ơn cho em hỏi chút ạ. Làm sao để khai báo cho excel hiểu bottom_vstt_xuat và o1_vstt_xuat vậy ạ. Em chưa hiểu rõ về VBA mong anh chỉ giúp ạ
Bài đã được tự động gộp:

Nếu chỉ insert 1 dòng ngay ô chọn rồi copy công thức ( và format ) dòng trên đó xuống bạn có thể sử dụng code này xem sao
Mã:
Sub insert_row()
'
' insert_row Macro
' Macro recorded 12-11-2007 by TDE
'
'
Selection.EntireRow.Insert
ActiveCell.Offset(-1, 0).Rows("1:1").EntireRow.Select
Selection.Copy
ActiveCell.Offset(1, 0).Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End Sub
tôi có sử dụng trường hợp này để tự động làm " nở" vùng lưu dư liệu có chứa công thức.
thí dụ : tôi có sheet1 làm form phiếu xuất, sheet2 là lưu dữ liệu phiếu xuất có 1 vùng tên là dulieu_xuat.nếu vùng này lớn thì các link làm máy chậm, nếu vùng này nhỏ thí đến 1 lúc nào đó sẽ đầy.cho nên trước khi cho chạy macro in phiếu xuất nó sẽ kiểm tra nếu vùng dulieu_xuat còn dưới 50 dòng thì nó chèn vô 500 dòng. Sau đó nó tìm đến dòng có chứa công thức ngay trên vùng 500 dòng mới insert copy dòng này vào vùng mới chèn ( trong ví dụ vùng dulieu_xuat là (A:L), "o1_vstt_xuat","bottom_vstt_xuat" là ô đầu tiên và ô cuối cùng của vùng dữ liệu có chứa công thức
Mã:
Sub resize_xuat()
'
' resize_xuat Macro
' Macro recorded 03-11-2007 by TDE
'
    Range("A1").Select
    Application.Goto Reference:="bottom_vstt_xuat"
    ActiveCell.Range("A1:A500").Select
    Selection.EntireRow.Insert
    Application.Goto Reference:="o1_vstt_xuat"
    Selection.End(xlDown).Select
    ActiveCell.Range("A1:l1").Select
    Selection.Copy
    Range(Selection, Selection.End(xlDown)).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Range("A1").Select
End Sub


Anh cho em hỏi. Trường hợp ở code Insert row, em muốn thêm một số dòng cụ thể và vẫn copy dữ liệu và công thức như ở dòng đó thì viết code như nào vậy ạ? Em cảm ơn!
 
Cái này có thể thay thế DoubleClick chuột trái bằng CommandButton được không ạ. DoubleClick chuột trái thấy bất tiện quá :=\+:=\+:=\+
Cho e hỏi chút.
Nếu data được INPUT từ form nhập của VBA thì code sẽ như nào vậy.
E nhập tay thì dc. Nhưng nếu dùng form input data vào ô thì ko copy dc công thức
 
Nếu chèn dòng bất kỳ và chỉ chép ô công thức thì bạn làm theo cách của thầy Long (Kiểm tra ô nào là công thức mới copy)

Nếu chèn dòng bất kỳ tại ô hiện hành và Fill cả dòng xuống thì bạn làm như sau
Mã:
With ActiveCell.EntireRow.Select
    Selection.Insert Shift:=xlDown
    Selection.FillDown
End With

TDN
Chào bạn cho mình hỏi, mình muốn chọn dòng tuỳ ý, thì phải như thế nào
 
Mọi người cho em hỏi là tại sao dòng code của thầy Long lại chỉ đúng từ dòng thứ 6 trở đi với ạ?
 

File đính kèm

  • InsertRow.xls
    41 KB · Đọc: 14
Web KT
Back
Top Bottom