6

ワークブックを開くときに入力するコンボ ボックスがいくつかあります。データのソースはデータベースから取得されます。

次のコードでデータ検証を使用して、コンボ ボックスに入力します。

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

list は、データベース レコードセットから作成したカンマ区切りの文字列です。

これはすべてうまくいきます。後でブックを再度開いたときに問題が発生します。エラーが発生する

「Excel で判読できないコンテンツが見つかりました。このファイルのコンテンツを復元しますか」

はいと答えると、Excel は次のように表示します。

「Excel は機能を削除してファイルを修復できました」

また、一部のコンボ ボックスからのデータ検証がなくなりました

インターネット検索で、データ検証に使用している文字列が長すぎるのではないかと疑っていますか?

コンボボックスは動的であり、ユーザーの選択に応じてチョップおよび変更されるため、レコードセットの値を非表示のシートに追加し、データ検証ソースを非表示のシートの範囲に設定することはできません。ユーザー操作のさまざまな時点で作成した文字列にデータ検証を設定できるようにする必要があるだけです。

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

4

5 に答える 5

5

以前、いくつかの Excel プロジェクトで検証リストを操作したことがあります。検証を許可: リストに設定すると、データ ソースをワークブック レベルの名前付き範囲に設定できます。この例では、名前付き範囲「listrange」を定義しました。

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

その式の文字列が長すぎるというエラーが発生することはありません。

検証で参照されるすべての名前付き範囲を 1 つのワークシートに入れ、非表示にします。次に、コードでこれらの名前付き範囲を操作し、検証ドロップダウン メニューから使用できる値を更新します。

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

于 2013-09-23T19:36:21.160 に答える
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
于 2013-06-10T12:01:18.063 に答える
0

回避策があります。条件付き書式設定に使用する文字列を、使用する前にワークブックのどこかに保存してください。それらを使用するときは、文字列からではなく、保存した範囲を参照してください。条件付き書式設定の長い文字列は、ワークブックを閉じるときに問題のある条件書式設定を一掃する機能と、開くときにそれらを元に戻す別の機能を実行する原因であることを覚えておいてください

問題は解決し、それは治療に役立ちます:)

于 2014-07-05T07:08:38.980 に答える