Giúp sửa Code

Liên hệ QC

NguyenNgocSon

KEEP WALKING
Tham gia
4/4/08
Bài viết
280
Được thích
833
Nghề nghiệp
Ths. Cầu hầm
PHP:
Sub mang()
Dim i, j, m, n As Double
Dim a As Range
Dim rg As Range
i = 1
' Ma tran gom m hang, n cot
Set rg = Range("AK")
 m = rg.Rows.Count
 n = rg.Columns.Count
For i = 1 To m
With rg
    If .Rows(i) = 1 Then
    Rows(i).Delete
End With
'Next a
Next i
End Sub
Em code trên lỗi! Mong các bạn tìm giúp. Em đã check mà chưa tìm ra ?
 
PHP:
Sub mang()
Dim i, j, m, n As Double
Dim a As Range
Dim rg As Range
i = 1
' Ma tran gom m hang, n cot
Set rg = Range("AK")
 m = rg.Rows.Count
 n = rg.Columns.Count
For i = 1 To m
With rg
    If .Rows(i) = 1 Then
    Rows(i).Delete
End With
'Next a
Next i
End Sub
Em code trên lỗi! Mong các bạn tìm giúp. Em đã check mà chưa tìm ra ?
1. Ít nhất thì câu lệnh này là không ổn tí nào: Set rg = Range("AK"). Bạn phải thay chỗ "AK" bởi một vùng cụ thể, chẳng hạn "AK1:AK20" hoặc "AK:AK" nếu muốn lấy cả cột AK.
2. Thêm nữa, với vùng rg như trên thì cần gì câu này: n = rg.Columns.Count vì chắc chắn là kết quả sẽ bằng 1 rồi.
3. Câu lênh gán i = 1 chẳng có ý nghĩa gì vì giá trị của i đã được thiết lập trong vòng For.
4. Có câu lệnh If mà không thấy End If đâu. Bạn có thể sửa thành If .Rows(i) = 1 Then Rows(i).Delete (mà hình như sửa như vầy vẫn chưa ổn)
5. ...
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Sub mang()
Dim i, j, m, n As Double
Dim a As Range
Dim rg As Range
i = 1
' Ma tran gom m hang, n cot
Set rg = Range("AK")
 m = rg.Rows.Count
 n = rg.Columns.Count
For i = 1 To m
With rg
    If .Rows(i) = 1 Then
    Rows(i).Delete
End With
'Next a
Next i
End Sub
Em code trên lỗi! Mong các bạn tìm giúp. Em đã check mà chưa tìm ra ?
1)- Khai báo Set rg = Range("AK") là sai, sửa lại Set rg = Range("A:K")
Nhưng sao lại sử dụng hết số dòng của bảng tính, chỉ nên giới hạn số dòng trong dữ liệu của bạn thôi chứ( vòng lặp chạy "oải" lắm đó)
2)- If....Then...thiếu End If
3)- Thật sự bạn muốn làm công việc gì, có thể gởi File & trình bày cái bạn muốn làm thì sẽ thuận tiện hơn
Thân
 
Upvote 0
To NghiaPhuc: Vùng 'AK' có thể đó là 1 vùng gán tên đó nha!

Cũng giống như câu lệnh
Set Rng = Range("GPE")

Chắc vậy?!
 
Upvote 0
Xin lỗi tôi hiểu nhầm.

Nhưng câu này có nghĩa gì: If .Rows(i) = 1 Then
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi giả lập 1 vùng dữ liệu như vầy & gán cho nó cái tên 'AK'

12 | a | b | c | d | e | f | g | h | i | j | k 13 |1|2|3|4|5|6|7|8|9|10|11
14 |2|13|14|15|16|17|18|19|20|21|22
15 |3|22|.|.|..|..|G|P|E|.|COM
16 |1|.|.|..|..|G|P|E|.|COM|
17 |3|.|.|..||G|P|E|.|COM|
18 |3|.|..|..|G|P|E|.|COM||
19 |1|22|.|.|..|..|G|P|E|.|COM
20 |3|.|.|..|..|G|P|E|.|COM|
21 |1|.|.|..||G|P|E|.|COM|
22 |3|.|..|..|G|P|E|.|COM||

