Giúp code xóa dòng theo hóa đơn và sau khi xóa xong tự động sort (1 người xem)

Liên hệ QC

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

minhtuan55

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
23/3/16
Bài viết
705
Được thích
52
Chào cả nhà GPE !
Mình muốn dùng 1 đoạn code để xóa dòng theo số hóa đơn, và sau khi xóa dong phải sort lại theo số hđ luôn. Mình có gửi file các bạn xem giúp mình nhé. thank
 

File đính kèm

Chào cả nhà GPE !
Mình muốn dùng 1 đoạn code để xóa dòng theo số hóa đơn, và sau khi xóa dong phải sort lại theo số hđ luôn. Mình có gửi file các bạn xem giúp mình nhé. thank
Mã:
Option Explicit
Sub xoa_HD()
Dim Sarr, Rarr(1 To 60000, 1 To 4) As Variant
Dim i, j, k As Long
Dim rng As Range
Sarr = Sheet1.[b2:e60000]

For i = 1 To UBound(Sarr)
    If Sarr(i, 1) = "" Then Exit For
    If Sarr(i, 1) <> Sheet1.[h3] Then
        k = k + 1
        For j = 1 To 4
            Rarr(k, j) = Sarr(i, j)
        Next
    End If
Next

If k Then
Application.ScreenUpdating = False
With Sheet1
    .[b2:e60000].ClearContents
    Set rng = .[b2].Resize(k, 4)
    rng.Value = Rarr
    With Sheet1.Sort
        .SetRange rng
        .Header = xlYes
        .Apply
    End With
End With
End If

End Sub
 
Upvote 0
Chào cả nhà GPE !
Mình muốn dùng 1 đoạn code để xóa dòng theo số hóa đơn, và sau khi xóa dong phải sort lại theo số hđ luôn. Mình có gửi file các bạn xem giúp mình nhé. thank

PHP:
Sub xoa()
Dim i As Long
For i = 34 To 2 Step -1
  If Cells(i, 2) = [H3] Then
    Cells(i, 2).EntireRow.Delete
  End If
Next i
End Sub
 
Upvote 0
Mã:
.....
    With Sheet1.Sort
        .SetRange rng
        .Header = xlYes
        .Apply
    End With
End With
End If

End Sub

Em nghĩ là các dòng cần xóa nó nằm liên tiếp nhau nên sau khi xóa xong thứ tự không bị ảnh hưởng gì, vì thế không cần phải Sort lại đâu anh
 
Upvote 0
Lấy dữ liệu đó gõ số 1 vô H3 đi Phong ơi. Code chạy vui lắm.

Em sửa lại thế này không biết còn mắc lỗi gì nữa không:
Mã:
Sub xoa()
Dim i As Long, vung As Range
Set vung = Range("B1")
For i = 2 To 34
  If Cells(i, 2) = [H3] Then
    Set vung = Union(vung, Cells(i, 2))
  End If
Next i
    Set vung = Intersect(vung, [B2:B34])
    vung.EntireRow.Delete
End Sub
 
Upvote 0
Em sửa lại thế này không biết còn mắc lỗi gì nữa không:
Mã:
Sub xoa()
Dim i As Long, vung As Range
Set vung = Range("B1")
For i = 2 To 34
  If Cells(i, 2) = [H3] Then
    Set vung = Union(vung, Cells(i, 2))
  End If
Next i
    Set vung = Intersect(vung, [B2:B34])
    vung.EntireRow.Delete
End Sub
Xóa luôn dữ liệu tại H2 của người ta luôn rồi --=0. Tóm lại không nên xóa nguyên dòng, lỡ trong sheet đó còn có nhiều dữ liệu khác không nằm trong bảng đấy. Code ở #2 chạy ngon lành rồi mà.
 
Upvote 0
Xóa luôn dữ liệu tại H2 của người ta luôn rồi --=0. Tóm lại không nên xóa nguyên dòng, lỡ trong sheet đó còn có nhiều dữ liệu khác không nằm trong bảng đấy. Code ở #2 chạy ngon lành rồi mà.

À, em hiểu ý anh rồi ...:-=:-= Tại em không lường trước cái zụ này
 
Upvote 0
Mã:
Option Explicit
Sub xoa_HD()
Dim Sarr, Rarr(1 To 60000, 1 To 4) As Variant
Dim i, j, k As Long
Dim rng As Range
Sarr = Sheet1.[b2:e60000]

For i = 1 To UBound(Sarr)
    If Sarr(i, 1) = "" Then Exit For
    If Sarr(i, 1) <> Sheet1.[h3] Then
        k = k + 1
        For j = 1 To 4
            Rarr(k, j) = Sarr(i, j)
        Next
    End If
