Mình Muốn Ins va Del hàng trong 1 bảng tính nhưng VBA Run không tốt???

  • Thread starter Thread starter pmhoang
  • Ngày gửi Ngày gửi
Liên hệ QC

pmhoang

Thành viên thường trực
Tham gia
4/7/08
Bài viết
269
Được thích
83
Mình thường làm việc Ins va Del các hàng, trong rất nhiều bảng tính trên 1 file. Mình muốn viêt 1 VB để làm chuyện đó. Mình vừa học Sach VBA cua Thầy Hướng, nên cũng viết được tạm dùng, nhưng khi cho người khác dùng, họ thấy lỗi quá trời. mình cố gắng sửa mà đành bó tay.
Mình up len GPE đẻ anh em tham khảo đoạn code của mình và sửa giứp nhưng yêu cầu có ghi trong file
VD như: Insert kết hợp Autofill mà không làm sai lệch hàm sum và Vlookup?
Delete thông minh hơn, không del hết bảng tính mà để lại 2 hay 3 dòng công thức mẫu đầu tiên?
File đính kèm ở dưới hoặc theo link nay:
http://www.megaupload.com/?d=W9QZ61ZR

PHP:
'Delete hang tu vi tri ActiveCell tro xuong, vai luon giu lai 3 hang tren cung???'
'Luon giu lai 2 hoac 3 hang tren cung, khong biet lam???
'
Sub Del() 'Cai nay rat hay lay nhung khong ho tro ham vlookup, sum'
Dim Sel, BangTinh As Range
Dim Val As Single
  On Error Resume Next
  Set Sel = Selection 'Dat Sel la o ActiveCell'
  BeDel = ActiveCell.Row  'BeginDel o bat dau del cho den duoi cung (hang bat dau)'
  Set BangTinh = ActiveCell.CurrentRegion 'Chon vung BangTinh'
  j = i + UBound(BangTinh.Value, 2) - 1
    If j <= 2 Then  'Dieu kien nay minh phong doan, ko chinh xac, GPE giup minh lam chinh xac voi???'
    MsgBox "Ban hay chon vao ban tinh can Insert"
    Exit Sub
  End If
  BangTinh.Select 'Chon vung bang tinh'
  FiDel = BangTinh.Row + UBound(BangTinh.Value, 1) - 1  'Hang Finsh Del (hang cuoi cung)'
  Range(Cells(BeDel, 1), Cells(FiDel, 1)).Select  'Chon vung can Delete Row'
  Selection.EntireRow.Delete  'Delete'
  Sel.Select
End Sub
'Tu dong nhan dang Bang Tinh va Insert them hang, va AutoFill cong thuc'
Sub Ins()
  Dim n, RowIns As Integer
  Dim BangTinh As Range
  On Error Resume Next  'Gap loi thi bo qua '
  Set BangTinh = ActiveCell.CurrentRegion  'Chon toan bo bang tinh'
  i = BangTinh.Column   'So cot cua ban tinh'
  j = i + UBound(BangTinh.Value, 2) - 1   'So cot cua o cuoi cung cua bang tinh, Cai nay ko hay lam, GPE co cau lenh nao khac ko??? '
  If j <= 2 Then  'Dieu kien nay minh phong doan, ko chinh xac, GPE giup minh lam chinh xac voi??? '
    MsgBox "Ban hay chon vao ban tinh can Insert"
    Exit Sub
  End If
  RowIns = InputBox("Nhap so hang Insert:")
  If RowIns <= 0 Then Exit Sub  'Dieu kien loai tru loi nhap so lieu'
  n = BangTinh.Row + UBound(BangTinh.Value, 1) - 1  'Hang cuoi cung cua Bang tinh'
  Range(Cells(n + 1, i), Cells(n + RowIns, i)).Select
  Selection.EntireRow.Insert  'Insert'
  Range(Cells(n, i), Cells(n, j + 50)).AutoFill Destination:=Range(Cells(n, i), Cells(n + RowIns, j + 50)) 'AutoFill'
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Ngoài chuyện xóa & thêm dòng, ta còn có thể:

Cách 1: Ẩn & hiện các dòng cần thiết;
Cách 2: Format các hàng màu Font=> trắng, một khi chúng chưa cần trong lúc này hay lúc kia thì Format Font màu đen/Auto.

Chuyện khác;
Lệnh sau để tìm ra số dòng kể từ dòng đang được chọn cho đến dòng cuối cùng trước ô có ô trống:

