Help - AdvancedFilter không work với name động

  • Thread starter adam_tran
  • Ngày gửi
adam_tran

adam_tran

Guitar inspiration
17/5/05
1,374
36
48
46
Goooogle
Khi sử dụng 1 Nam bình thường AF làm việc tốt, nhưng khi dùng 1 Dynamic name thì nó báo lỗi.
Thí dụ; Set Name Data: =Data!A4:1000 thì mã sau work tốt.

Set DataLoc = Sheets("Data").Range("Data
DataLoc.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _
("I1:I2"), CopyToRange:=Range("LocSoCT"), Unique:=False


Nhưng set Name là 1 Name động thì lại báo lỗi, trong Khi Name động vẫn làm việc tốt trong các công thức Vlookup, Index, Offset v...v
Thí dụ Name Data: =INDIRECT("Data!$B$5:"&ADDRESS(4+Data!$M$1;15))
mã sau lại báo lỗi ngay chỗ AF, màu xanh vẫn tốt, màu đỏ lỗi 1004:
Set DataLoc = Sheets("Data").Range("Data")
DataLoc.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _
("I1:I2"), CopyToRange:=Range("LocSoCT"), Unique:=False


Anh chị nào biết cách khắc phục xin chỉ giúp.
 
Khóa học Quản trị dòng tiền
QDuc

QDuc

Cao cấp
3/6/06
254
18
18
Biển khơi
Chưa báo lỗi, nhưng chưa động hoàn toàn!

Sub LocAdvance()
' Macro recorded 08/06/2006; Keyboard Shortcut: Ctrl+Shift+L
Application.Goto Reference:="CSDL"
Range("CSDL").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("Criteria"), CopyToRange:=Range("Extract"), Unique:=False
End Sub
' Name: "CSDL"
' Refers to: =OFFSET('S3'!$A$7,0,0,COUNTA('S3'!$A$8:$A$998),7)

Chưa động do là sau khi chạy (& không báo lỗi) tôi thêm vô CSDL vài Record nhưng nó không cho vô bảng kết quả khi chạy lần kế tiếp!
 
adam_tran

adam_tran

Guitar inspiration
17/5/05
1,374
36
48
46
Goooogle
Sao thế nhĩ, tôi chạy vẫn cứ lỗi :(

Rõ ràng name của tôi vẫn work bình thường. Hay là AF không chấp nhận 1 sổ biểu thức quá phức tạp trong Name, để tôi kiểm tra lại.
 
hieu1563

hieu1563

Guest
adam_tran nói:
Sao thế nhĩ, tôi chạy vẫn cứ lỗi :(

Rõ ràng name của tôi vẫn work bình thường. Hay là AF không chấp nhận 1 sổ biểu thức quá phức tạp trong Name, để tôi kiểm tra lại.

Có lẽ thế. Mình chưa thử theo đúng công thức của bạn nên không biết. Vì mình cũng thường sử dụng AF lọc theo các vùng động (= offset...) nhưng vẫn không sao cả. Nhưng mà bạn lại bị lỗi thì chỉ có cách là cho rằng AF không chấp nhận. hì hì
 
hieu1563

hieu1563

Guest
adam_tran nói:
Khi sử dụng 1 Nam bình thường AF làm việc tốt, nhưng khi dùng 1 Dynamic name thì nó báo lỗi.
Thí dụ; Set Name Data: =Data!A4:1000 thì mã sau work tốt.

Set DataLoc = Sheets("Data").Range("Data
DataLoc.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _
("I1:I2"), CopyToRange:=Range("LocSoCT"), Unique:=False


Nhưng set Name là 1 Name động thì lại báo lỗi, trong Khi Name động vẫn làm việc tốt trong các công thức Vlookup, Index, Offset v...v
Thí dụ Name Data: =INDIRECT("Data!$B$5:"&ADDRESS(4+Data!$M$1;15))
mã sau lại báo lỗi ngay chỗ AF, màu xanh vẫn tốt, màu đỏ lỗi 1004:
Set DataLoc = Sheets("Data").Range("Data")
DataLoc.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _
("I1:I2"), CopyToRange:=Range("LocSoCT"), Unique:=False


Anh chị nào biết cách khắc phục xin chỉ giúp.

Mình đã thử rồi, vẫn chạy tốt mà. Bạn xem lại đi, hay Office bị trục trăc ?. . .

Arraydata=OFFSET(PhatSinh!$A$2;0;0;PhatSinh!$A$1;14)

Dieukien1=OFFSET(Temp!$A$2;0;0;PhatSinh!$A$1;5)


Range("Arraydata").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
Range("DieuKien1"), CopyToRange:=Range("A12"), Unique:=False


Thân!
 
Đào Việt Cường

Đào Việt Cường

Moderator
22/11/05
400
4
18
Khánh Hòa
Name và Range trong VBA

Dear all,
--------

Vấn đề:
Các bạn thử kiểm tra theo cách này xem nhé:
Giả sử bạn có một trên Sheet1, ô A1 có giá trị là 2006, bạn đặt một Name tham chiếu đến ô A1 và đặt tên là LastYear, đoạn code sau đây (trên Module Sheet1) sẽ làm việc tốt với Name LastYear:

Trích:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rgLastYear As Range
Debug.Print Range("LastYear").Value
Set rgLastYear = Range("LastYear")
Debug.Print rgLastYear.Value
End Sub

Bây giờ bạn thay đổi lại Refers To của LastYear là:
=Year(ToDay())-1
đoạn code nêu trên sẽ không thực thi được, Run-time error '1004' báo cho bạn biết phương thức Range không tồn tại trong Worksheet hiện hành (Methor 'Range' of object '_Worksheet' failed)
(Xem thêm GiaiphapExcel.com)
Suy luận:
- Trong VBA, chúng ta có 2 đối tượng làm việc với một vùng tham chiếu: đối tượng Range và đối tượng Name, nhưng về bản chất và cách thức làm việc thì hai đối tượng này có những khác biệt rõ rệt: Đối tượng Range cần được khai báo trong phạm vi nào, đường dẫn đầy đủ:
<Workbook>.<Worksheet>.<Range>
Nếu không chỉ ra một cách tường minh, Excel sẽ áp dụng Range trong Workbook và Worksheet hiện tại (Module chứa mã lệch thực thi)
Tuy nhiên trong những trường hợp đơn giản (cũng có thể do các tài liệu hướng dẫn hay mã lệnh Macro tự động phát sinh) mà chúng ta có thói quen sử dụng Name như là một Range:
Dim DataLoc As Range
Set DataLoc = Sheets("Data").Range("Data")
thậm chí không cần chỉ ra phạm vi của Range (như trong thí dụ trên)
Việc sử dụng Name như là một Range sẽ có một vài hạn chế, trong đó có hạn chế về phạm vi của Range.
- Chúng ta cần phân biệt Name LastYear có tham chiếu Refer to:= Sheet1!$A$1 khác với cũng Name đó nhưng có RefersTo:= Year(Today())-1. Trong trường hợp với tham chiếu thứ 2 này, RefersTo là một công thức, nó không trỏ tới Sheet nào nghĩa là Range không xác định. Để làm việc với Name này chúng ta buộc phải khai báo và làm việc với nó bằng một biến Name thực thụ (chứ không phải Range):
Dim nmLastYear As Name
Set nmLastYear = Names("LastYear")
Giải quyết vấn đề:
- Refers To của Name là một String (có thể gọi là "RefersTo tĩnh"). Để truy vấn đến kết quả tham chiếu của Name dạng này, chúng ta sử dụng phương thức EVALUATE:
Debug.Print EVALUATE (nmLastYear.RefersTo)
Kết luận:
- Đối với các Name mà RefersTo của nó được định nghĩa là một công thức, chúng ta không thể áp dụng nó như là một Range mà cần khai báo chúng một biến dạng Name.
- Sử dụng phương thức EVALUATE để truy vấn đến kết quả của tham chiếu.
 

Xem nhiều

Webketoan Zalo OA