VBAを使用してExcelシートに検証リストを追加する際の問題
-
13-09-2019 - |
質問
データの動的な結果セットがロードされた Excel シートがあります。すべてのデータがロードされたら、各行の最後に YES/NO ドロップダウンを追加する必要があります。結果セットのサイズが事前にわからないため、これを動的に行う必要があります。次のコードは、「アプリケーション定義またはオブジェクト定義のエラー」をスローします。
Dim firstRow As Integer
Dim lastRow As Integer
Dim I As Integer
Dim VOptions As String
VOptions = "1. Yes, 2. No"
firstRow = GetResultRowStart.row + 1
lastRow = GetResultRowStart.End(xlDown).row
For I = firstRow To lastRow
Range("AO" & firstRow & ":AO" & lastRow).Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=VOptions
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = "Options"
.ErrorTitle = ""
.InputMessage = "Click yes or no"
.errorMessage = ""
.ShowInput = True
.ShowError = True
End With
Next I
GetResultRowStart メソッドを使用すると、シートに結果データが入力される開始行が得られます。コードの他の部分でもこのメソッドを使用しましたが、完全に機能します。メッセージ ボックスを使用してデバッグすると、Range(..).select ステートメントでエラーがスローされることが示唆されました。
このエラーの原因について何かアイデアがあれば。
解決
この1上の最終的な考えます:
falseに、ブック内のすべてのボタンのSetFocusOnClickプロパティを設定する(少なくとも今のところ)のトリックを行っているようです。 これは必須の条件である場合しかし、それは真として設定された値と全く働いていないはずです。しかし、それは時々やりました。 しかし、これは私が見つけた信頼できるソリューションです。
他のヒント
私はここに私の内側スポルスキチャンネルにしてみましょう。
あなたはActiveSheet
上の範囲にない言及している場合は、は、を完全にはの参照を修飾する必要があります。
次のような作業をする必要があります:
ActiveWorkbook.Sheets("mysheet").Range("AO" & firstRow & ":AO" & lastRow).Select
私が使用した溶液はxx.validationで前のワークシートの保護を解除してから、後であれば保護することでした。 [私はExcel 2000ではこれを行うには持っていなかったと私は100%を言うことはできないものの、おそらくサービスパックが追加されましたまで、私は、Excel 2003でそれを行う必要はありませんでしたと思います。
私も同じ問題に直面し、「オートメーションエラー」。私がやったことは私が検証リストを置くつもりだったとエラーがちょうど消えたシートをアクティブにします。
私はExcelで非常によく似た問題を経験してきました。私はすぐに窓でそれを実行したときに、プログラムの検証ドロップダウンリストを設定するコードがうまく働いたが、ワークシート上のボタンから呼び出されたときに動作しませんでした。私は今ボタンがフォーカスを持っていたからだと気付きました、と選択するか、検証を設定する前に、コード内のシートまたはセルをアクティブ化しようとしているのない量は、この問題を解決するように見えません。しかし、私は、デフォルトでTrueに設定されているエクセル、中ボタンの「TakefocusOnClick」プロパティがあり実現してきました。これをFalseに設定することで、ボタンがフォーカスを取得したことがない、とプレストちょっと、今の検証を設定するには、私のコードは正常に動作します。
これは、すべての人の検証問題への答えではないかもしれませんが、私はちょうど上記の恩恵を受けることができる誰かがあるかもしれません願っています。
乾杯ます。
これは、「オブジェクト 'Validation' のメソッド 'Add' が失敗しました」エラーの一種です。考えられる原因とその解決方法は次のとおりです。
保護されたワークシート:検証が追加されているセルが保護されていない場合でも、データ検証が追加されているシートは保護できません。 ロックされています たとえ保護モードが ユーザーインターフェースのみ. 。シートの保護を完全に解除し、検証を追加してから、シートを再度保護する必要があります。
ワークシートのセル範囲によってフォーカスが失われる:ユーザーが以前にクリックしたアクティブなワークシート上のコントロール (通常はコマンド ボタン) にフォーカスが移された場合、このエラーは 検証.追加 続いてメソッドが呼び出されます。(本当に、本当です!) これは、検証を追加するコードを実行するすべてのコマンド ボタンに特に当てはまりますが、そのコードの実行前にクリックされる可能性のあるワークシート上のすべてのコントロールにも当てはまります。フォーカス状態とセルまたは範囲へのデータ検証の追加との間には正当な関係がないようなので、これは Excel のバグだと考えています。回避策は次のとおりです。
A. ワークシートのセル範囲によるフォーカスの喪失を防ぐ:をセットする テイクフォーカスオンクリック ワークシート上のすべてのコントロールのプロパティを 間違い.
B. ワークシートのセル範囲にフォーカスを取得します:VBA コードでは、実行する前に、 検証.追加 メソッドを呼び出すと、 選択する ワークシート上の任意のセルのメソッド。論理的な選択は、データ検証を追加するセルまたは範囲を選択することですが、どのセルでも構いません。
まず最初は、Selectionオブジェクトを取り除くことです。それは、マクロレコーダーに最適です:)
ところで、あなたのループあなたはそれにいくつかのより多くの処理を行っている場合でも、何度も何度も同じブロックを選択されるたびに、各反復で作業中のブロックを選択する検討するか、ループ全体を削除します。
あなたはループのためにあなたの後にこれを試すことができますか?
With ActiveWorkbook.ActiveSheet.Range("AO" & firstRow & ":AO" & lastRow).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=VOptions
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = "Options"
.ErrorTitle = ""
.InputMessage = "Click yes or no"
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
私は同じ問題を抱えていたし、エラーがApplication.ReferenceStyle
の設定に関連してい以下の修正コードを参照してください -
If Application.ReferenceStyle = xlR1C1 Then
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=R1C16:R" & foldercnt & "C16"
Else
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=$P1:$P" & foldercnt
End If