SoDong = Range(Selection,Selection.End(xlDown)).Rows.Count
Ví dụ: Bạn đang có dữ liệu trong cột 'A' như sau:
Từ "A3:A18" & từ "A21:A33"
Bạn chọn "A5" & cho chạy dòng lệnh sẽ biết trị trong biến SoDong
bằng dòng lệnh
MsgBox SoDong
 
Upvote 0
Trong file này tôi dùng Code có ý nghĩa tương đồng nhau. Nhưng tại sao Code Ins1 lại thực thiện được tốt, còn Code Ins2 lại bị Debug
Rất mong GPE chỉ ra chổ sai và giúp tôi với (vi tối muốn làm tổng quát với Ins n hàng)
PHP:
Sub Ins1()
  ActiveCell.Rows("1:2").EntireRow.Select
  Selection.Insert
  ActiveCell.Offset(-1, 0).Rows("1:1").EntireRow.Select
  Selection.AutoFill Destination:=ActiveCell.Rows("1:3").EntireRow
End Sub
PHP:
Sub Ins2()
  Dim n As Integer
  n = InputBox("Nhap so hang Insert")
  ActiveCell.Rows("1:n").EntireRow.Select
  Selection.Insert
  ActiveCell.Offset(-1, 0).Rows("1:1").EntireRow.Select
  Selection.AutoFill Destination:=ActiveCell.Rows("1:n+1").EntireRow
End Sub
File VD cụ thể download theo link ở đây hoặc ở dưới.
http://www.megaupload.com/?d=BWFRP1BK
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Sửa lại thành:
Mã:
Sub Ins2()   Dim n As Long   n = InputBox("Nhap so hang Insert")     ActiveCell.Rows[COLOR=red]("1:" & n).[/COLOR]EntireRow.Select   Selection.Insert   ActiveCell.Offset(-1, 0).Rows("1:1").EntireRow.Select   Selection.AutoFill Destination:=ActiveCell.Rows[COLOR=black][COLOR=red]("1:" & n + 1)[/COLOR].[/COLOR]EntireRow End Sub
Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
ActiveCell.Rows("1:n").EntireRow.Select
sửa thành:
ActiveCell.Rows("1:" & n).EntireRow.Select

Selection.AutoFill Destination:=ActiveCell.Rows("1:n+1").EntireRow

sửa thành
Selection.AutoFill Destination:=ActiveCell.Rows("1:" & n + 1).EntireRow
 
Upvote 0
Ngoài 1,5 lỗi đã được phát hiện, trong đó còn tiềm ẩn 1 lỗi nữa, đó là:

PHP:
Sub Ins2()
Dim n As Integer
n = InputBox("Nhap so hang Insert")
ActiveCell.Rows("1:" & n).EntireRow.Select '<<== 1 lỗi'
Selection.Insert
'==>> Sẽ là 1 Loi nếu không có câu lệnh If như dưới đây:'
If ActiveCell.Row > 1 Then  _
        ActiveCell.Offset(-1, 0).Rows("1:1").EntireRow.Select 
Selection.AutoFill Destination:=ActiveCell.Rows("1:" & n + 1).EntireRow '<<== Nữa lỗi thôi'
End Sub
 
