2013-06-10 7 views
6

私はワークブックを開いたときに入力するコンボボックスをいくつか持っています。データのソースはデータベースからのものです。Excelで判読不能なコンテンツが見つかりました - データの検証

私は次のコードでデータ検証を使用して、私のコンボボックスを移入: -

リストは、私は、データベースのレコードから築いてきたカンマ区切りの文字列である
With Selection.Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=list 
    .IgnoreBlank = False 
    .InCellDropdown = True 
    .ShowInput = True 
    .ShowError = True 
    End With 

これはすべて問題なく動作します。この問題は、後でワークブックを開いたときに発生します。私は、「Excelが読めないコンテンツを発見した。あなたは、このファイルの内容を復元しますか」というエラーに

を取得

をあなたがはいとExcelがその後、Excelがして、ファイルを修復することができました」

あなたに

を与えると言います削除機能」

とコンボボックスの一部からのデータの検証は、私は私のデータ検証のために私が使用している文字列が長すぎることを探して、いくつかのインターネットから疑っ

を行っていますか?

レコードセットの値を隠しシートに追加し、コンボボックスが動的であり、ユーザーの選択に応じて変更されるため、データ検証ソースを隠しシートの範囲に設定することはできません。私は実際には、私はユーザーの相互作用の様々な時点で構築している私の文字列にデータ検証を設定できるようにする必要があります。

文字列が長すぎる場合は、データ検証に追加することができますか、この問題を回避するために使用できる別のトリックですか?

+2

文字列は255文字に制限されています。例外やトリックはありません。長い時間が必要な場合は範囲​​を使用する必要があります – JosieP

+1

ありがとうございました。面白いことに、怒りの設定時には誤りではありません。あなたが次回にそれを開くために行くときだけ。奇妙な振る舞い – David

+0

@JosiePはこれに正解です。ありがとう –

答えて

1

文字列の長さがValidation formula1 parameterであると思われます。

'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

あなたの提案をありがとう。私はダイナミックレンジの割り当てが好きです。しかし私は以前のコンボの選択肢に基づいて可能なすべての価値のサブセットを表示するコンボを持っています。つまり、親コンボに基づいてデータの各サブセットの範囲を定義する必要があります。私は潜在的にActive Xのコンボを代替として見なければならないかもしれない – David

5

私はExcelのプロジェクトのいくつかで前に検証リストを操作しました:(追加情報は、コード内のコメントとして配置されている)、次のようにあなたのための私の提案です。検証を[許可:リスト]に設定すると、データソースをワークブックレベルの名前付き範囲に設定できます。

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

あなたは、式文字列が長すぎるためにエラーが出ることは決してないだろう。この例では、私が名前付き範囲「listrange」を定義しました。

すべての検証参照名前付き範囲を1つのワークシートに置き、非表示にします。次に、私のコードはそれらの名前付き範囲を操作し、次に有効化ドロップダウンメニューから利用可能な値を更新します。

名前付き範囲のサイズが更新されている間に動的に更新するのは難しいかもしれませんが、特にレコード数を取得できるデータベースからセットを返す場合は特にそうではありません。 。別の方法は、ActiveXコントロールルートを使用することですが、データ検証ドロップダウンのクリーンでネイティブなルック&フィールが気に入っています。

1

この問題(ワークブックの開始時にデータ検証式の長さに制限があります)に突き当たり、OPのように補助範囲を使用したくありません。

私の回避策は、Workbook_BeforeSaveハンドラの検証を削除することです。

私は、外部ソースから常にデータをリフレッシュするので、ブックを保存する前に、インポートされたすべてのデータと検証を常に削除することができます。

0

あなたの条件付き書式設定に使用する文字列をブック内のどこかに保存してから使用してください。それらを使用するときは、それらを文字列ではなく保存した範囲に参照してください。それは開口部が

に戻ってそれらを置くと問題が解消し、それが御馳走を動作することを、ブックを閉じるときは、フォーマットに問題の条件を一掃することを機能と他の機能を行う 原因です:)

条件付き書式でlong型の文字列を覚えておいてください
2

私はこの問題をWorkbookBeforeSaveイベントで検証を削除して解決しました。しかし、私はC#を使用しています

関連する問題