/(hi đó chạy macro sau sẽ có kết quả, mà mình đoán là tác gia đang hướng đến

PHP:
Sub ThuNghiemMang()
 Dim i, j, m, n As Double
 Dim Rg As Range

' Ma tran gom m hang, n cot'
 Set Rg = Range("AK")
 m = Rg.Rows.Count
 n = Rg.Columns.Count
 For i = 1 To m
   With Rg
      If Rg((i - 1) * n + 1) = 1 Then
'         Rows(i).Delete '
         MsgBox Rows(i).Address
      End If
   End With
 Next i
End Sub
 
Upvote 0
Em rất cám ơn sự quan tâm của mọi người. Thực ra code trên e viết với mục đích như sau:
1.Vùng dữ liệu đặt tên là AK (Trong vùng này sẽ có 1 số hàng, 1 số cột có giá trị bằng 0.
2.Em muốn code để xóa các dòng các cột này đi !
Nhưng đoạn mã :
For i = 1 To m
With rg
If .Rows(i) = 0 Then
Rows(i).Delete
End With
'
Next a
Next i

Báo lối
Mọi người có thể sửa giúp em theo hướng em đang code hoặc code lại giúp e
Em cám ơn !
Thân.
 
Upvote 0
Em rất cám ơn sự quan tâm của mọi người. Thực ra code trên e viết với mục đích như sau:
1.Vùng dữ liệu đặt tên là AK (Trong vùng này sẽ có 1 số hàng, 1 số cột có giá trị bằng 0.
2.Em muốn code để xóa các dòng các cột này đi !
Nhưng đoạn mã :
For i = 1 To m
With rg
If .Rows(i) = 0 Then
Rows(i).Delete
End With
'
Next a
Next i

Báo lối
Mọi người có thể sửa giúp em theo hướng em đang code hoặc code lại giúp e
Em cám ơn !
Thân.
Code này đương nhiên là sai
Giờ muốn sửa thì bạn phải mô ta bài toán
- Toàn bộ các cell trên 1 dòng đều có giá trị = 0 thì xóa nguyên dòng?
- Chỉ cần 1 cell có giá trị = 0 thì xóa nguyên dòng?
- Cell rổng có xem là = 0 hay không?
vân vân...
Hay đơn giản, bạn đưa file lên thì vấn đề đã được giải quyết xong từ đời nào rồi
 
Upvote 0
Khi fải xóa dòng hay cột cần chú í 1 điều

Là dòng dưới dòng vừa xóa sẽ được đôn lên, hay cột fải liền kề cột vừa xóa sẻ chuyển qua thay thế cột vừa xóa;

Bỡi vậy muốn xóa từng dòng ta duyệt từ dưới lên & muốn xóa từng cột, ta lại duyệt từ fải qua

Hoặc là ta duyệt từ trên xuống, gặp ô nào thòa ta gán dòng đó thêm (bằng fương thức UNION()) vô biến
Sau khi duyệt hết các dòng ta chỉ làm 1 động tác xóa các dòng chứa trong biến đó đi.

Quay lại chuyện của bạn ta cú thử duyệt các ô theo hàng từ dưới lên mà thôi; sau khi duyệt & xóa các hàng thoả xong thì xét xem có còn cột nào cần xóa nữa không;

(/ì bạn đã biết lập trình 1 cách tương đối, nên mình chỉ đường hướng vậy thôi; Có nghĩa là lấy cột đầu làm chuẩn, duyệt các ô trong cột này từ dưới lên; Nhưng ứng với mỗi hàng ta fải duyệt toàn bộ số ô trong hàng, nếu gặp ô thỏa điều kiện xóa, ta xóa hàng đó & xét tiếp hàng trên.

Cũng có những cách khác, nhưng ta cứ làm fổ thông trước đã.
 
Upvote 0
Vầy thử xem
PHP:
Sub Test()
  Dim i As Long, j As Long, TmpRng As Range
  With Range("AK")
    For i = 1 To .Rows.Count
      If WorksheetFunction.CountIf(.Rows(i), "0") = .Columns.Count Then
        If TmpRng Is Nothing Then
          Set TmpRng = .Rows(i)
        Else
          Set TmpRng = Union(TmpRng, .Rows(i))
        End If
      End If
    Next
  End With
  If Not TmpRng Is Nothing Then TmpRng.Delete 2
  Set TmpRng = Nothing
  With Range("AK")
    For j = 1 To .Columns.Count
      If WorksheetFunction.CountIf(.Columns(j), "0") = .Rows.Count Then
        If TmpRng Is Nothing Then
          Set TmpRng = .Columns(j)
        Else
          Set TmpRng = Union(TmpRng, .Columns(j))
        End If
      End If
    Next
    If Not TmpRng Is Nothing Then TmpRng.Delete 1
  End With
End Sub
 
Upvote 0
Nếu vậy bạn ráp code này xem được không

Mã:
Sub Mang()
Dim i, Dg, Cot, Rg As Range
Set Rg = Range("AK")
Dg = Rg.Rows.Count
Cot = Rg.Columns.Count
For i = IIf(Dg > Cot, Dg, Cot) To 1 Step -1
If WorksheetFunction.Sum(Range("AK").Columns(IIf(i > Cot, Cot, i))) = 0 _
Then Range("AK").Columns(IIf(i > Cot, Cot, i)).Delete
If WorksheetFunction.Sum(Range("AK").Rows(IIf(i > Dg, Dg, i))) = 0 _
Then Range("AK").Rows(IIf(i > Dg, Dg, i)).Delete
Next
End Sub
 
Upvote 0
Nếu vậy bạn ráp code này xem được không

Mã:
Sub Mang()
Dim i, Dg, Cot, Rg As Range
Set Rg = Range("AK")
Dg = Rg.Rows.Count
Cot = Rg.Columns.Count
For i = IIf(Dg > Cot, Dg, Cot) To 1 Step -1
If WorksheetFunction.Sum(Range("AK").Columns(IIf(i > Cot, Cot, i))) = 0 _
Then Range("AK").Columns(IIf(i > Cot, Cot, i)).Delete
If WorksheetFunction.Sum(Range("AK").Rows(IIf(i > Dg, Dg, i))) = 0 _
Then Range("AK").Rows(IIf(i > Dg, Dg, i)).Delete
Next
End Sub
Anh dùng điều kiện SUM(...) = 0 là không chắc ăn đâu
Ví dụ như hình này:

untitled.JPG
 
Upvote 0
Anh dùng điều kiện SUM(...) = 0 là không chắc ăn đâu
Hì, vậy thì dùng countif đi:

Mã:
Sub Mang()
Dim i, Dg, Cot, Rg As Range
Set Rg = Range("AK")
Dg = Rg.Rows.Count
Cot = Rg.Columns.Count
For i = IIf(Dg > Cot, Dg, Cot) To 1 Step -1
If WorksheetFunction.CountIf(Range("AK").Columns(IIf(i > Cot, Cot, i)), "<>0") = 0 _
Then Range("AK").Columns(IIf(i > Cot, Cot, i)).Delete
If WorksheetFunction.CountIf(Range("AK").Rows(IIf(i > Dg, Dg, i)), "<>0") = 0 _
Then Range("AK").Rows(IIf(i > Dg, Dg, i)).Delete
Next
End Sub
 
Upvote 0
Biết đâu nguyện vọng của chủ topic là khác thì sao?

Ví dụ nếu xuất hiện trị 0 ở 1 ô nào đó thì xóa tất cả từ hàng lẫn cột thì sao?

/(hì, Khì, vui thôi ông chủ topic nha!
 
Upvote 0
Để tăng tốc, ai làm thử bài này bằng phương pháp xử lý mảng xem thử!!!
Ẹc... Ẹc... cũng hơi.. khoai à nha!
 
Upvote 0
Hì, vậy thì dùng countif đi:

Mã:
Sub Mang()
Dim i, Dg, Cot, Rg As Range
Set Rg = Range("AK")
Dg = Rg.Rows.Count
Cot = Rg.Columns.Count
For i = IIf(Dg > Cot, Dg, Cot) To 1 Step -1
If WorksheetFunction.CountIf(Range("AK").Columns(IIf(i > Cot, Cot, i)), "<>0") = 0 _
Then Range("AK").Columns(IIf(i > Cot, Cot, i)).Delete
If WorksheetFunction.CountIf(Range("AK").Rows(IIf(i > Dg, Dg, i)), "<>0") = 0 _
Then Range("AK").Rows(IIf(i > Dg, Dg, i)).Delete
Next
End Sub
Cám ơn sealand rất nhiều! Có thể giải thích giúp em ý nghĩa từng dòng code không ạ? em muốn biết để áp dụng cho các bài sau .
Thân !
 
Upvote 0
Upvote 0
Web KT

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

Back
Top Bottom