Advancedfilter Trong Vb

Liên hệ QC

ALOAN

Thành viên chính thức
Tham gia
6/11/07
Bài viết
88
Được thích
28
Nghề nghiệp
PURCHASING
Mình coù baûng toàn kho haøng ngaøy nhö file ñính keømMoãi ngaøy mình muoán khi soá lieäu "IN" hay "Out" thay ñoåi treân baûng "Stock" thì mình ñeàu nhanh choùng caäp nhaät ñöôïc nhöõng "part no" coù "Toàn kho"(c oät cuoái)=0---Nhö Baûng "LOC" beân caïnh.Nhôø caùc baïn giuùp mình vieát VB cuûa advancedfilter vôùi.Mình thích VB laém, nhöng chöa hieåu ñöôïc. Caùc baïn vui loøng chæ mình hoïc noù voùi nha. Mình chæ hoïc Pascal thoâi , chöa heà bieát gì veà VB caû (But I like)@$@!^%

Nhờ các bạn chỉ giúp mình các viết VB dựa trên Advancedfilter để copy dữ liệu từ sheet "Ton kho" sanh sheet "Loc", với điều kiện giá trị tồn kho bằng 0 với.
Tuy dễ với các bạn nhưng khó với mình mà.Híc
 

File đính kèm

  • ADVANCEDFILTER.xls
    39 KB · Đọc: 63
Bạn thử vào trang này xem có giúp được gì không nhé.
 
Nhờ các bạn chỉ giúp mình các viết VB dựa trên Advancedfilter để copy dữ liệu từ sheet "Ton kho" sanh sheet "Loc", với điều kiện giá trị tồn kho bằng 0 với.
Tuy dễ với các bạn nhưng khó với mình mà.Híc

Oh, file gửi kèm có được đâu - đã đặt pw hi iiiiiiiii
chắc là ý bạn trên VBA chứ đúng k? (trên VB là khác nhé)
Cách tốt nhất xem VBA thực hiện thế nào -> bạn hãy ghi một macro lại các thao tác Advanced fillter -> xem nó là bạn hỉu ngay VBA làm thế nào
Chúc thành công
.
 
Chào bạn Tigertiger, mình kiểm tra lại file rồi. Xin lỗi mọi người nha. Mình thấy mọi người viết VB(VBA) hay quá.
Bạn nói đúng ý mình rồi đó, mình muốn biết Advanced fillter hoạt dộng như thế nào trên VB(VBA). Bạn có cách nào chỉ mình với. Nếu được thì cho mình nhiều nhiều VD minh họa nhé. Hì.
Nếu file attached vẫn không mở được thì nhắn mình làm file khác nha.
Thanks
 

File đính kèm

  • ADVANCEDFILTER.xls
    39 KB · Đọc: 42
Bài này hình như có nhiều chổ sai... Advanced Filter, loc theo điều kiện nào đó thì đúng rồi.. Đặt sự kiện WorkSheet_Change trong sheet LOC cũng đúng.. tuy nhiên theo tôi nghĩ chỉ khi nào bạn thay đỗi điều kiện thì code mới chạy chứ... chã lẽ gõ lằng nhằng gì đó nó cũng chạy sao?
Sửa lại 1 tí nhé:
PHP:
Private Sub WorkSheet_Change(ByVal Target As Range)
If Not Intersect(Range("LOC!G3"), Target) Is Nothing Then
Sheets("STOCK").Range("A2:P1000").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("G2:G3"), CopyToRange:=Range("A4:P4"), Unique:=False
End If
End Sub
Chú ý câu lệnh:
If Not Intersect(Range("LOC!G3"), Target) Is Nothing Then
nghĩa là chỉ khi bạn thay đỗi trong cell G3 thì macro mới chạy!
Chú ý thêm 1 chuyện quan trọng nữa là tiêu đề của điều kiện trong sheet LOC phải trùng khớp với tiêu đề trong sheet STOCK (nếu ko trùng lấy gì mà tìm đây?)
Bạn xem file đính kèm... Có thể sửa lại tùy ý bạn!
ANH TUẤN
 

File đính kèm

  • ADVANCEDFILTER_TUAN01.zip
    11.2 KB · Đọc: 97
Lần chỉnh sửa cuối:
Ok, đã help ALOAN lọc nhanh thích bổ sung nhiều đ/k lun cũng được

Trong file gửi kèm có hướng dẫn chi tiết trong file lun rùi , ALOAN download về xem có hợp lý k nhé

chúc thành công


@atuan... a có vẻ thích Workbook_change nhỉ -> ko nên sử dụng nhiều sub bắt sự kiện này a ah, a xem file của tigertiger -> góp ý có nhiều cái hay hay đó nhé
.

0:03AM: Đổi file gửi kèm - CT chạy nhanh hơn
 

File đính kèm

  • ADVANCEDFILTER_tigertiger.rar
    14 KB · Đọc: 105
