1

セルの列から 3 つの文字列のいずれかを検索しようとしています。3 つの文字列が見つからない場合は、現在の行全体をコピーして、新しいシートの次の空の行に貼り付けます。これが私に問題を引き起こしている私のコードです。エラーは、比較のために文字列を定義する場所にあると思います。私はすでに新しいシートを作成しました。

Dim LastRow As Long
LastRow = Worksheets("Spiff Download Reporting").Range("E65536").End(xlUp).Row
Dim text As String
Dim text2 As String
Dim text3 As String
Dim NextRow As Integer
text = InputBox("Enter PLUS Name")
text2 = InputBox("Enter HERO Name")
text3 = InputBox("Enter Outboard Motor Plan Name")
For n = LastRow To 2 Step -1

   If InStr(1, Worksheets("Spiff Download Reporting").Range(Cells(n, 6)).Value, text Or text2    Or text3, vbTextCompare = 1) = 0 Then

        Rows(n).EntireRow.Copy
        Worksheets("Vendor Paid").Activate
        NextRow = Sheets("Vendor Paid").Range("A" & Rows.Count).End(xlUp).Row + 1
        Rows(NextRow).EntireRow.Select
        ActiveSheet.Paste
        Worksheets("Spiff Download Reporting").Activate
        Rows(n).EntireRow.Delete Shift:=xlUp
    End If
Next n
4

1 に答える 1

1

これを変更してみてください:

If InStr(1, Worksheets("Spiff Download Reporting").Range(Cells(n, 6)).Value, text Or text2    Or text3, vbTextCompare = 1) = 0 Then

に:

If InStr(1, Worksheets("Spiff Download Reporting").Range(Cells(n, 6)).Value, text, vbTextCompare) < 1 And _
   InStr(1, Worksheets("Spiff Download Reporting").Range(Cells(n, 6)).Value, text2, vbTextCompare) < 1 And _
   InStr(1, Worksheets("Spiff Download Reporting").Range(Cells(n, 6)).Value, text3, vbTextCompare) < 1 Then

は論理演算子であり、変数とをブール値として処理しようとするため、この式text Or text2 Or text3はエラーを引き起こします。それらをブール値に変換できない場合、文句を言います。Ortexttext2text3

さらに、vbTextCompare = 1-1 の数値を持つ True に評価されます。これを の 3 番目の引数として入力することInStrは無効です。InStrここでは 0、1、または 2 のみを受け入れます。vbTextCompareは値 1vbBinaryCompareの変数、 は値 0 の変数vbDatabaseCompare、値 2 を保持します。

また、次のように変更することをお勧めします。

Rows(n).EntireRow.Copy
Worksheets("Vendor Paid").Activate
NextRow = Sheets("Vendor Paid").Range("A" & Rows.Count).End(xlUp).Row + 1
Rows(NextRow).EntireRow.Select
ActiveSheet.Paste
Worksheets("Spiff Download Reporting").Activate
Rows(n).EntireRow.Delete Shift:=xlUp

に:

With Worksheets("Spiff Download Reporting")
    .Rows(.Range("A:A").End(xlUp).Row+1).Value = Worksheets("Vendor Paid").rows(n).value
End With
Worksheets("Vendor Paid").Rows(n).EntireRow.Delete

注意: コード モジュールの先頭で Option Explicit を使用することをお勧めします。モジュールの一番上に移動して、(それ自体の行に) Option Explicit と入力するだけです。これは、n で行ったように、最初に変数を宣言しないと変数を使用できないことを意味します。

ところで、SOへようこそ:)。あなたの質問はまったく問題ありませんが、次のことを行うと回答を得るのに役立ちます。

  1. エラーが発生した行を示します
  2. エラーメッセージの内容を教えてください
  3. 問題を再現しながら、できる限りコードを削減します (人々があなたを助けるために行うことは少なくなります!)

ここにはたくさんの情報があります。質問がある場合は、コメントで質問することをお勧めします:)。また、イミディエイト ウィンドウ (エディターから Ctrl+G) を使用して、私が説明したことのいくつかを評価してください。入力してエンター? vbTextCompare = 1を押して、結果を確認してください。または、2 番目の引数を InStr: にエミュレートして、文字列? "a" Or "b" Or "c"を使用したときに何が起こるかを確認Orします。

編集

エラーが発生したら、デバッグを押します。次に、ctrl+g を押して即時ウィンドウを表示します。次の行を 1 つずつ入力して、Enter キーを押してみてください。

? Worksheets("Spiff Download Reporting") Is Nothing
? Cells(n, 6) Is Nothing
? Worksheets("Spiff Download Reporting").Range(Cells(n, 6)) Is Nothing

これらの行のうち、少なくとも 2 行でエラーが発生するはずです。どちらの行か教えてください。

ステートメント付き

with ステートメントは、コード内の単一オブジェクトのメソッドとプロパティに主にアクセスする場合に使用されます。そのオブジェクトは、キーワードの後に​​指定されますWith。次に、そのオブジェクトの名前を使用せずに、そのオブジェクトのメソッドとプロパティにアクセスできます。基本的な例:

' We are working with the Spiff Download Reporting sheet
With Worksheets("Spiff Download Reporting")
    'Because we've used the With statement we don't need to
    'specify the target object's name each time we access a
    'property (e.g. the name) or method of that object
    MsgBox(.Name) 
End With
' End with is essentially stating that we are no longer
' predominantly working with the object we specified
' earlier
于 2013-02-26T23:38:20.850 に答える