Lỗi thuộc tính "List" trong Validation của Excel XP/2003

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

65,628 lượt xem

  1. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Vừa qua mình có phát hiện một lỗi rất nghiệm trọng của của Excel XP/2003.
    Chúng ta vẫn thường tạo một danh sách (dạng Combo) bằng Validation của Excel.
    Cách làm: vào menu Data->Validation, trong tab "Setting" chọn Allow là "List", mục Source bạn gán vào vùng chứa danh sách hay một tên (tạo trong Define name).
    Với Excel 2000 trở về trước thì vùng chứa danh sách có thể lấy ở một Workbook (tệp) khác, nhưng Excel XP/2003 thì không cho phép?

    Theo nhìn nhận của mình thì đây là lỗi của Excel khi MS nâng cấp phiên bản đã...
    Các bạn có thấy vậy không? Vậy làm thế nào để chữa lỗi này?
     
    #1
  2. mysterious_girl

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

    Bài viết:
    358
    Đã được thích:
    1
    Nơi ở:
    ...close to you...
    Em cũng đang dùng Excel XP/2003 và em cũng thấy như thế. Nhưng em ít dùng validation nên chưa biết khắc phục như thế nào?Mọi người cùng nghiên cứu nhé.
     
    #2
  3. adam_tran

    adam_tran Steel Partner

    Bài viết:
    1,373
    Đã được thích:
    32
    Nơi ở:
    Goooogle
    Excel 2002 vẫn cho phép nhưng Name chỉ active khi workbook được open, còn không thì chẳng thấy danh sách hiện lên khi click dấu tam giác ngược.
    Riêng tớ thì thấy chức năng ignore blank hơi lộn xộn...
     
    #3
  4. handung107

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

    Bài viết:
    576
    Đã được thích:
    13
    Nơi ở:
    VN
    Excel XP cũng tương tự như vậy, và các Excel version khác cũng thế mà Tuân ? Cách khắc phục thì ...chưa nghĩ ra
     
    #4
  5. Đào Việt Cường

    Đào Việt Cường Moderator

    Bài viết:
    400
    Đã được thích:
    2
    Giới tính:
    Nam
    Nơi ở:
    Khánh Hòa
    Hạn chế của MSE Validation!

    Dear all,
    -------
    Em tạm gọi chủ để này là như vậy, vì như các anh chị thấy: Khi chúng ta thiết lập nguồn là một danh sách từ sheet khác (không phải sheet hiện hành) thì MSE hoặc là không cho phép ta active sheet đó để ta chọn, hoặc là đưa ra thông báo rất cụ thể ("You may not use reference to other worksheet or workbooks for Data Validation Criteria").
    Để khắc phục hạn chế này em đành dùng mẹo là đặt name với tham chiếu là vùng địa chỉ mà ta muốn tham chiếu từ Workbook khác. Sau đó set (gán) lại source cho Validation bằng name này!
    Một hạn chế khác em gặp phải khi đang thực hiện set nguồn bằng một đoạn thủ tục VBA: lỗi xảy ra khi ta thiết lập nguồn dữ liệu đưa vào là một chuỗi gồm > 255 phần tử. Em tìm hiểu thì hoá ra nguồn này bị giới hạn chỉ cho phép 255 phần tử trực tiếp tạo thành danh sách(!).
    Thứ nữa, như anh chị và các bạn thấy, Validation chỉ cho ta đưa vào danh sách chỉ với 1 cột duy nhất - điều này giảm đi tính trực quan khi ta chọn một khoản mục trên danh sách.
    Em cũng chưa rõ lý ro tại sao Microsoft lại hạn chế như vậy. Nhưng từ các hạn chế đó em cho rằng đó là những hạn chế có chủ đích trong phạm vi ứng dụng của nó. Nếu đáp ứng được các yêu cầu trên thì máy sẽ xử lý rất chậm. Chúng ta chỉ áp dụng trong trường hợp đặc biệt để bắt các lỗi ràng buộc phức tạp, không nên lạm dụng quá tính năng này.
    Một vài góp ý!
     
    Last edited: 15 Tháng hai 2006
    #5
  6. hai2hai

    hai2hai VNUNI Makes a difference

    Bài viết:
    2,012
    Đã được thích:
    128
    Nơi ở:
    Hà nội
    Ah, bây giờ mới hiểu cái combo box xuất hiện trên 1 cell đó thì trong excel gọi là Validation :biggrin: . Mọi người đừng cười người ngoại đạo này nhé.

    Đến cả mấy cái Combo Box Stardard của Visual Basic nó cũng đâu cho phép support multi-columns và giới hạn của 1 Combo Box là số ~65,000 items (Tóm lại là max của Interger ấy). Vì thế mà mới có MS Form 2.0 DLL có support 256 columns (nhưng món fm20.dll này cũng có khá nhiều limits). Nói chung đã dùng trong VB thì phải tự kiếm lấy các activeXes bên ngoài thì mới có ứng dụng pro 1 tý được. Khổ nỗi, khi làm trong Excel, để xác định vị trí của 1 cell (tính từ góc trái trên màn hình) thì có vẻ hơi khó thì phải (nên dùng APIs). Khi đã xác định được ví trí của cell rồi thì thêm 1 cái button trong đó, bấm vào button đó thì call lên 1 cái form hay dropdown cái combo khác (của FM20.dll chẳng hạn). Cũng may, Access thì lại dùng các controls trong FM20.DLL nên cũng ko sao.

    Mọi người tiếp tục "ngâm cứu" giải pháp trong Excel vụ này đi nhé! :biggrin:
     
    #6
  7. Đào Việt Cường

    Đào Việt Cường Moderator

    Bài viết:
    400
    Đã được thích:
    2
    Giới tính:
    Nam
    Nơi ở:
    Khánh Hòa
    Anh 2 ơi,
    --------
    Theo em hiểu Validation trong MSE không phải là combo box!


    Lúc đầu khi mới làm việc với Validation cứ tưởng nó là một thuộc tính (property) của Cell không phải là một điều khiển (control) hay đối tượng (object) vì khi truy cập đến nó, chỉ cần "chấm" một cái:

    Nhưng "đằng sau" nó lại bao gồm nhiều thuộc tính và phương thức khác nữa thì có lẽ nó vừa là thuộc tính vừa là một đối tượng - một thực thể có hành động hẳn hoi!
    Việc ứng dụng đối tượng này thì khỏi phải nói, nó có rất nhiều ưu điểm cho người làm việc với MSE. Thiết nghĩ nếu bàn đến việc phải thiết kế, lập trình một đối tượng thay thế nó, em cho là không phù hợp với nội dung của chủ đề này.
     
    #7
  8. hai2hai

    hai2hai VNUNI Makes a difference

    Bài viết:
    2,012
    Đã được thích:
    128
    Nơi ở:
    Hà nội
    Validation là một method của Range object
    Nhưng nếu viết là Range(Cell1,[Cell2]).Validation.List thì lúc đó Validation lại là 1 object.

    Tóm lại là đang thấy mọi người nói nó có 1 cột, được list ra khi click vào 1 cell nên hiểu nó là 1 combobox thôi (bản chất thì combo là gồm có 3 window(s))). Nó là gì cũng được vì hai2hai này có làm Excel đâu.

    Trong phương thức (method) Validation của đối tượng Range, có thể nó làm 1 động tác: Show dropdown list (mà cái "list" của nó là các rows nằm trong khoảng từ Cell1 to [Cell2] (chắc thế :)).

    Cái này cũng chẳng khác gì cách gọi:
    + frmTest.ShowCombo()
    (frmTest = Range(Cell1,[Cell2]); ShowCombo = Validation)
    + frmTest.cboTest.List(...)

    --> Cái chính là đang gặp vấn đề thật sự về mấy cái dropdown đó của cell (chả biết có phải là validation hay ko, ko quan tâm) và tìm mãi mà chưa ra giải pháp. (Phải chạy trên nhiều office mới thấy lỗi). Tuy nhiên, tất cả những chỗ cần Lookup đó thì có thể Assign 1 phím nóng (giả sử F4) để call 1 form list danh sách các đối tượng lên (Gọi form đó là form lookup).

    Ở bài đó đâu có bàn việc thay thế, mà chỉ phân tích sâu, rộng thêm về mấy món liên quan của Microsoft thôi. Tại lúc nãy quên mất 1 câu: M$ chỉ làm ra các công cụ căn bản thôi, muốn "xịn" thì phải dùng đồ của 3rd parties. (Sorry, lại hơi đi quá đà).

    Thôi bỏ qua mấy đoạn trên đi, đoạn trên chỉ nói với windows programmers thôi. Sorry.

    Mọi người quay lại chủ đề nhé Validation gì đó nhá
     
    Last edited: 15 Tháng hai 2006
    #8
  9. Đào Việt Cường

    Đào Việt Cường Moderator

    Bài viết:
    400
    Đã được thích:
    2
    Giới tính:
    Nam
    Nơi ở:
    Khánh Hòa
    Dear all,
    --------
    Sở dĩ em đặt vấn đề Validation giới hạn 255 phần tử là nhân tiện nói về những hạn chế của MSE Validation.
    Yêu cầu đặt ra là:
    Em có danh hàng trăm mã hàng (>255) và danh sách này thay đổi khi em chọn một nhóm hàng. Nếu ta đặt Name cho để tạo nguồn cho Validation này sẽ không được vì Reference To của Name phải là một dãy liên tục (nếu lên tục thì sẽ bao gồm cả mã không cùng nhóm mất rồi!). Để có được danh sách này, em dùng vòng lặp chọn từng mặt hàng theo nhóm, "xâu" nó thành "chuỗi" rồi đưa vào Source của Validation.
    Và thế là... error!
    Em đã xử lý lỗi này bằng cách define một Name động mà Reference To là kết quả của Addvandce Filter theo nhóm hàng! Giải quyết này đã cải thiện đáng kể về tốc độ vì đã thay thế vòng duyệt chọn từng mã!
    Còn về vấn đề làm sao để có được danh sách nhiều cột, em nghĩ chắc là phải thay thế Validation bằng List box hoặc Combo box mới được.
    Đôi điều góp ý!
     
    Last edited: 15 Tháng hai 2006
    #9
  10. handung107

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

    Bài viết:
    576
    Đã được thích:
    13
    Nơi ở:
    VN
    Lạ nhỉ, Cường nói sao chứ, chị thấy DS Validation của chị có đến cả ngàn mặt hàng, và bình thường thôi, không có lỗi gì cả. Ứng dụng của Validation khá phong phú, nó không hiện được 2 cột, nhưng nếu biết tận dụng VBA và một số hàm thì cũng đem lại cho mình một số tiện lợi nào đó. Để hôm nào rảnh, chị soạn thêm ít bài về Validation. Topic "Hiểu thêm về Validation" hình như em chưa xem qua thì phải ???
     
    #10
  11. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Không phải thế.
    CSDL của một Cty mình làm việc có 676 khách hàng mình vẫn dung Validation không sao cả.

    Validation cho phép lập danh sách có số item (dòng)= 2^15-1 = 32 767

    Không hẳn vậy

    Có 2 kiểu chuỗi: Chuỗi động và Chuỗi cố định
    Chuỗi động cho phép 2^31=2 147 483 648 ký tự
    Chuỗi cố định cho phép 2^16=255 ký tự

    Vấn đề mình đang bàn ở đây là Validation không list danh sách từ một Workbook khác, Workbook này vẫn đang được mở đồng thời với Workbook tạo Validation.

    Chị Dung ạ, em thử trên Excel 2000 thì không bị lỗi (gán SourcrList=Name).
    Các bạn tiếp tục nghiên cứu nhé.
     
    #11
  12. Đào Việt Cường

    Đào Việt Cường Moderator

    Bài viết:
    400
    Đã được thích:
    2
    Giới tính:
    Nam
    Nơi ở:
    Khánh Hòa
    Dear all,
    --------
    Vâng, em đã nhầm ạ!
    Ý của em ở đây là, nếu nguồn dữ liệu không dùng tham chiếu mà lập trực tiếp bởi một chuỗi thì Source chỉ được 255 ký tự mà thôi. Nghĩa là Len(Source) <=255!
    Sở dĩ em gặp trường hợp này bởi vì khi em đã sử dụng vòng duyệt để gom các mã hàng vào 1 string. Ví dụ:
    Điều này em có thể suy ra được điều khiển RefEdit chỉ set được Value tối đa 255 ký tự phải không ạ?
     
    Last edited: 15 Tháng hai 2006
    #12
  13. handung107

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

    Bài viết:
    576
    Đã được thích:
    13
    Nơi ở:
    VN
    Tuân à, chị đang dùng Excel XP đây, và không bị lỗi Validation nếu Workbook có DS được mở đồng thời với Workbook làm việc. Em xem lại sao, DS Validation chỉ không hoạt động nếu Workbook có DS bị đóng thôi
     
    #13
  14. hai2hai

    hai2hai VNUNI Makes a difference

    Bài viết:
    2,012
    Đã được thích:
    128
    Nơi ở:
    Hà nội
    :biggrin: Đó là do em chọn Source kiểu đó thôi. Còn mọi người chọn Source kiểu khác. Vấn đề của em là dùng Source là String thì phải. Giống như rất nhiều người kêu là sao tôi gõ strSQL = "Long long string" trong IDE thì khi compiler chương trình dịch nó không cho chạy. :biggrin:

    Với lại vấn đề Tuân đưa ra ở đây lại là chuyện khác hẳn cơ. (Khi Source của Validation là 1 workbook khác thì vấn đề bị là: dropdown list lúc thì hiện ở office này nhưng lại hiện list ở office kia). Nếu viết phần mềm có tính thương mại thì lại phải chạy trên mọi môi trường của khách hàng. Thế nên mới phải quan tâm. (Chứ ko phải chuyện giới hạn số các items của dropdown list).

    Nói chung, resources cho dropdown list chuẩn của Microsoft là 64k (hay là 32k) gì đó rồi. Còn resources cho string variant là 2 bytes (255 chars)

    (Resources là tài nguyên mà Windows cấp cho một đối tượng mới được tạo trong hệ thống)

    Nói tóm lại, nếu Cường cứ nghĩ là "Source của Validation em nhập là: 1,2,3... thì tối đa có thể được 255 số (tức 254 separator) mà thôi!" thì ở những validation cho danh sách tài khoản, khách hàng, hàng hóa - vật tư, v.v... thì làm thế nào??? :biggrin: Vì thế anh mới bảo chưa giới thiệu thì làm sao biết được hết.

    Cũng file đó, chị thử trên Office 2003 nữa chị ạ.
     
    Last edited: 15 Tháng hai 2006
    #14
  15. adam_tran

    adam_tran Steel Partner

    Bài viết:
    1,373
    Đã được thích:
    32
    Nơi ở:
    Goooogle
    Theo em nghỉ office "Chùa" bị nhiều lỗi chẳng giải thích được. Chẳng hạn 1 số method của các activecotrol ở office 2002 thì cho phép, office 2003 (XP) thì không cho. Nó thậm chí không cho một số hàm thông dụng kiểu như:

    Dim Ngay
    Ngay = Date 'Báo lỗi chỗ này!
    Hay hàm Left, Right của VBA cũng không support, chẳng hiểu vì sao. Đem qua máy khác dùng vẫn okay!
     
    #15
  16. Đào Việt Cường

    Đào Việt Cường Moderator

    Bài viết:
    400
    Đã được thích:
    2
    Giới tính:
    Nam
    Nơi ở:
    Khánh Hòa
    Ơ,
    ---
    Cái lỗi này em vẫn thường gặp, đúng là lỗi liên quan đến version. Khi nhìn thấy cái màu đỏ này em liền mở Project Reference ra, bắt gặp ngay thư viện (gì gì đó, em không nhớ) đang MISSING, em gỡ ra thì nó trở lại bình thường.
    Anh Tuân thử sem liệu có trùng hợp không ạ!
    Nếu không đúng, theo em thì cứ định nghĩa thêm Name tham chiếu đến Workbook khác rồi dùng name đó làm nguồn, em có thấy sao đâu!
     
    #16
  17. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Đúng rồi chị ạ! Hiện nay chỉ duy nhất Office 2003 bị lỗi thôi.

    Ok! Cái lỗi này là do các bạn "nhúng" một vài control hay thư viện nào đó, máy khác mà không có những thư viện này là lỗi ngay và sửa lỗi như Cường đã nói. Lỗi này không phải Version của Office mà là máy chạy thiếu thư viện.

    Anh đã làm đủ cách rồi mà vẫn bị, mà chỉ bị với Office2003 mới đau chứ.
     
    #17
  18. handung107

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

    Bài viết:
    576
    Đã được thích:
    13
    Nơi ở:
    VN
    Muốn dùng Validation mà Source tham chiếu từ một Worksheet hay một Workbook khác đều phải đặt tên mà Cường. Nếu từ một Workbook khác, thì chúng ta phải đặt tên từ Workbook hiện hành chứ không phải từ Workbook có Source đâu nhé.
    Còn nếu đã thực hiện đúng mà vẫn bị lỗi thì chắc bản Excel của Tuân bị ...lỗi rồi, chứ chị sử dụng Excel XP thì vẫn thấy bình thường mà
     
    #18
  19. hai2hai

    hai2hai VNUNI Makes a difference

    Bài viết:
    2,012
    Đã được thích:
    128
    Nơi ở:
    Hà nội
    Chương trình A-Excel phải chạy trên mọi version của MS Office chị ạ. Vì nó là chương trình phục vụ cho rất nhiều khách hàng mà. (Chẳng nhẽ cứ đến khách hàng lại bắt cài lại Office XP trong khi máy người ta dùng bản mới hơn là Office 2003 à?). Tuân đã nói rồi, Office XP đâu có sao. :)

    Xin nói lại về chuyện bản Office "xịn" hay ko "xịn" nhé: Máy của tớ là có Office Lisence. Vì cty là golden parter của MS nên đĩa gốc do MS VN gửi --> ko phải bản đểu.

    Có lẽ là mọi người chưa thử hết thôi (vì chủ yếu là dùng trên một môi trường), trong khi đội "làm dâu trăm họ" lại phải làm trên mọi môi trường khác nhau.

    Tóm lại là: Lỗi không tương thích version của MS Office. Nếu chưa tìm được p*tch hay trả lời chính thức của MS thì sẽ phải tìm cách thay thế.

    Regards,
     
    Last edited: 15 Tháng hai 2006
    #19
  20. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Bác bạn ạ!
    Lỗi chỉ sảy ra khi thực hiện quy trình tạo List bằng Validation của Office2003.
    Nếu đã tạo từ Office version 2000/XP < 2003) sau đó chạy trên 2003 thì Ok. Nhưng không thể làm việc như vậy được.
     
    #20

Chia sẻ trang này