2013-06-10 21 views
6

Tôi có một số hộp tổ hợp mà tôi điền vào khi mở sổ làm việc - nguồn dữ liệu đến từ cơ sở dữ liệu.Excel tìm thấy nội dung không đọc được - Xác thực dữ liệu

tôi cư hộp combo của tôi sử dụng xác nhận dữ liệu với đoạn mã sau: -

With Selection.Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=list 
    .IgnoreBlank = False 
    .InCellDropdown = True 
    .ShowInput = True 
    .ShowError = True 
    End With 

nơi danh sách là một chuỗi dấu phẩy tách ra mà tôi đã xây dựng từ recordset cơ sở dữ liệu.

Tất cả đều hoạt động tốt. Vấn đề nảy sinh khi tôi mở lại sổ làm việc sau này. Tôi nhận được một lỗi

"Excel tìm thấy nội dung không đọc được. Bạn có muốn khôi phục lại nội dung của tập tin này"

Bạn hãy chọn Yes và Excel sau đó cung cấp cho bạn

"Excel đã có thể sửa chữa các tập tin bằng cách loại bỏ các tính năng"

Và Validation dữ liệu từ một số hộp Combo đã biến mất

tôi nghi ngờ từ một số internet tìm kiếm rằng chuỗi tôi đang sử dụng cho Validation dữ liệu của tôi là quá dài? Nó không phải là một tùy chọn để tôi thêm giá trị recordset vào một trang tính ẩn và đặt nguồn Xác thực Dữ liệu thành một phạm vi trên trang tính ẩn vì các hộp tổ hợp là động và cắt và thay đổi tùy thuộc vào lựa chọn của người dùng. Tôi thực sự chỉ cần có thể đặt Xác thực Dữ liệu cho chuỗi của tôi mà tôi đã tạo ở các điểm khác nhau trong tương tác của người dùng.

Nếu trường hợp chuỗi quá dài, bạn có thể thêm vào Xác thực dữ liệu hoặc có mẹo khác mà tôi có thể sử dụng để khắc phục sự cố này không?

+2

chuỗi được giới hạn trong 255 ký tự. không có ngoại lệ hoặc thủ thuật - nếu bạn cần lâu hơn bạn _have_ để sử dụng dải ô – JosieP

+1

Cảm ơn Josie. Thú vị là nó không lỗi tại thời điểm thiết lập các giá trị. Chỉ khi bạn mở nó lần sau. Hành vi kỳ lạ – David

+0

@JosieP là câu trả lời đúng cho điều này, cảm ơn –

Trả lời

1

Dường như bạn đúng với độ dài chuỗi là Validation formula1 parameter. Đề xuất của tôi cho bạn như sau (thông tin bổ sung được đặt làm ý kiến ​​trong mã):

'Split your list into array, or if data are Array before you _ 
create List variable you could combine some of earlier steps _ 
of your code 

    List = Split(List, ",") 
'paste your list into hidden sheet as of A1 direction bottom, _ 
we need to transpose our Array to do so 
    Sheets("hidden").Range("a1").Resize(UBound(List) + 1, 1) = Application.Transpose(List) 

With Selection.Validation 
    .Delete 
    'here we need to change definition of formula 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, _ 
    Formula1:="=Hidden!A1:A" & UBound(List) + 1 
    .IgnoreBlank = False 
    .InCellDropdown = True 
    .ShowInput = True 
    .ShowError = True 
    End With 
+0

Cảm ơn đề xuất của bạn. Tôi thích sử dụng phép gán phạm vi động. Tuy nhiên tôi có combo hiển thị một tập hợp con của tất cả các giá trị có thể của họ dựa trên các lựa chọn kết hợp trước đó. Điều này có nghĩa là tôi sẽ cần xác định phạm vi cho từng tập hợp con dữ liệu dựa trên combo gốc. Tôi có thể phải xem xét các combo Active X như một sự thay thế – David

5

Tôi đã thao tác trước khi vào một số dự án Excel. Khi bạn đặt xác thực thành Cho phép: Danh sách, bạn có thể đặt Nguồn dữ liệu của mình thành phạm vi được đặt tên cấp sổ làm việc. Trong ví dụ này, tôi đã xác định một dải ô được đặt tên là "listrange":

With Selection.Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
     xlBetween, Formula1:="=listrange" 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .ShowInput = True 
    .ShowError = True 
End With 

Bạn sẽ không bao giờ gặp lỗi đối với chuỗi công thức quá dài.

Tôi đặt tất cả các phạm vi được xác nhận tham chiếu có tên trong một trang tính và làm cho nó bị ẩn. Sau đó, mã của tôi thao túng các dải ô được đặt tên, lần lượt cập nhật các giá trị có sẵn từ các trình đơn thả xuống xác thực. Có thể khó cập nhật động kích thước của các dải ô được đặt tên trong khi chúng đang được cập nhật, nhưng nó không quá khó với VBA, đặc biệt là nếu bạn không trả về bộ từ cơ sở dữ liệu, nơi bạn có thể nhận được số lượng bản ghi . Cách khác là đi theo tuyến điều khiển ActiveX, nhưng tôi thích giao diện thuần túy, tự nhiên của các trình đơn thả xuống xác thực dữ liệu.

1

Chỉ cần chạy vào vấn đề này (giới hạn về độ dài công thức xác thực dữ liệu khi mở sổ làm việc), và như OP sẽ không muốn đi với phạm vi phụ trợ.

Giải pháp thay thế của tôi là xóa các xác thực trong trình xử lý Workbook_BeforeSave.

Trường hợp sử dụng của tôi là luôn làm mới dữ liệu từ các nguồn bên ngoài, do đó, đây là tùy chọn khả thi để luôn xóa tất cả dữ liệu đã nhập và xác thực trước khi lưu sổ làm việc.

0

có một cách khác, lưu các chuỗi bạn sử dụng để định dạng có điều kiện ở đâu đó trong sổ làm việc trước khi sử dụng. khi bạn sử dụng chúng, hãy tham chiếu đến phạm vi mà bạn đã lưu chúng chứ không phải từ các chuỗi. Ghi chờ đợi chuỗi trong dạng có điều kiện là những gì gây ra nó làm một chức năng mà khi đóng workbook làm mờ nhạt những định dạng điều kiện có vấn đề và chức năng khác mà khi khai mạc đặt chúng trở lại trên

Giải quyết vấn đề và nó hoạt động một điều trị :)

2

Tôi đã giải quyết vấn đề này bằng cách xóa xác thực của tôi trong sự kiện WorkbookBeforeSave. Tuy nhiên, tôi đang sử dụng C#