

エラーコード'9'の解消方法を教えてください。以下の`If (WorksheetFunction.CountIf`の部分です。

[code]

    Sub Downloaded()
    
        n = Cells(Rows.Count, "F").End(xlUp).Row
        Dim i
    
        For i = 2 To n
    
            If Range("o" & i) = 0 Then
                Range("a" & i).Value = ""
            Else
                Range("a" & i).Value = Range("o" & i).Value
            End If
    
            ' 下記のIf文に対してエラーが表示される
            If (WorksheetFunction.CountIf(Worksheets(Unsubscribers), Range("A:A").Value) = 0) Then
                Range("b2").Value = "Subscribed"
            Else
                Range("b2").Value = "Unsubscribed"
            End If
    
        Next
    
    End Sub
    
[/code]


CC BY-SA 4.0
2018-05-09T04:54:58.830
43884
2018-05-09T13:29:49.327
2018-05-09T05:36:38.677
3060
28465
question
vba excel
Excel Macro : Error 9, If × Countif


VBAのエラーコード ９は、”インデックスが有効範囲にありません”("Index Out of Range")というエラーです。

[code]

    WorksheetFunction.CountIf(Worksheets(Unsubscribers), Range("A:A").Value
    
[/code]

で使われている Unsubscribers は質問のコードの中で宣言されていないし、値の代入もされていませんから、その値は Empty
であると考えられます。

Worksheets("filename") は、ワークシート名がfilenameであるworksheetオブジェクトです。  
ワークシート名がEmptyであるworksheetは存在しないので、Worksheets(Empty)は”インデックスが有効範囲にありません”というエラーになります。  
＝＝[回答 第一部は、ここまで]＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

質問者から「シートAのA列目にあるものとシートBのA列にあるものを識別して、シートAのB列に重複の有無をYes/Noで表示したいのです」とのコメントがあったので、エラーの解消方法ではなく、プログラムについての回答をしたいと思います。

＝＝[回答 第二部]＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝  
＜おことわり＞  
質問のコードには、２つのシート（AとB)に対応するオブジェクトが出てきません。  
また、A列、B列以外にF列、O列のセルが使われていますが、何がしたかったのか理解できませんでした。

そこで、以下のように単純化したコードの例を示します。  
・ActiveSheetが”シートA”で、”シートB”は"Unsubscribers"という名前のシートの事。  
・”シートA”のA列のセルの値が、”シートB”のA列のセルに出現しているかどうかを調べて、値の右側（B列)のセルに"Yes"か"No"を書き込む。

[code]

    Sub sampleCode()
        Dim sheetA as worksheet, sheetB as worksheet 'worksheetオブジェクト用の変数
        Dim rowNo as Integer, rowMax as Integer '行を表す変数と、データの最終行を表す変数
    
        Set sheetA = ActiveSheet
        Set sheetB = worksheets("Unsubscribers")
    
        rowMax = sheetA.Cells(Rows.Count, 1).End(xlUp).Row
    
        For rowNo = 2 to rowMax
          if (WorksheetFunction.CountIf(sheetB.Range("A:A"),sheetA.Cells(rowNo,1))>0) Then 'SheetBのA列に、SheetAのA列rowNo行のセルの値が含まれていた
            sheetA.Cells(rowNo,2)="Yes" '右のセルにYesと書き込む
          Else
            sheetA.Cells(rowNo,2)="No"  '右のセルにNoと書き込む
          End If
        next rowNo
    End Sub
    
[/code]

コード中の"sheetA."の部分は無くても動きますが、どちらのシートのセルを扱っているのかを明示するために入れました。


CC BY-SA 4.0
2018-05-09T05:20:46.020
43885
2018-05-09T13:29:49.327
2018-05-09T13:29:49.327
217
217
43884
answer