2016-11-15 45 views
1

ブックを保存する前に特定のシートが空の場合にプロンプ​​トを表示する以下のコードがあります。特定の範囲内でセルが空白でないかどうかを確認するVBA

コードの目的:メインシートでドロップダウンの値が「はい」になっているかどうかをチェックし、「はい」の場合、特定のシートの所定の範囲が空白であるかどうかをチェックします。 「はい」の場合、プロンプトを表示し、メインシートのドロップダウン値を「いいえ」に変更します。

問題:コード内のFor loopは、指定された範囲内のセルが空であるかどうかをチェックします。代わりに、指定された範囲内のいずれかのセルにエントリがあるかどうかを確認するコードを設定します。与えられた範囲がE10:G19であると言うことができます.E10に項目がある場合は、コードから出てくるはずです。プロンプトを投げてはならず、指定された範囲内のすべてのセルが空の場合にだけ投げます。

質問:私の目的を果たすことができるFor loopの代わりになるものは何ですか?ここで

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
Dim ws As Worksheet 

Dim Rvalue As Range 
Dim cell As Range 
Set Rvalue = Sheets("Uni-corp").Range("E10:G19") 

If Worksheets("Main").Range("E29").Value = "YES" Then 
For Each cell In Rvalue 
     If IsEmpty(cell) Then 
      bOk = True 
      Exit For 
     Else: bOk = False 
     End If 
Next 

If bOk Then 
    If MsgBox("Sheet is blank", vbOKCancel + vbInformation) = vbOK Then 
    Worksheets("Main").Range("E29").Value = "NO" 
    Cancel = True 
    End If 
End If 
End If 
End Sub 

答えて

1

多分あなたはこのような何かの後です:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  
    If UCase(Worksheets("Main").Range("E29").Value) <> "YES" Then Exit Sub 
    If WorksheetFunction.CountA(Worksheets("Uni-corp").Range("E10:G19")) > 0 Then Exit Sub 
    If MsgBox("Sheet is blank", vbOKCancel + vbInformation) = vbOK Then 
     Worksheets("Main").Range("E29").Value = "NO" 
     Cancel = True '<--| this will make the macro not save the workbook 
    End If 
End Sub 
2

あなたが行く:

Option Explicit 

Public Function b_is_range_empty(my_rng As Range) 

    If Application.WorksheetFunction.CountA(my_rng) > 0 Then 
     b_is_range_empty = False 
    Else 
     b_is_range_empty = True 
    End If 

End Function 

Public Sub TestMe() 

    Debug.Print b_is_range_empty(Selection) 

End Sub 

アイデアは、Excelの組み込み式を使用することである - COUNTAを。より高速な検索のために最適化されています。テストでは、領域の選択と一緒に動作します。

編集:これの代わりに :

For Each cell In Rvalue 
     If IsEmpty(cell) Then 
      bOk = True 
      Exit For 
     Else: bOk = False 
     End If 
Next 

書き込み単にこの: bOK = b_is_range_empty(Rvalue)

+0

ありがとうございます。私はあなたのコードで自分の要求をどのように置き換えるのか、さらに混乱しています。私はVBAでそれほど良くありません:-( – sady

+0

b_is_range_emptyは、範囲が空であるかどうかに応じて真偽を返します。別のモデルにコードを貼り付け、範囲を選択してTestMeを実行して動作を確認します。 – Vityata

1
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
Dim ws As Worksheet 

Dim Rvalue As Range 
Dim cell As Range 
Set Rvalue = Sheets("Uni-corp").Range("E10:G19") 

If Worksheets("Main").Range("E29").Value = "YES" Then 
For Each cell In Rvalue 
     If IsEmpty(cell)<>true Then 
      bOk = false 
      Exit For 
     Else: bOk = true 
     End If 
Next 

If bOk Then 
    If MsgBox("Sheet is blank", vbOKCancel + vbInformation) = vbOK Then 
    Worksheets("Main").Range("E29").Value = "NO" 
    Cancel = True 
    End If 
End If 

If bOk=false Then 
    If MsgBox("Sheet is not blank", vbOKCancel + vbInformation) = vbOK Then 
    Worksheets("Main").Range("E29").Value = "Yes" 
    Cancel = True 
    End If 
End If 

End If 
End Sub 
+0

I私が探しているのではなく、恐ろしかったです。コードはRvalueで各セルをチェックします。 'For Each In Rvalue' – sady

1

あなたが最初のセルが空である、あなたが望むだろうと、ループのためにあなたを終了するように見えます代わりに値が見つかると終了する:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
Dim ws As Worksheet 

Dim Rvalue As Range 
Dim cell As Range 
Set Rvalue = Sheets("Uni-corp").Range("E10:G19") 

If Worksheets("Main").Range("E29").Value = "YES" Then 
For Each cell In Rvalue 
     If IsEmpty(cell) Then 
      bOk = True 
      'Exit For moved to Else section 
     Else: bOk = False 
     Exit for 
     End If 
Next 

If bOk Then 
    If MsgBox("Sheet is blank", vbOKCancel + vbInformation) = vbOK Then 
    Worksheets("Main").Range("E29").Value = "NO" 
    Cancel = True 
    End If 
End If 
End If 
End Sub 
関連する問題