Muốn thêm/ xóa mỗi một dòng tương ứng vào mỗi một chỉ tiêu (1 người xem)

Liên hệ QC

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

othanhquango

Thành viên hoạt động
Tham gia
6/3/09
Bài viết
138
Được thích
7
Tình hình là mình muốn thêm vào mỗi chỉ tiêu 01 dòng nếu mình nhấn nút thêm dòng, và muốn xóa tương ứng mỗi chỉ tiêu 01 dòng nếu mình nhấn nút xóa.

Nhưng do vừa học VBA nên khả năng mình còn rất kém.
Rất mong anh chị em hướng dẫn mình trong trường hợp này.
 

File đính kèm

Tình hình là mình muốn thêm vào mỗi chỉ tiêu 01 dòng nếu mình nhấn nút thêm dòng, và muốn xóa tương ứng mỗi chỉ tiêu 01 dòng nếu mình nhấn nút xóa.

Nhưng do vừa học VBA nên khả năng mình còn rất kém.
Rất mong anh chị em hướng dẫn mình trong trường hợp này.
Nguyên tắc khi thêm, xóa dòng, cột trong vòng lặp là phải duyệt ngược. Tức là từ dưới lên và từ phải qua trái.
Bạn xem thử file này nhé.
 

File đính kèm