Lần chỉnh sửa cuối:
Chào bạn Tigertiger
Mình chỉ muốn trích lọc 1 số cột thôi thì code của bạn phải đổi lại như thế nào.
Trong bài có 1 số phần mình không hiểu lắm. Bạn giải thích thêm dùm mình là nó có ý nghĩa gì được không
S02.Select: Range("A1").Select Application.ScreenUpdating = True
va
S01.Select: Range("Q7").Select Application.ScreenUpdating = True
Cả phần này nữa: Unique:=False có nghĩa gì
Làm cách nào bạn có thể gán sheet "stock" thành S01 vậy!!!!


Cảm ơn bạn nhiều nhiều nha.
 
@atuan... a có vẻ thích Workbook_change nhỉ -> ko nên sử dụng nhiều sub bắt sự kiện này a ah, a xem file của tigertiger -> góp ý có nhiều cái hay hay đó nhé
Uh... Cái gì tự động của có mặc lợi và hại... Nhanh gọn nhưng có khi ta ko thể khống chế dc tiến trình.. và có thể làm bãng tính chậm đi... Tuy nhiên ở đây tôi có khống chế vùng làm việc, nên chắc là ko có vấn đề
 
Select Application.ScreenUpdating = True
Nếu bạn ko có cái này cũng ko sao, nhưng sẽ thấy màn hình nó giật giật.. bạn thử nghiệm sẽ thấy..
Nếu = True thì là lọc dử liệu duy nhất (ko trùng).. bạn dịch tiếng Anh cũng hiểu mà... còn như file của bạn ko phải là lọc duy nhất nên Unique:=False là đúng rồi... đoạn code này có dc là do quá trình record macro.. bạn có thể bỏ đi cũng ko có vấn đề gì
 
Cảm ơn Bác Tuấn đã chỉ bảo thêm,
Trong nhưng lần trước Bác có nói cho em nghe về tác dụng của "Select Application.ScreenUpdating = True ".
Nhưng trong bài này em không hiểu tại sao lại chọn:
Ô "A1" trong sheet S02 --S02.Select: Range("A1")
Và ô "Q7" trong sheet S01--- S01.Select: Range("Q7").
 
Mình chỉ muốn trích lọc 1 số cột thôi thì code của bạn phải đổi lại như thế nào

oh bỏ đi thì dễ mà - bạn thêm code xóa các cột sau khi đã lọc sang sheet LOC (bạn có thể ghi 1 macro tự động rồi tùy biến thành code của mình bổ sung vào CT)

S02.Select: Range("A1").Select
là lựa chọn ô A1 của Sheet S02 -> là sheet lọc -> . vì khi chạy Ct ở sheet stock -> chạy sau chuyển sang để bật sheet LOC lên xem KQ

Application.ScreenUpdating = True
sao bạn ko trích ra trước đấy đầu CT có Application.ScreenUpdating = False
chạy sau thì phải chuyển trả no về true để excel update
lại màn hình bình thường
Làm cách nào bạn có thể gán sheet "stock" thành S01 vậy!!!!
Oh, trong VBE bạn nhìn sang bên trái (project explorer) bạn chỉ cần bấm chọn sheet stock rồi bấm F4 đổi tên đối tượng (name) ở ngay dòng đầu thành tên mong muốn ví dụ S02 (mặc định là sheet2) như thế từ nay ta viết CT dùng tên này S02 thay thế cho sheet - như thế thuận tiện ko lo ng sd đổi tên STOCK thành tên khác.

S01.Select: Range("Q7"):Select Application.ScreenUpdating = True
có dấu ":" đó (màu đỏ), đây cũng là chọn Ô Q7 - đây là lệnh nằm Ct xóa giúp việc sau khi xóa DL ở sheet LOC thì phải trở về ngay dưới nút xóa (thuộc sheet STOCK - S01) mà ;; Select Application.ScreenUpdating = True thì giải thích ở trên rồi

ALOAN đã viết:
Mình chỉ muốn trích lọc 1 số cột thôi thì code của bạn phải đổi lại như thế nào

Thêm chức năng, filter 1 số cột thôi

ALOAN down lại nhé - trong file gửi kèm
 

File đính kèm

  • ADVANCEDFILTER_tigertiger.rar
    13.8 KB · Đọc: 65
Advancedfilter Trong Vb Trả Lời Ðề Tài

trong file tigertiger có code như sau:Set RgnDk = Range("R2", Range(Range("R2").End(xlToRight).Address).End(xlDown))Nhưng khi mình thay:Set RgnDk = Range("R2", Range("R2").End(xlToRight).End(xlDown))Thì vùng điều kiện lọc vẫn chạy tốt.Giải thích thêm dùm mình với!!! HícNếu có thể thay công thức trên bằng OFFSET được không?
 

File đính kèm

  • PIG.GIF
    PIG.GIF
    13.8 KB · Đọc: 49
Lần chỉnh sửa cuối:
Ok, thế là được rồi

