2016-08-12 9 views
0

私は、範囲CCAddedGPSumが何もないかどうかを調べるためにIf文をテストしていますが、テストするときにはそうでないと判断します。[Range] Is Nothing文が変数がNothingであることを検出できないのはなぜですか?

Debug.Print CCAddedGPSum.Valueを使用すると、変数がSetではないことを示すオブジェクトが必要であると主張するエラーが表示されます。これがなぜIs Nothingとして返されないのですか?ここで

はコードです:

If CCAddedGPSum Is Nothing Then 'Once here, ignores the test and continues to "END IF" 
    Set CCAddedGPSum = Range(CCGPSum.Offset(1, -3), CCGPSum.Offset(1, 1)) 
    CCAddedGPSum.Insert shift:=xlDown 

    Set CCAddedGPSum = Range(CCGPSum.Offset(1, -3), CCGPSum.Offset(1, 1)) 
    CCAddedGPSum.Interior.ColorIndex = 0 
    CCAddedGPSum.Insert shift:=xlDown 

    Set CCAddedGPSum = Range(CCGPSum.Offset(1, -3), CCGPSum.Offset(1, 1)) 
    CCAddedGPSum.Interior.ColorIndex = 0 

    Set CCAddedGPTitle = Range(CCGPSum.Offset(1, -2), CCGPSum.Offset(1, -1)) 
    With CCAddedGPTitle 
     .MergeCells = True 
     .HorizontalAlignment = xlRight 
     .VerticalAlignment = xlCenter 
    End With 

    CCAddedGPTitle.Value = "Removed from Deposit:" 
    Set CCAddedGPSum = CCGPSum.Offset(1, 0) 
    If CCAddedGPSum2 Is Nothing Then 
     CCAddedGPSum.Borders(xlEdgeBottom).LineStyle = xlContinuous 
    End If 

    If CCGPSum.Offset(-1, 0).Text = "" Then 
     Set CCGPSubtotal = CCGPSum 
     Set CCGPSum = CCAddedGPSum.End(xlDown).Offset(1, 0) 
     Range(CCGPSum.Offset(0, -1), CCGPSum.Offset(0, -2)).MergeCells = True 
     CCGPSum.Offset(0, -1).HorizontalAlignment = xlRight 
     CCGPSum.Offset(0, -2).Value = "Total:" 
     CCGPSum.Interior.ColorIndex = 6 
    End If 
End If 
+0

もっとコードを投稿できますか?この問題は、あなたが問題を抱えている行の後には何の問題もないことは明らかです。私たちはあなたの範囲変数がコード内にある以前のスポットを見る必要があります。 – Kyle

+0

必要なオブジェクトは、変数がオブジェクト型ではないことを意味します。これはおそらく、正しく宣言されていない、あるいは設定されていないバリアント型なので、空です。範囲が単に* set *になっていなかった場合、オブジェクト、変数、またはブロックが設定されていない状態で91エラーが発生します。 –

+0

@カイルそれは事です。キャプションされている以外の変数を含むこのコードの唯一のものは 'Public CCAddedGPSum As Range'です。 – Munkeeface

答えて

0

見るVBA: Conditional - Is Nothing

Dim MyObject As New Collection 
If MyObject Is Nothing Then ' <--- This check always returns False 

これは私がPublic宣言がWorksheetモジュールに行われた場合、それはシートに資格のない限りUserFormモジュールに利用できない、いくつかの同様の問題を観察CCAddedGPSumが新しいオブジェクト

+0

これは、私のメインモジュールの上部にある変数宣言ブロックの 'Public CCAddedGPSum As Range'です。文字通りこれ以外に何もありません。このインスタンスで何も返されないのはなぜですか? – Munkeeface

2

として宣言されていると仮定しています。この場合、私にお知らせください。

まだ行っていない場合は、Option ExplicitをUserFormモジュールの上に置き、変数が定義されていないことを示すことがあります。

enter image description here

Iはまた、そうでない場合はサイレント失敗することがあり、フォームが表示することができUFモジュール、内On Error Resume Nextステートメントがある疑い。どのイベントハンドラがコードを実行しているかを調べる必要性を診断する。変数がコマンドボタンなどのイベントハンドラ内にあり、フォームがアクティブのままの場合、変数はスコープ内にとどまる可能性があり、断続的な問題が発生している理由を説明している可能性があります。

ユーザーフォームのイベントハンドラでOn Error Resume Next文のテストはTrueを返すように表示される場合があります(技術的には、それは、何かを返すIf文のエラーとエラーハンドラが行に再開を引き継ぐので、身体いませんであなたPublic宣言は標準モジュール内にある場合は、このソリューションが動作しない場合があり

コード例:。。If/EndIfブロック予期せず実行

注意しますモジュール:正確な424エラーが発生しますUserForm1モジュールで

Option Explicit 
Public r As Range 

Sub Main() 

    UserForm1.Show 

End Sub 

コード例:パブリック変数rに対して、必要なオブジェクト:

Private Sub CommandButton1_Click() 
If r Is Nothing Then 
    Debug.Print r.Address 
    MsgBox "'r' is Nothing" 
    Set r = Range("A1") 
Else: 
    MsgBox r.Address 
End If 

MsgBox "end of UserForm_Initialize" 
End Sub 

、それを解決Sheet1.rrを修飾するかに割り当てますプロシージャスコープ変数:

Private Sub CommandButton1_Click() 
Dim r As Range 
Set r = Sheet1.r 
If r Is Nothing Then 
    Debug.Print r.Address 
    MsgBox "'r' is Nothing" 
    Set r = Range("A1") 
Else: 
    MsgBox r.Address 
End If 

MsgBox "end of UserForm_Initialize" 
End Sub 
+1

'CCAddedGPSum'の宣言がワークシートまたはワークブックモジュールにある場合、エラー処理があるかどうかは関係ありません。ワークシートとワークブックモジュールは、明らかに*ワークブックが閉じられるまでスコープから外れません。メンバー変数は、マクロ実行の間に値を保持します。私の推測では、マクロが最初に実行されるとき、値が 'If'条件を渡すときに値が設定されるということです。コードで 'Nothing'に設定されていない限り、値はそのまま残り、ブックが閉じられて再び開くまで' If'テストに失敗します。 – Comintern

0

なぜIs Nothingはそれほど信頼できるものではありませんRange

Dim r As Range 
Debug.Print r Is Nothing ' True 
Set r = [a1] 
Debug.Print r.Value   ' ok 
[a1].Delete     ' !!! 
Debug.Print r Is Nothing ' False!!! 
Debug.Print r.Value   ' error!!! 
関連する問題