Next

If k Then
Application.ScreenUpdating = False
With Sheet1
    .[b2:e60000].ClearContents
    Set rng = .[b2].Resize(k, 4)
    rng.Value = Rarr
    With Sheet1.Sort
        .SetRange rng
        .Header = xlYes
        .Apply
    End With
End With
End If

End Sub

Cảm ơn bác nha e làm được rồi

Sub xoa()
' 1 xoa
Dim i As Long
For i = 34 To 2 Step -1
If Cells(i, 2) = Range("h3") Then
Range("b" & i & ":e" & i).ClearContents
End If
Next i

' 2 sort
Range("B2:E34").Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
MsgBox ("Ok good")
End Sub
 
Upvote 0
PHP:
Sub xoa()
Dim i As Long
For i = 34 To 2 Step -1
  If Cells(i, 2) = [H3] Then
    Cells(i, 2).EntireRow.Delete
  End If
Next i
End Sub


Cảm ơn code anh nha. Em Edit lại xíu ok rồi

Sub xoa()
' 1 xoa
Dim i As Long
For i = 34 To 2 Step -1
If Cells(i, 2) = Range("h3") Then
Range("b" & i & ":e" & i).ClearContents
End If
Next i

' 2 sort
Range("B2:E34").Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
MsgBox ("Ok good")
End Sub
 
Upvote 0
PHP:
Sub xoa()
Dim i As Long
For i = 34 To 2 Step -1
  If Cells(i, 2) = [H3] Then
    Cells(i, 2).EntireRow.Delete
  End If
Next i
End Sub

Ak anh cho em hỏi chổ
For i = 34 To 2 Step -1 nó có bằng For i = 2 To 34 không vậy ?
tại em mới biết vba sơ sơ anh thông cảm mây câu hỏi ngu người của em
 
Upvote 0
Ak anh cho em hỏi chổ
For i = 34 To 2 Step -1 nó có bằng For i = 2 To 34 không vậy ?
tại em mới biết vba sơ sơ anh thông cảm mây câu hỏi ngu người của em
Cái ni giống như ta xét vòng 3 trước, cuối là vòng 1
& chiều ngược lại là xét vòng 1 trước, sau đó xét vòng 2 & cuối là vòng ba;

Nhưng để xóa dòng thì nên xét vòng ba, . . . vòng hai rồi mới đến vòng một (không thể làm ngược chu trình này trong xóa dòng được)!
 
Upvote 0
Sub xoa()
Dim i As Long
For i = 2 To 34 If Cells(i, 2) = [H3] Then
Cells
(i, 2).EntireRow.Delete
i=i-1
End
If
Next i
End Sub

Cái này nếu xóa dòng có số hợp đồng là 1. Khi cho i chạy từ 2 đến 34, i = 2 thỏa mãn thì thực hiện xóa dòng .. sau

đó i = i-1 vầy i = 1 à bạn, mà trong khi vòng lặp bạn cho bắt đầu từ 2 mà
 
Upvote 0
Ak anh cho em hỏi chổ
For i = 34 To 2 Step -1 nó có bằng For i = 2 To 34 không vậy ?
tại em mới biết vba sơ sơ anh thông cảm mây câu hỏi ngu người của em

Như nhau bạn à, nhưng mà khi thực hiện xóa dòng ta nên xét từ dưới lên thay vì từ trên xuống.

Bài này bạn làm theo Code ở bài #2 là OK rồi. Nếu làm theo Code của mình viết thì bạn nhớ để số hợp đồng cần xóa ở

dòng 1 để tránh trường hợp khi xóa các dòng có hợp đồng = 1 thì kết quả ra không chính xác nha
 
Upvote 0
Cái này nếu xóa dòng có số hợp đồng là 1. Khi cho i chạy từ 2 đến 34, i = 2 thỏa mãn thì thực hiện xóa dòng .. sau

đó i = i-1 vầy i = 1 à bạn, mà trong khi vòng lặp bạn cho bắt đầu từ 2 mà
Chỉ dùng để trả lời bạn Minhtuan55 thôi, cách của bạn chuẩn hơn
i=i-1 nằm trong If ... i=i-1 End nên chỉ thực hiện sau khi xóa 1 dòng do đó số dòng sẽ giảm 1, đúng ra còn
phải giảm dòng 34 xuống một dòng, nhưng không ảnh hưởng kết quả nên bỏ qua
Bắt đầu i=2, nếu xóa 1 dòng và i=i-1 ra i=1 khi gặp lệnh Next nó sẽ là 2 ở vòng lập kế tiếp
 
Upvote 0
Web KT

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

Back
Top Bottom