Upvote 0
PHP:
Sub Ins2() Dim n On Error Resume Next n = InputBox("Nhap so hang Insert")   If n = "" Then Exit Sub If n  Bạn xem code vậy được không! Còn [FONT=Courier New][COLOR=#0000bb]ActiveCell[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000bb]Row > 1 [COLOR=black]mình thấy đâu có gì phải lo ngại đâu. Vì nếu vị trí cell đó = 1 thì nó vẫn Ins xuống dưới được mà! Bạn có thể đưa tình huống cụ thể được không?[/COLOR][/COLOR][/FONT] [FONT=Courier New][COLOR=black][COLOR=#0000bb]Thân.[/COLOR][/COLOR][/FONT]
 
Lần chỉnh sửa cuối:
Upvote 0
! Còn ActiveCell.Row > 1 mình thấy đâu có gì phải lo ngại đâu. Vì nếu vị trí cell đó = 1 thì nó vẫn Ins xuống dưới được mà! Bạn có thể đưa tình huống cụ thể được không?
Thân.
Thì bạn thử ngay được trên phần sân của bạn đi mà:
Bạn hãy chọn 1 ô nào đó trên dòng 1 & cho chạy 1 trong 2 macro thì sẽ đi không đến đích đâu!

Thân ái & hữu hão!:=\+)(&&@@
 
Upvote 0
Thì bạn thử ngay được trên phần sân của bạn đi mà: Bạn hãy chọn 1 ô nào đó trên dòng 1 & cho chạy 1 trong 2 macro thì sẽ đi không đến đích đâu! Thân ái & hữu hão!:=\+)(&&@@
Chưa hiểu ý bạn lắm! Nhưng mình thấy code như vầy rất đơn giản và cũng chưa phát hiện có lỗi gì!--=0
PHP:
Sub Ins2() Dim n As Integer On Error Resume Next   n = InputBox("Nhap so hang Insert") If n = "" Then Exit Sub  ActiveCell.Rows("1:" & n).EntireRow.Insert ActiveCell.Offset(-1, 0).Rows("1:1").EntireRow.Select Selection.AutoFill Destination:=ActiveCell.Rows("1:" & n + 1).EntireRow End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cam ơn các anh chị nhiểu, nhờ GPE mà mình hiểu chổ Debug.
Hinh như trong ví dụ này: n không cần quan tâm đến loại Integer hay Long gì cũng được phải ko? có khi không khai báo n cung Run Ok?
trong ví dụ của bạn có sử dụng hàm
IsNumeric(n) Là kiểm tra dử liệu dạng số.
Mình có một vài trường hợp muốn kiểm tra nó là dạng Text thì có Hàm nào ko?
Mình dùng thử IsText() nhưng không có tác dụng?
Cho minh xin cac ham kiem tra
kiểm tra text?
kiểm tra ô trống?
kiểm tra ô có dử liệu là trắng (gồm 1 hoặc nhiều nút dài nhất trên bàn phím)?
Thanks
 
Upvote 0
Chưa hiểu ý bạn lắm!
Nhưng mình thấy code như vầy rất đơn giản và cũng chưa phát hiện có lỗi gì!--=0
Mã:
Sub Ins2()
Dim n As Integer
On Error Resume Next
 
n = InputBox("Nhap so hang Insert")
If n = "" Then Exit Sub
 
ActiveCell.Rows("1:" & n).EntireRow.Insert
[B][SIZE=3]ActiveCell.Offset(-1, 0).Rows("1:1").EntireRow.Select[/SIZE][/B]
Selection.AutoFill Destination:=ActiveCell.Rows("1:" & n + 1).EntireRow
End Sub
Xét tại dòng tô đậm:
Nếu Activecell đang là [G1] thì làm sao bạn có
ActiveCell.Offset(-1, 0).Rows("1:1").EntireRow để mà Select.

Hay bạn cho mình biết địa chỉ ô ActiveCell.Offset(-1, 0) của [K1] là ô nào?
:-=--=0&&&%$R:-=
 
Upvote 0
Xét tại dòng tô đậm:
Nếu Activecell đang là [G1] thì làm sao bạn có
ActiveCell.Offset(-1, 0).Rows("1:1").EntireRow để mà Select.

Hay bạn cho mình biết địa chỉ ô ActiveCell.Offset(-1, 0) của [K1] là ô nào?
:-=--=0&&&%$R:-=

Mình hiểu ý bạn là nếu ở Row 1 thì không thể offset(-1,0) được, cái này là đúng rồi. Nhưng nếu ta đặt nó vào 1 bài toán cụ thể thì . Chúng ta muốn kéo các công thức xuống để tính toán, thì trước hết ít nhất ta cũng phải có 1 hàng cong thức tạo sẵn để Autofill xuống. thi ko co xay ra loi. hihi
Còn cái lỗi Offset(-1,0) đó, có thể dùng if de loai bo no như các bài viec cua cac ban ở dưới. Than chào
 
Upvote 0
Sai câu trả lời rồi bạn ơi!

Offset(-1,0) cua ô K1 = K0, thì chẳng là ô nào cả

Sẽ báo lỗi. Đề phòng này là cần thiết! một khi macro này nhiều người dùng khác xài!
Họ đang đứng đâu đó trên dòng 1 & bấm tổ hợp phím tắc để chạy macro. . . . Và sau đó là cú phône không đáng có vì gây lãng phí xã hội bỡi người lập trình để lại!
Không chỉ vậy, ý mình muốn nói 1 điều nữa là muốn trở thành 'Chính quy' không nên phớt lờ những cảnh báo thân thiện. . .
Chúc mọi người sức khõe!!$@!!
 
Upvote 0
Web KT

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

Back
Top Bottom