Duyệt range này như thế nào ?

Liên hệ QC

vumian

Mỗi bậc thang là mỗi Cell
Tham gia
12/3/07
Bài viết
267
Được thích
186
Nghề nghiệp
employee only, not a boss
Dear all,

Với code này,

Sub ShortageItems()
Dim i As Integer
Sheets("ABC").Select
Range("E65536").Select
Selection.End(xlUp).Select
endrow = ActiveCell.Row
i = 2
For i = 2 To endrow
temp = Sheets("ABC").Cells(i, 5).Value
If WorksheetFunction.CountIf(Sheets("Plan").Range("B:B"), temp) = 0 And temp <> "" Then
MsgBox "Hix, : " & temp
End If
Next i
End Sub

Làm sao nếu bên ABC sheet, mà có nhiều cells(i,5).value cùng giá trị, mà không tồn tại bên Plan thì chỉ msgbox 1 lần thôi, Code hiện tại thì duyệt từ đầu đến endrow, nhưng nếu trùng cells(i,5) thì msgbox nhiều lần ?

Cám ơn nhiều
 
Lần chỉnh sửa cuối:
Theo tôi, đơn giản dùng AdvancedFilter cột E (Unique:=True) ra một cột nào đó (cột AE chẳng hạn). Sau đó mới sử dụng vòng lặp như code của bạn viết ở trên (cells(i,31) chẳng hạn). Cuối cùng thì xoá cột AE đi.
 
i = 2
If WorksheetFunction.CountIf(Sheets("Plan").Range("B: B"), temp) = 0 And temp <> "" Then
MsgBox "Hix, : " & temp
End If

For i = 3 To endrow
temp = Sheets("ABC").Cells(i, 5).Value
If WorksheetFunction.CountIf(Sheets("ABC").Range(Cells(2, 5),Cells(i-1, 5)), temp) > 0 then i =i+1
If WorksheetFunction.CountIf(Sheets("Plan").Range("B: B"), temp) = 0 And temp <> "" Then
MsgBox "Hix, : " & temp
End If
Next i
Bạn thêm 1 hàm countif nữa đếm từ đầu đến cells(i-1,5)
 
Với code này,
Mã:
[b] 
Sub ShortageItems()[/b]
Dim i As Integer
Sheets("ABC").Select
Range("E65536").Select
Selection.End(xlUp).Select
endrow = ActiveCell.Row
i = 2
For i = 2 To endrow
temp = Sheets("ABC").Cells(i, 5).Value
If WorksheetFunction.CountIf(Sheets("Plan").Range("B:B"), temp) = 0 And temp <> "" Then
MsgBox "Hix, : " & temp
End If
Next i[b]
End Sub[/b]
Làm sao nếu bên ABC sheet, mà có nhiều cells(i,5).value cùng giá trị, mà không tồn tại bên Plan thì chỉ msgbox 1 lần thôi,
Code hiện tại thì duyệt từ đầu đến endrow, nhưng nếu trùng cells(i,5) thì msgbox nhiều lần ?
Cám ơn nhiều
/(/)ình nghĩ bạn phải khai báo thêm một biến kiểu Yes/No;
& câu lệnh sẽ là:
Mi đã iêu lần đầu rồi, mi chớ iêu lần sau!
 
Em xin chình sửa lại code của bác ThuNghi chút xíu

Mã:
[color=darkblue]Sub[/color] ShortageItems()
[color=darkblue]Dim[/color] i [color=darkblue]As[/color] [color=darkblue]Integer[/color]
Sheets("ABC").Select
endrow = Range("e65536").End(xlUp).Row
[color=darkblue]For[/color] i = 2 [color=darkblue]To[/color] endrow
temp = Sheets("ABC").Cells(i, 5).Value
[color=darkblue]If[/color] WorksheetFunction.CountIf(Sheets("ABC").Range(Cells(i + 1, 5), Cells(endrow + 1, 5)), temp) > 0 [color=darkblue]Then[/color]
    i = i + 1
[color=darkblue]Else[/color]
    [color=darkblue]If[/color] WorksheetFunction.CountIf(Sheets("Plan").Range("B:B"), temp) = 0 And temp <> "" [color=darkblue]Then[/color] MsgBox "Hix, : " & temp
[color=darkblue]End[/color] [color=darkblue]If[/color]
[color=darkblue]Next[/color]
[color=darkblue]End[/color] [color=darkblue]Sub[/color]

Thân.
 
Thanks bác SoiBien nha, , nhưng mà chưa hiểu lắm, hihi, sao lại dùng Cells(endrow+1,5) nhỉ, cái chỗ nào đây có value nào nhỉ
 