ALOAN đã viết:
trong file tigertiger có code như sau:Set RgnDk = Range("R2", Range(Range("R2").End(xlToRight).Address).End(xlDown))Nhưng khi mình thay:Set RgnDk = Range("R2", Range("R2").End(xlToRight).End(xlDown))Thì vùng điều kiện lọc vẫn chạy tốt.Giải thích thêm dùm mình với!!!
Cũng được bạn ah, vì sử dụng phương thức End để tìm vùng DL liên tục bắt đầu từ R2 theo hướng sang phải rồi xuống dưới (có thể tigertiger làm vội hic)

ALOAN đã viết:
HícNếu có thể thay công thức trên bằng OFFSET được không?
Không nên dùng Offset vì: Dùng hàm phương thức offset thì bạn phải biết số hàng, số cột (để tìm số hàng số cột thì lại phải dùng phương thức End - hic iii lại quay về rui)
 
Lần chỉnh sửa cuối:
Code của mình như sau nhưng khi chạy lại báo lổi 1004
"The extract range has a missing or illegal field name"
Mã:
Option Explicit
 
Sub LOCTKHO()
'
'  
    
    Call Xoa
    
    Dim RgnAd As Range, RgnDk As Range, RgnCp As Range, Rgn1 As Range
    
    
    Sheet1.Select
    If Range("W2").Value = "" Then
    Set RgnDk = Range("V2", Range("V2").End(xlDown))
    Else: Set RgnDk = Range("V2", Range(Range("V2").End(xlToRight).Address).End(xlDown)):   End If
    
    Set RgnDk = Application.InputBox("Chon vung D/k loc", "Chon vung", RgnDk.Address, Type:=8)
    Application.ScreenUpdating = False
    Set RgnAd = Range("A2", Range(Range("A2").End(xlToRight).Address).End(xlDown))
    Set RgnCp = Sheet2.Range("A2")
    RgnAd.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=RgnDk, CopyToRange:=RgnCp, Unique:=False
    
    Sheet2.Select
    Range("B2", Range("J2").End(xlDown)).Select: Selection.Delete Shift:=xlToLeft
    
    Range("A1").Select
    Application.ScreenUpdating = True
        
End Sub

Sub Xoa()
    Application.ScreenUpdating = False
    Dim Rgn As Range
    Sheet2.Select:
    Set Rgn = Range("A2", Range(Range("A2").End(xlToRight).Address).End(xlDown))
    Rgn.Clear
    Sheet1.Select: Range("Q7").Select
    Application.ScreenUpdating = True
End Sub
Mọi người xem và chỉ giúp mình với!!!!!!!!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Oh, tigertiger vừa nhìn lại code
thì chắc thông báo này
The extract range has a missing or illegal field name
là do vùng đ/k chọn để filter bạn không đúng - có thể chọn vào vùng trắng mất rùi

Tuy vậy đó là phán đoán -> tốt nhất bạn upload file lỗi đó lên đây thì mới sửa được
bye
 
Em gởi file lên rồi.
Các bác xem dùm em nha!!
 

File đính kèm

  • STOCK SEIWA ZERO.rar
    616.6 KB · Đọc: 76
oh, đó là do lỗi đơn giản: hiện vùng N2:T5 thuộc sheet2 có dữ liệu -> CT ko thể copy vùng đã lọc Advance Filter đến -> sửa bằng cách xóa các Dl này (xóa dòng Dl từ dòng 1:5 của sheet2 là được) trước khi thực hiện CT

Chúc thành công
 
Bác tigertiger ơi!!!
Phần Bác viết trên thì hay rồi, nhưng bác có thể thay các vùng điều kiện, vùng dữ liệu thành vùng động được không?
Cứ mỗi lần chèn dòng Phía trên vùng dữ liệu lại phải thay đổi lại công thức thì phiền lắm.Híc
 
ALOAN đã viết:
Bác tigertiger ơi!!!
Phần Bác viết trên thì hay rồi, nhưng bác có thể thay các vùng điều kiện, vùng dữ liệu thành vùng động được không?
Cứ mỗi lần chèn dòng Phía trên vùng dữ liệu lại phải thay đổi lại công thức thì phiền lắm.Híc
Vùng DL "Động" có nghĩa là sao? có phải là khi chạy DL thì ta mới chọn Vùng DL đúng ko???

Nếu đúng thế thì bạn dùng, VD chọn cho vùng đ/k
PHP:
Set RgnDk = Application.InputBox("Chon vung D/k loc", "Chon vung", Type:=8)
Làm tương tự cho vùng DL

ALOAN tự sửa xem sao?

Có gì mắc hỏi tiếp
 
Chẳng hạn trong code dưới:
Set RgnAd = Range("A2", Range(Range("A2").End(xlToRight).Address).End(xlDown))
Nếu em chèn 1 dòng phía trên cùng thì vùng dữ liệu lúc này sẻ bắt đầu từ A3 (Ko phải A2 nửa). Vậy ta phải vào code chỉnh A2-->A3.
Bác có cách nào giúp em khi chèn thêm như vậy vùng dữ liệu vẫn tự hiểu mà không cần phải chỉnh sửa!!!!!
 
Web KT
Back
Top Bottom