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

Thảo luận trong 'Ứng dụng Excel' bắt đầu bởi adam_tran, 8 Tháng sáu 2006.

3,352 lượt xem

  1. adam_tran

    adam_tran Steel Partner

    Bài viết:
    1,373
    Đã được thích:
    32
    Nơi ở:
    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.
     
    #1
  2. QDuc

    QDuc Thành viên thân thiết

    Bài viết:
    254
    Đã được thích:
    18
    Nơi ở:
    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!
     
    #2
  3. adam_tran

    adam_tran Steel Partner

    Bài viết:
    1,373
    Đã được thích:
    32
    Nơi ở:
    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.
     
    #3
  4. hieu1563

    hieu1563 Thành viên sơ cấp

    Bài viết:
    123
    Đã được thích:
    0
    Nơi ở:
    Đang đăng ký !!
    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ì
     
    #4
  5. hieu1563

    hieu1563 Thành viên sơ cấp

    Bài viết:
    123
    Đã được thích:
    0
    Nơi ở:
    Đang đăng ký !!
    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!
     
    #5
  6. Đào Việt Cường

    Đào Việt Cường Moderator

    Bài viết:
    400
    Đã được thích:
    3
    Giới tính:
    Nam
    Nơi ở:
    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.
     
    #6

Chia sẻ trang này