2017-08-28 29 views
0

バットをオフにすると、私はコーディングの初心者です。スキルの範囲はGoogleの検索に基づいて変更されています。Excel VBA条件付き空白のセルをローでフォーマットする

Excel 2010を使用しており、VBAを使用して条件付き書式を使用しないようにしています。私が使用しているスプレッドシートは31列のテンプレートで、そのうちの20行は必須です。与えられた行についてこれらの列の1つにエントリがある場合、ファイルを保存する前に他の19個のセルにデータを取り込まなければならないことがコーディングされています。

私は空のセルを強調表示して、ファイルの保存を妨げている同様の機能を実行しようとしています。私は条件付き書式を使用することができますが、それはその行の必要なセルのいずれかとは対照的に、各行の1つのセルを見ることが必要になります。私はそれが複数の条件付きフォーマットを行うことができることも知っていますが、レイヤーが多いほど、スプレッドシートの機能は遅くなります。

これは可能ですか?私が持っている欄には、A-D、F-K、M-N、S-Y & AEがあります。 - ある「____」という

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 

    Dim ws As Worksheet 
    Dim rg As Range, c As Range 
    Dim bCanSave As Boolean 
    Dim sWarning As String 

    Set ws = Sheets("Main") 
    Set rg = ws.Range("A2:A10000,B2:B10000,C2:C10000,D2:D10000,F2:F10000,G2:G10000,H2:H10000,J2:J10000,K2:K10000,N2:N10000,S2:S10000,T2:T10000,U2:U10000,V2:V10000,W2:W10000,X2:X10000,Y2:Y10000,AE2:AE10000") 
    sWarning = "File not saved!" & vbNewLine & "Mandatory cells missing in rows: " & vbNewLine 

    With ws 
     bCanSave = True 
     For Each c In rg 
      If Not IsEmpty(c) Then 
       If .Cells(c.Row, "A") = "" Or .Cells(c.Row, "B") = "" Or .Cells(c.Row, "C") = "" Or .Cells(c.Row, "D") = "" Or .Cells(c.Row, "F") = "" Or .Cells(c.Row, "G") = "" Or .Cells(c.Row, "H") = "" Or .Cells(c.Row, "I") = "" Or .Cells(c.Row, "J") = "" Or .Cells(c.Row, "K") = "" Or .Cells(c.Row, "N") = "" Or .Cells(c.Row, "S") = "" Or .Cells(c.Row, "T") = "" Or .Cells(c.Row, "U") = "" Or .Cells(c.Row, "V") = "" Or .Cells(c.Row, "W") = "" Or .Cells(c.Row, "X") = "" Or .Cells(c.Row, "Y") = "" Or .Cells(c.Row, "AE") = "" Then 
        bCanSave = False 
        sWarning = sWarning & c.Row & "," 
       End If 
      End If 
     Next c 
    End With 

    If Not bCanSave Then 
     MsgBox sWarning, vbExclamation 
     Cancel = True 
    End If 
End Sub 
+1

「私は_____ Excelを使用しています」:それが要因だろう場合、私はそれらの列のいずれかが移入され、一度エントリを強制するために使用しているコードを添付しています年/バージョンのプレースホルダ? –

+2

* *あなたが*それぞれの行の1つのセルを見るために必要とする*を意味するものは、誤解です。 – pnuts

+0

マットのマグ:はい... Excel 2010でOPを編集しました。 pnuts:おそらく私の部分に文句がないのでしょうか?条件付き書式設定を20列に適用するには、20種類の依存条件が必要です。 – rant

答えて

0
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
    Const CHECK_RNG As String = "A1:D1,F1:K1,M1:M1,S1:Y1,AE1" 
    Dim ws As Worksheet 
    Dim rg As Range 
    Dim bCanSave As Boolean, sep As String 
    Dim sWarning As String, sMissing As String, r As Long, ct As Long 

    Set ws = Sheets("Main") 

    sWarning = "File not saved!" & vbNewLine & "Mandatory cells missing in rows: " & vbNewLine 
    bCanSave = True 

    For r = 2 To 10000 
     Set rg = ws.Rows(r).Range(CHECK_RNG) 
     rg.Interior.ColorIndex = xlNone '<< clear any previous fill 
     ct = Application.CountA(rg) 
     If ct > 0 And ct <> rg.Cells.Count Then 
      rg.SpecialCells(xlCellTypeBlanks).Interior.Color = vbYellow '<< fill empty 
      bCanSave = False 
      sMissing = sMissing & sep & r 
      sep = "," 
     End If 
    Next r 

    If Not bCanSave Then 
     MsgBox sWarning & sMissing, vbExclamation 
     Cancel = True 
    End If 
End Sub 
+0

ありがとう!これは、私の感謝している私の既存のコードをクリーンアップしているだけです。自分自身を書いてみた私の未熟な試みは、私にかなり役に立たないエラーメッセージを与えました。 (私の元のコードはこのリクエストの前に働いていましたが、データが欠落している行ごとに繰り返しエラーが出る依存関係を削除しました)。 私はまだデータなしでセルを強調表示するためにVBAを使用することを望んでいます。 – rant

+0

その部分を見逃しました - 更新を参照してください –

+0

素晴らしい。ありがとうございました。 愚かな質問ですが、私はそれがコーディングの限界だと推測しています。保存すると、事後の色の書式設定が消去されます。コードが実行され、 "rg.Interior.ColorIndex = xlNone"がクリアされます。とにかくこれの周りに? もう一度ありがとうございます。 – rant

関連する問題