vumian đã viết:
Thanks bác SoiBien nha, , nhưng mà chưa hiểu lắm, hihi, sao lại dùng Cells(endrow+1,5) nhỉ, cái chỗ nào đây có value nào nhỉ

vì nếu không thêm vào, bác cứ thử cái cuối cùng, (i = endrow) nó đếm nó trong vùng có chứa nó ----> nếu nó có duy nhất cũng sẽ không thông báo "hix :".

Thân.
 
vumian đã viết:
Dear all,


Làm sao nếu bên ABC sheet, mà có nhiều cells(i,5).value cùng giá trị, mà không tồn tại bên Plan thì chỉ msgbox 1 lần thôi, Code hiện tại thì duyệt từ đầu đến endrow, nhưng nếu trùng cells(i,5) thì msgbox nhiều lần ?

Cám ơn nhiều
Nếu bạn muốn kiểm soát các lỗi trùng này thì nên trích lọc kết quả này ra một sheet riêng để dễ kiểm soát.

Nếu có 100 lần như vậy tức là hiện ra 100 cái Msgbox thì quả là . . .. vất vả.
PHP:
Sub ShortageItems()
Dim i As Integer
Sheets("ABC").Select
endrow = Range("e65536").End(xlUp).Row
For i = 2 To endrow
temp = Sheets("ABC").Cells(i, 5).Value
If WorksheetFunction.CountIf(Sheets("ABC").Range(Cells(i + 1, 5), Cells(endrow + 1, 5)), temp) > 0 Then
    i = i + 1
Else
    If WorksheetFunction.CountIf(Sheets("Plan").Range("B:B"), temp) = 0 And temp <> "" Then MsgBox "Hix, : " & temp
End If
Next
End Sub
To soibien :
Trong vòng lặp thì biến temp chỉ sử dụng 1 lần cho 1 i, do đó không nên dùng nó. Chỉ khi nào nó được sử dụng nhiều lần thì mói nên dùng. Ở đây nên dùng trực tiếp tốt hơn, nhanh hơn. Biến temp ở đây chỉ có tác dụng trông nó gọn hơn thôi.
Ta không nên tìm kiếm tron cả cột B, vì mỗi một i thì là sử dụng lại range này, vì vậy nên thu gọn range này lại, giống như cách tìm hàng cuối ở trên. Như vậy sẽ cải thiện hơn nữa về tốc độ.
và vì trong ELSE có IF nên có thể dùng Else If luôn cho gọn.

Đôi lời mạo muội.
Thân!



 
Gởi Vumian
Ông dùng thử cái này xem có được không nhé.
Mã:
Sub ShortageItems()
Dim i As Long, EndRow As Long
Dim Temp As String
Sheets("ABC").Select
EndRow = Range("E65536").End(xlUp).Row
For i = 2 To EndRow
    If WorksheetFunction.CountIf(Sheets("Plan").Range("B:B"), Sheets("ABC").Cells(i, 5)) = 0 _
        And Sheets("ABC").Cells(i, 5) <> "" Then Temp = Temp & Sheets("ABC").Cells(i, 5) & " - "
Next i
MsgBox Left(Temp, Len(Temp) - 3)
End Sub
Thân!
 
tedaynui đã viết:
Gởi Vumian
Ông dùng thử cái này xem có được không nhé.
Mã:
Sub ShortageItems()
Dim i As Long, EndRow As Long
Dim Temp As String
Sheets("ABC").Select
EndRow = Range("E65536").End(xlUp).Row
For i = 2 To EndRow
    If WorksheetFunction.CountIf(Sheets("Plan").[B]Range("B:B")[/B], Sheets("ABC").Cells(i, 5)) = 0 _
        And Sheets("ABC").Cells(i, 5) <> "" Then Temp = Temp & Sheets("ABC").Cells(i, 5) & " - "
Next i
MsgBox Left(Temp, Len(Temp) - 3)
End Sub
Thân!

Ta không nên tìm kiếm trong cả cột B, vì mỗi một i thì là sử dụng lại range này, vì vậy nên thu gọn range này lại, giống như cách tìm hàng cuối ở trên. Như vậy sẽ cải thiện hơn nữa về tốc độ.

Bác vẫn còn điều này nữa, hãy cố gắng tiết kiệm từng giây từng phút bác ạ. Nhiều giây, nhiều phút sẽ cho ta được nhiều thứ đấy.

Thân!
 
Cám ơn Mr.Hiếu
Đúng là cần phải đặt Name. Đúng là tốc độ rất quan trọng ; khi làm việc với lượng Data khổng lồ lúc đó mới thấy tác dụng của nó. Thanks !

Thân!
 
Web KT
Back
Top Bottom