Lỗi run time 1004

Liên hệ QC

connhangheo

Thành viên thường trực
Tham gia
18/5/07
Bài viết
214
Được thích
225
Nghề nghiệp
Sinh Viên
PHP:
Private Sub CommandButton1_Click()
    Dim i As Integer, j As Integer, lrow As Integer
    
    Sheets("data").Select
    Rows("1:1").Select
em cho chương trình chạy từng dòng thì thấy đến dòng này thì báo lỗi run time error '1004'.
Bác nào giải thích giúp em vì sao lại xảy ra lỗi này với. Thanks.
Đây là toàn bộ code:
PHP:
Private Sub CommandButton1_Click()
    Dim i As Integer, j As Integer, lrow As Integer
    
    Sheets("data").Select
    Rows("1:1").Select
    Selection.AutoFilter
    lrow = Range("A65432").End(xlUp).Row
    Range("A1:H" & lrow).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:= _
        xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
    For i = 2 To lrow
     If Cells(i, 1) = Cells(i + 1, 1) And Cells(i, 2) = Cells(i + 1, 2) And Cells(i, 8) = Cells(i + 1, 8) Then
     Rows(i + 1).Delete
     End If
    Next i
    Sheets("adjust").Select
    For j = lrow + 2 To 1500
     If Cells(i, 1) = 0 Then
     Rows(i).Delete
     End If
    Next j
End Sub
 
Bạn thử xem lại code xem lỗi đó do đâu nhé!
Mình thử rồi chẳng thấy lỗi gì cả?
 

File đính kèm

Upvote 0
Dễ sót lắm, khi xóa có điều kiện


Mình tham gia khía cạnh khác của vấn đề, đó là xóa dòng khi thỏa điều kiện:
Khi đó bạn nên dò tìm từ đáy dữ liệu dò lên, gặp dòng nào thỏa thì xóa ngay, hay gôm nó vô biến ( As Range, để sau cùng xóa 1 lần)
Người ta bảo với mình rằng xóa dòng từ trên xuống hay để sót lắm! Bạn thử khi 3 dòng liên tục đều thỏa điều kiên xem, việc mình nói có đúng không (!):=\+
 
Lần chỉnh sửa cuối:
Upvote 0
em ko hiểu ý bác SA_DQ nói lắm, nhưng em fát hiện ra lỗi rồi.
Vì commandbutton em để ở sheet adjust, em cứ nghĩ là khi có dòng code: Sheets("data").Select thì mọi việc mình làm sẽ ở trong sheet data mà ko fải. Chương trình vẫn hiểu là mình đang thực hiện các lệnh trong sheet adjust (là sheet chứa commandButton). Vì thế nên khi em viết thêm sheets("data").Rows("1:1").Select (các dòng sau cũng thêm) thì chương trình mới chạy tiếp mà ko báo lỗi run time error '1004' nữa
 
Upvote 0
em ko hiểu ý bác SA_DQ nói lắm, nhưng em fát hiện ra . . .
Để làm rõ hơn vấn đề xóa rocords trùng, mình đã tạo CSDL gốc tại sheets("DL");
(Các records trùng 4 mình đã tô cùng màu & khác với cách tô của những records trùng 4 màu khác)
Sau đó chép từ đây ra 2 sheets khác là 'S0' & 'S1'
Từ 'S0' mình chạy macro xóa những dòng trùng & biện phàp tiến hành là từ trên xuống
Từ 'S0' mình chạy macro xóa những dòng trùng & biện phàp tiến hành là từ dưới lên
Mời bạn xem kết quả trong file đính kèm & rút ra kết luận!​


PHP:
Option Explicit
Dim iJ As Integer, lrow As Integer

Private Sub CommandButton1_Click()
    
    Sheets("S0").Select
    lrow = [A65432].End(xlUp).Row
    Range("A1:E" & lrow).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:= _
        xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
        
    For iJ = 2 To lrow
     If Cells(iJ, 1) = Cells(iJ + 1, 1) And Cells(iJ, 2) = Cells(iJ + 1, 2) _
        And Cells(iJ, 4) = Cells(iJ + 1, 4) Then
     Rows(iJ + 1).Delete
     End If
    Next iJ
    
End Sub
PHP:
Sub DeleteAll()
 Dim Rng As Range
 
 Sheets("S1").Select:               Columns("A:F").Select
 Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range("B2") _
    , Order2:=xlAscending, Key3:=Range("D2"), Order3:=xlAscending, Header:= _
    xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:=xlSortNormal
 lrow = [A65432].End(xlUp).Row
 For iJ = 2 To lrow
    With Cells(iJ, 2)
        If .Value = .Offset(1) And .Offset(, -1) = .Offset(1, -1) _
            And .Offset(, 2) = .Offset(1, 2) Then
            If Rng Is Nothing Then
                Set Rng = .Offset(1)
            Else
                Set Rng = Union(Rng, .Offset(1))
            End If
        End If
    End With
 Next iJ
 Rng.EntireRow.Delete
 
End Sub
 

File đính kèm

Upvote 0
em đã thấy sự khác biệt này, nhưng ko hiểu trong sub deleteall bác sort đến 3 key là thế nào, và em cũng ko hiểu hàm union (đọc help cũng chẳng hiểu luôn) có ý nghĩa thế nào (vì từ đầu đến cuối Rng vẫn chỉ là "lan11"). Mong bác chỉ giáo. Thanks
 
Upvote 0
nhưng ko hiểu:
1*/ trong sub deleteall bác sort đến 3 key là thế nào
2*/ & em cũng ko hiểu hàm union (đọc help cũng chẳng hiểu luôn) có ý nghĩa thế nào (vì từ đầu đến cuối Rng vẫn chỉ là "lan11"). Mong bác chỉ giáo. Thanks
1/* Vì mình muốn xóa Những người có cùng [Ho], [Ten] & cùng [Khoa] nên chắc ăn í mà;
2/*
Union() mình dùng phương thức này để gôm lại tất cả các ô thỏa điều kiện (để xóa); Sau đó chỉ xóa 1 lần các dòng có chứa những ô đó;
Việc này tránh màn hình co giật; Nhưng cơ bản hơn là nó không bỏ sót các đối tượng cần xóa đó bạn; (Một khi bạn đối chiếu CSDL tại gốc sẽ thấy ngay điều này)
Nếu bạn chưa quen với UNION() thì bạn phải duyệt từ dưới 'Đáy' CSDL lên đầu;
Khi gặp record trên nó giống với nó thì phải xóa nó;
Thật ra cha B này cho ta lệnh xóa nữa vời í mà. Này nha: Bạn thử xóa đi 100 dòng tấp lự; trên trang tính số dòng khác lại điền đầy lại; giống như bạn làm công giã tràng vậy;
Tuy nhiên nếu không chú í cái ni chắc rằng lọt sổ khi xóa records từ trên xuống.
Nếu cần biết thêm về UNION() bấm vô chữ INTERSECT của chữ ký của mình tìm hiểu thêm!
 
Upvote 0
Thực sự là em vẫn ko hiểu hàm union, hàm này để gom các cell vào theo kiểu cell1 =a, cell2 = b thì union(cell1,cell2) = ab hay là như thế nào. Vì em chạy đến cuối chương trình thì Rng ="Lan11" (tức là = cell B12). Không hiểu. Mong bác giải thích júp, trình độ em có hạn chế :). Thanks
 
Upvote 0
Thực sự là em vẫn ko hiểu hàm union, hàm này để gom các cell vào theo kiểu cell1 =a, cell2 = b thì union(cell1,cell2) = ab hay là như thế nào. Vì em chạy đến cuối chương trình thì Rng ="Lan11" (tức là = cell B12). Không hiểu. Mong bác giải thích júp, trình độ em có hạn chế :). Thanks

Chào bạn,
Giả sử bạn giữ phím ctrl và click chuột vào nhiều ô ví dụ ô A1, B5, C3, D6 thì việc dùng hàm union cho máy làm động tác tương tự

ví dụ:
PHP:
Sub testdulieu1()
Union(Range("A1"), Range("B2"), Range("C4")).Select  'là làm động tác Click chuột chọn ô A1, B2, C4
End Sub
'---------------------------------------------------
Sub testdulieu2()
Union(Cells(1, 1), Cells(2, 3), Cells(4, 4)).Select   'là click chuột chọn ô A1, C2, D4
End Sub

Như vậy thì dễ hiểu rồi nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn hãy cho chạy macro sau, có thể rõ hơn với bạn!

Thực sự là em vẫn ko hiểu hàm union, hàm này để gom các cell vào theo kiểu cell1 =a, cell2 = b thì union(cell1,cell2) = ab hay là như thế nào. Vì em chạy đến cuối chương trình thì Rng ="Lan11" (tức là = cell B12). Không hiểu. Mong bác giải thích júp, trình độ em có hạn chế :). Thanks
PHP:
Option Explicit

Sub UnionRanges()
 Dim Rng As Range:                  Dim iJ As Integer
 Sheets("S1").Select
 Set Rng = [B2]
 For iJ = 2 To 9
    If iJ Mod 2 = 1 Then Set Rng = Union(Rng, Cells(iJ, 2))
 Next iJ
 MsgBox Rng.Address
End Sub
Chúng ta lưu ý rằng UNION() hay INTERSECT() không phải là hàm, mà là các phương thức
Xin xem thêm ở phần chữ ký phía dưới đây của mình về hai phương thức này.
 
Upvote 0
Web KT

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

Back
Top Bottom