4

データの動的な結果セットが読み込まれた 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 ステートメントでスローされるエラーが示唆されました。

このエラーの原因に関するアイデア。

4

8 に答える 8

4

これに関する最終的な考え:

ワークブック内のすべてのボタンの SetFocusOnClick プロパティを false に設定すると、うまくいったようです (少なくとも今のところ)。ただし、これが必須条件である場合、値を true に設定してもまったく機能しないはずです。しかし、時々そうでした。しかし、これは私が見つけた信頼できる解決策です。

于 2009-07-13T10:25:56.123 に答える
1

私が使用した解決策は、With xx.validation の前にワークシートの保護を解除し、その後で保護することでした。[Excel 2000 ではこれを行う必要はありませんでした。100% とは言えませんが、サービス パックが追加されるまで、Excel 2003 でこれを行う必要はなかったと思います。]

于 2011-02-11T01:10:48.833 に答える
1

「自動化エラー」という同じ問題にも直面しました。私がしたことは、検証リストを入れる予定だったシートをアクティブにすることで、エラーは消えました。

于 2009-08-28T03:02:24.017 に答える
1

Excelで非常によく似た問題が発生しました。検証ドロップダウンをプログラムで設定するコードは、イミディエイト ウィンドウで実行すると正常に動作しましたが、ワークシートのボタンから呼び出されたときには動作しませんでした。ボタンにフォーカスがあり、検証を設定する前にコード内のシートまたはセルを選択またはアクティブ化しようとしても、これが修正されないように見えたためです。しかし、Excel にはボタンの「TakefocusOnClick」プロパティがあり、デフォルトで True に設定されていることに気付きました。これを False に設定すると、ボタンにフォーカスが移らず、検証を設定するコードが正常に動作するようになりました。

すべての人の検証の問題に対する答えではないかもしれませんが、上記の恩恵を受けることができる人がいることを願っています.

乾杯。

于 2012-05-30T17:16:06.153 に答える
1

ここで私の内なるスポルスキーをチャネリングしてみましょう。

にない範囲を参照している場合は、参照を完全に修飾するActiveSheet必要があります。

次のようなものが機能するはずです。

ActiveWorkbook.Sheets("mysheet").Range("AO" & firstRow & ":AO" & lastRow).Select
于 2009-06-15T06:04:35.570 に答える
0

まず、Selectionオブジェクトを削除します。マクロレコーダーに最適です:)

ところで、同じブロックを何度も選択するたびにループ内でさらに処理を行っている場合でも、各反復で処理中のブロックを選択するか、ループ全体を削除することを検討してください。

forループの後でこれを試すことができますか?

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
于 2009-06-17T17:47:36.390 に答える