2017-08-28 1 views
0

Dès le départ, je suis un novice en matière de codage, et l'étendue de mes compétences est en cours de modification basée sur les recherches Google. J'utilise Excel 2010 et j'essaie d'utiliser VBA pour éviter d'utiliser la mise en forme conditionnelle. La feuille de calcul que j'utilise est un modèle avec 31 colonnes, dont 20 sont obligatoires. Il y a un codage en place que s'il y a une entrée dans une de ces colonnes pour une ligne donnée, les 19 autres cellules doivent être remplies avant que le fichier puisse être sauvegardé.Excel VBA mise en forme conditionnelle des cellules vides dans la rangée

J'essaie de faire une fonction similaire pour mettre en évidence les cellules vides empêchant le fichier d'être sauvegardé. Je sais que je pourrais utiliser la mise en forme conditionnelle, mais cela l'obligerait à regarder une cellule dans chaque rangée, par opposition à l'une des cellules requises dans cette rangée. Je sais aussi qu'il pourrait faire plusieurs formats conditionnels, mais je sais que plus il y a de couches, plus la feuille de calcul fonctionnera lentement.

Est-ce possible? Les colonnes que j'ai qui sont obligatoires sont A-D, F-K, M-N, S-Y & AE. Dans le cas où il serait un facteur, j'ai attaché le code que je utilise pour mandat une fois l'entrée l'une de ces colonnes sont habitées:

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

«J'utilise Excel _____ » - est que « ____ » un espace réservé pour l'année/version? –

+2

Je * soupçonne * que ce que vous entendez par * qui l'obligerait à regarder une cellule dans chaque rangée * est une mauvaise compréhension. – pnuts

+0

Mug de Mat: Oui ... édité l'OP avec Excel 2010. pnuts: Peut-être un mauvais libellé de ma part? Si je veux avoir un impact sur la mise en forme conditionnelle sur 20 colonnes, j'aurais besoin de 20 conditions dépendantes. – rant

Répondre

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

Merci! Cela ne fait que nettoyer mon code existant, ce que j'apprécie. Ma tentative maladroite de m'écrire m'a donné un message d'erreur sans valeur. (Mon code d'origine avant cette requête a fonctionné, mais j'ai supprimé une dépendance qui me donnait des erreurs répétées pour chaque ligne de données manquantes). J'espère toujours utiliser VBA pour mettre en évidence les cellules sans données cependant. – rant

+0

Manqué cette partie - voir mises à jour –

+0

Incroyable. Je vous remercie. Question stupide, mais je suppose que c'est la limitation du codage. Toute mise en forme des couleurs après le fait est effacée lors de la sauvegarde; le code s'exécute et le "rg.Interior.ColorIndex = xlNone" l'efface. En tout cas autour de ça? Merci encore. – rant