3

Excel 範囲オブジェクトの SpecialCells メソッドを使用して、特定の範囲から空白のセルを検索するマクロを作成しました。次のコードを実行しようとすると、「セルが見つかりません」という例外が発生します。

Sub test()
Debug.Print Sheet1.Range("A1:D4").SpecialCells(xlCellTypeBlanks).Address
End Sub

手順:-

  1. 新しい Excel インスタンスを開きます。
  2. ALT + F11を押す/ VBEを開く
  3. 新しいモジュールを挿入する
  4. 上記のコードを貼り付け、上記のテスト マクロを実行します。

受け取った出力:

ランタイム エラー '1004'。セルが見つかりません。

期待される出力:

$A$1:$D$4

ケース 1:

今、セルA1の操作を行うとします。塗りつぶしの色を指​​定するなどの操作。 test() マクロを呼び出すと、例外はスローされません。

受け取った出力:

$A$1

期待される出力:

$A$1:$D$4

ケース 2:

セル B3 に値を指定するとします。test() マクロを呼び出します。例外はスローされません。

受け取った出力:

$B$1:$B$2,$A$1:$A$3

期待される出力:

$A$1:$D$4

ケース 3:

値を編​​集しようとしたり、「A1:D4」の範囲外のセルを入力しようとすると、たとえば E10 で test() メソッドを実行すると、適切な出力が得られます。

受け取った出力:

$A$1:$D$4

注: 新しい Excel インスタンスで各ケースを実行します。

4

2 に答える 2

4

その理由は、範囲を返すときにSpecialCells「見える」からです。UsedRange

したがってSpecialCells、未使用のシートで使用すると返されますRuntime Error '1004'. No Cells Found. (余談ですが、常にSpecialCellsでエラー処理を使用してください)

セル A1 を変更すると、それが SheetsUsedRangeになるため、ケース 1 で「A1」が返されます

以下のコードは、Range("A1:D4").SpecialCells(xlCellTypeBlanks) を返すように見えます

  1. 空白のシート - 失敗
  2. A10が記入されたシート -A1:A4
  3. A10がクリアされたシート -A1:A4
  4. usedrange リセット (事実上 1) を持つシート - 失敗

    Sub Test()
    Dim ws As Worksheet
    Set ws = Sheets.Add
    On Error Resume Next
    'blank sheet
    Debug.Print "Blank sheet " & ws.Range("A1:D4").SpecialCells(xlCellTypeBlanks).Address
    'enter in A10
    ws.[a10] = "test"
    Debug.Print "With A10 " & ws.Range("A1:D4").SpecialCells(xlCellTypeBlanks).Address
    'clear a10
    ws.[a10].ClearContents
    Debug.Print "With A10 cleared " & ws.Range("A1:D4").SpecialCells(xlCellTypeBlanks).Address
    'reset range
    ActiveSheet.UsedRange
    Debug.Print "With A10 cleared and range reset" & ws.Range("A1:D4").SpecialCells(xlCellTypeBlanks).Address
    On Error GoTo 0
    End Sub
    
于 2012-08-01T06:38:56.590 に答える
1

.SpecialCells特定のセルが使用範囲内にない限り、特定のセルではなく、ワークシートの使用範囲を操作します。

まったく新しいシートでテストSpecialcellsすると、使用範囲が $A$1 であるため、エラーが発生します。$A$1 が色付きの場合、上記の CASE 2 で予想されるエラーは発生しません。

Specialcells細心の注意を払って使用する必要があります。これは、新しいシートでエラーが発生しない例です。

Sub Sample()
    If ActiveSheet.UsedRange.Column > 1 Or ActiveSheet.UsedRange.Row > 1 Then
        Debug.Print ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).Address
    End If
End Sub

セル D5 に何か入力します。「何とか」と言う

このコードを実行します

Sub Sample()
    Debug.Print Sheet1.Range("A1:D4").SpecialCells(xlCellTypeBlanks).Address
End Sub

範囲が UsedRange アドレス内にあるため、これが機能することがわかります。

于 2012-08-01T06:40:58.597 に答える