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

  • Thread starter Tuanktcdcn
  • Ngày gửi
T

Tuanktcdcn

Lão già ham vui
18/6/04
548
51
28
41
Hà Nội
www.bluesofts.net
#1
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?
 
M

mysterious_girl

Cao cấp
#2
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é.
 
adam_tran

adam_tran

Steel Partner
17/5/05
1,373
32
48
41
Goooogle
#3
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...
 
H

handung107

Thành viên thân thiết
28/8/04
576
13
0
VN
www.giaiphapexcel.com
#4
adam_tran nói:
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.
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
 
Đào Việt Cường

Đào Việt Cường

Moderator
22/11/05
400
3
18
Khánh Hòa
#5
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 ý!
 
Sửa lần cuối:
hai2hai

hai2hai

VNUNI Makes a difference
29/4/04
2,012
125
63
44
Hà nội
vnuni.net
#6
Đào Việt Cường nói:
Dear all,
-------
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.
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é.

Đào Việt Cường nói:
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 ý!
Đế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:
 
Đào Việt Cường

Đào Việt Cường

Moderator
22/11/05
400
3
18
Khánh Hòa
#7
hai2hai 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
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:
Range(Cell1,[Cell2]).Validation

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.
 
hai2hai

hai2hai

VNUNI Makes a difference
29/4/04
2,012
125
63
44
Hà nội
vnuni.net
#8
Range(Cell1,[Cell2]).Validation
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(...)

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.
--> 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á
 
Sửa lần cuối:
Đào Việt Cường

Đào Việt Cường

Moderator
22/11/05
400
3
18
Khánh Hòa
#9
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 ý!
 
Sửa lần cuối:
H

handung107

Thành viên thân thiết
28/8/04
576
13
0
VN
www.giaiphapexcel.com
#10
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 ???
 
T

Tuanktcdcn

Lão già ham vui
18/6/04
548
51
28
41
Hà Nội
www.bluesofts.net
#11
Đào Việt Cường nói:
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(!).
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

Đào Việt Cường nói:
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ử
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é.
 
Đào Việt Cường

Đào Việt Cường

Moderator
22/11/05
400
3
18
Khánh Hòa
#12
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ụ:
For i= 1 to rgeMahang.Rows.Count
if rgeMahang.Cells(i,3)= cbbNhomhang then
strMahang = strMahang & ";" & rgeMahang.Cells(i)
End if
Next
ActiveCell.Validation.Add xlValidateList ,,,strMahang
Đ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 ạ?
 
Sửa lần cuối:
H

handung107

Thành viên thân thiết
28/8/04
576
13
0
VN
www.giaiphapexcel.com
#13
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
 
hai2hai

hai2hai

VNUNI Makes a difference
29/4/04
2,012
125
63
44
Hà nội
vnuni.net
#14
: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.

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
Cũng file đó, chị thử trên Office 2003 nữa chị ạ.
 
Sửa lần cuối:
adam_tran

adam_tran

Steel Partner
17/5/05
1,373
32
48
41
Goooogle
#15
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!
 
Đào Việt Cường

Đào Việt Cường

Moderator
22/11/05
400
3
18
Khánh Hòa
#16
Ơ,
---
adam_tran nói:
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!
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!
 
T

Tuanktcdcn

Lão già ham vui
18/6/04
548
51
28
41
Hà Nội
www.bluesofts.net
#17
handung107 nói:
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
Đúng rồi chị ạ! Hiện nay chỉ duy nhất Office 2003 bị lỗi thôi.

Đào Việt Cường nói:
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.
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.

Đào Việt Cường nói:
Anh Tuân thử xem 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!
Anh đã làm đủ cách rồi mà vẫn bị, mà chỉ bị với Office2003 mới đau chứ.
 
H

handung107

Thành viên thân thiết
28/8/04
576
13
0
VN
www.giaiphapexcel.com
#18
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à
 
hai2hai

hai2hai

VNUNI Makes a difference
29/4/04
2,012
125
63
44
Hà nội
vnuni.net
#19
handung107 nói:
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à
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,
 
Sửa lần cuối:
T

Tuanktcdcn

Lão già ham vui
18/6/04
548
51
28
41
Hà Nội
www.bluesofts.net
#20
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.
 

Thành viên trực tuyến

  • daongocnam0603
  • HongLam18



Xem nhiều