Upvote 0
Mình vẫn chưa hiểu code của bạn lắm. Hic, vừa học VBA tập tè mà :(

Trong code của bạn mình có 02 vấn đề như sau:

- "Nguyên tắc khi thêm, xóa dòng, cột trong vòng lặp là phải duyệt ngược": code của bạn duyệt từ dòng cuối cùng đến dòng đầu tiên và mấu chốt của duyệt ngược là phải -1 ở step?
- Trong code của bạn mình thấy có dùng mảng, và có phải là muốn duyệt ngược vòng lập là phải dùng mảng mới duyệt ngược được hả bạn? Mình không dùng mảng có duyệt ngược được hay không?
- Và cuối cùng là mình vẫn không hiểu tại sao phải duyệt ngược mà không duyệt xuôi :(. Nếu được bạn có thể cho mình cái vd nho nhỏ.

Mình hơi dốt nên
 
Upvote 0
Mình vẫn chưa hiểu code của bạn lắm. Hic, vừa học VBA tập tè mà :(

Trong code của bạn mình có 02 vấn đề như sau:

- "Nguyên tắc khi thêm, xóa dòng, cột trong vòng lặp là phải duyệt ngược": code của bạn duyệt từ dòng cuối cùng đến dòng đầu tiên và mấu chốt của duyệt ngược là phải -1 ở step?
- Trong code của bạn mình thấy có dùng mảng, và có phải là muốn duyệt ngược vòng lập là phải dùng mảng mới duyệt ngược được hả bạn? Mình không dùng mảng có duyệt ngược được hay không?
- Và cuối cùng là mình vẫn không hiểu tại sao phải duyệt ngược mà không duyệt xuôi :(. Nếu được bạn có thể cho mình cái vd nho nhỏ.

Mình hơi dốt nên
1. Mấu chốt của việc duyệt ngược chính là chỗ đó. Cho biến chạy từ cuối lên đầu với bước nhảy là -1
2. Tôi dùng mảng cho nhanh chứ bạn cũng có thể xử dụng trực tiếp dữ liệu từ bảng tính.
3. Nếu không duyệt ngược thì sẽ bị như thế này: Giả sử bạn dùng vòng lặp duyệt qua từ dòng 1 đến dòng 10 và bạn đang xét dòng 1. Dòng 1 thỏa điều kiện xóa dòng và bạn xóa dòng 1. Vòng lặp sẽ xét tiếp tới dòng 2. Tuy nhiên, khi bạn xóa dòng 1 thì dòng 2 đã nhảy lên thành dòng 1 nên nếu xét dòng 2 sẽ bỏ sót dòng 1 (dòng 1 bây giờ thực ra là dòng 2 trước khi xóa dòng 1). Ngược lại, nếu bạn duyệt ngược thì không bị như vậy.
 
Upvote 0
/(hi xoá dòng ta cũgn có thể duyệt từ trên xuống, mỗi cái tội là:

Khai thêm 1 biến kiểu Range;

Dòng nào thoả ta UNION() nó vô biến này;

Cuối cùng ta xoá vùng thuộc biến này là được. (Cái này bạn có thể thử sức để nâng thêm trình độ VBA)

/(hi thêm dòng ta cũng có thể thêm từ trên xuống; Nhưng thuật toán cao siêu hơn mới mần được. (Cái này biết vậy thôi, chưa nên lao vô lúc này)

Thân!
 
Upvote 0
Tình hình là mình muốn thêm vào mỗi chỉ tiêu 01 dòng nếu mình nhấn nút thêm dòng, và muốn xóa tương ứng mỗi chỉ tiêu 01 dòng nếu mình nhấn nút xóa.

Nhưng do vừa học VBA nên khả năng mình còn rất kém.
Rất mong anh chị em hướng dẫn mình trong trường hợp này.

Góp tí code thêm dòng và xoá dòng đi từ trên xuống

Tuy nhiên code này có nhược điểm là mỗi loại dữ liệu có ít nhất là 2 dòng mới thêm dòng được, nhưng ưu điểm là có thể xử lý khá nhanh với dữ liệu lớn

PHP:
Sub Xoadong()
Dim kq(), dl, i, j, k
dl = Range([A2], [A65536].End(3)).Resize(, 6).Value
ReDim kq(1 To UBound(dl), 1 To 6)
For i = 1 To UBound(dl) - 1
   If dl(i, 1) = dl(i + 1, 1) Then
      k = k + 1
      For j = 1 To 6
         kq(k, j) = dl(i, j)
      Next
   End If
Next
Range([A2], [A65536].End(3)).Resize(, 6).ClearContents
[A2].Resize(k, 6) = kq
End Sub

PHP:
Sub themdong()
Dim kq(), dl, i, j, k
dl = Range([A2], [A65536].End(3)).Resize(, 6).Value
ReDim kq(1 To UBound(dl) * 2, 1 To 6)
For i = 1 To UBound(dl)
   If i = UBound(dl) Then
      For j = 1 To 6
         kq(i + 1 + k, j) = dl(i, j)
      Next
      Exit For
   End If
   If dl(i, 1) = dl(i + 1, 1) Then
      For j = 1 To 6
         kq(i + k, j) = dl(i, j)
         kq(i + k + 1, j) = dl(i + 1, j)
      Next
   Else
      k = k + 1
      For j = 1 To 6
         kq(i + k, j) = dl(i, j)
      Next
   End If
Next
[A2].Resize(i + k + 1, 6) = kq
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Hì, sau khi mày mò thì mình cũng tự code được 02 code. Nhờ các cao thủ nhận xét giúp mình hay dở chỗ nào để mình rút kinh nghiệm:

PHP:
Sub Addrow()
Dim SttDong As Integer
Dim endR As Integer
Application.ScreenUpdating = False
SttDong = 0
endR = DT.[B1000].End(xlUp).Row
For SttDong = endR To 2 Step -1
   If Range("B" & SttDong).Value <> Range("B" & SttDong).Offset(1, 0).Value Then
      Range("A" & SttDong & ":" & "F" & SttDong).Select
      Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
      Selection.FillDown
   End If
Next
Application.ScreenUpdating = True
MsgBox "Da~ the^m do`ng xong"
End Sub

Còn đây là xoá dòng:
PHP:
Sub Delrow()
Dim SttDong As Integer
Dim endR As Integer
Application.ScreenUpdating = False
SttDong = 0
endR = DT.[B1000].End(xlUp).Row
For SttDong = endR To 2 Step -1
   If Range("B" & SttDong).Value <> Range("B" & SttDong).Offset(-1, 0).Value Then
      Range("A" & SttDong & ":" & "F" & SttDong).Select
      Selection.Delete Shift:=xlUp
   End If
Next
Application.ScreenUpdating = True
MsgBox "Da~ xo'a do`ng xong"
End Sub
 
Upvote 0
Khai thêm 1 biến kiểu Range;
Dòng nào thoả ta UNION() nó vô biến này;
Cuối cùng ta xoá vùng thuộc biến này là được. (Cái này bạn có thể thử sức để nâng thêm trình độ VBA)

Mình thử và viết code theo ý tưởng này, tức là chọn hết tất cả các range nào thoả điều kiện, sao đó thêm hoặc xoá một lần. Nhưng sao code nó không chạy ta? Nhờ bạn xem giúp mình, do cái Union search google.com nên cũng không rành lắm :(.

PHP:
Sub Addrow_union()
Dim i As Integer
Dim Vung As Range
For i = 2 To [b1000].End(xlUp).Row
   If Range("B" & i).Value <> Range("B" & i).Offset(-1, 0).Value Then
      Vung = Union(Vung, Range("A" & i & ":" & "F" & i))
   End If
Next
Vung.Select

''''''''''''
'code xoá hoặc thêm dòng

''''''''''''
End Sub
 
Upvote 0
Nếu xử lý trực tiếp trên sheet thì mình nghĩ code ngắn thế này cũng giải quyết được

PHP:
Sub chen_them()
Dim cell, i
   For Each cell In Range([a2], [a65536].End(3))
      If cell.Offset(i) <> cell.Offset(i + 1) Then
         cell.Offset(i + 1).Resize(, 6).Insert shift:=xlDown
         cell.Offset(i).Resize(, 6).Copy cell.Offset(i + 1)
         i = i + 1
      End If
   Next
End Sub

PHP:
Sub xoa_bot()
Dim cell as range
   For Each cell In Range([a2], [a65536].End(3))
      If cell <> cell.Offset(-1) Then cell.Resize(, 6).Delete shift:=xlUp
   Next
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom