Menu

VBA Alerte si on masque une valeur

Messages postés
118
Date d'inscription
lundi 15 octobre 2018
Dernière intervention
11 février 2019
-
Bonjour,

Dans un tableau ayant des macro qui masque des lignes ou colonnes inutiles (redimensionne le tableau pour le rendre plus lisible), j'ai peur qu'un utilisateur entre une valeur, et masque la colonne sans penser à effacer ce qu'il y avait dedans.

La valeur serait toujours comptabilisée dans les totaux alors que la colonne n'apparait plus, cela pourrait induire en erreur.

Es-ce possible de faire quelque chose du type:
Dans la feuille "saisie", une ligne ou colonne est masquée.
Si une valeur de la plage "C3:Q200") est masquée then
afficher toute la plage C3:Q200 (autrement dit, annuler le masquage)
Msgbox "attention, vous masquez une valeur"

Une idée pour la phrase en gras? :)

Merci beaucoup!
Afficher la suite 

Votre réponse

5 réponses

Messages postés
118
Date d'inscription
lundi 15 octobre 2018
Dernière intervention
11 février 2019
0
Merci
Ou quelque chose comme "si dans la plage X une valeur > 0 est masquée, alors..."
Commenter la réponse de Anthelm
Messages postés
118
Date d'inscription
lundi 15 octobre 2018
Dernière intervention
11 février 2019
0
Merci
Je suis en train de faire dess essais avec ça mais la partie en gras ne fonctionne pas

Sub test()
For Each cellule In Range("C1:C50")
If (cellule.Value > 0) And cellule.Hidden = True Then Cells(1, 1) = "OK"
Next cellule
End Sub
Commenter la réponse de Anthelm
Messages postés
118
Date d'inscription
lundi 15 octobre 2018
Dernière intervention
11 février 2019
0
Merci
Bonjour,

Je rouvre ce topic car je pensais avoir trouvé une solution mais elle ne marche pas toujours.

J'avais fait une cellule avec:
=SOUS.TOTAL(109;Saisie!C3:DH542)
Et une autre avec
=SOMME(Saisie!C3:DH542)

Sous total est sensé faire une somme des cellules sans les valeurs masquées.
SI les deux cellules sont différentes, afficher une alerte.

ça marche très bien quand des lignes sont masquées et qu'une valeur est restée dedans par inadvertance!

Par contre il semblerait que la fonction sous total de fonctionne pas si c'est une colonne qui a été masquée, et j'ai une macro qui masque des colonnes...

Es-ce possible de faire un sous total ignorant ce qui a été masqué manuellement en tant que ligne ET en tant que colonne?
Commenter la réponse de Anthelm
Messages postés
118
Date d'inscription
lundi 15 octobre 2018
Dernière intervention
11 février 2019
0
Merci
J'ai tenté avec:

Function sommeVisibles(champ As Range)
Application.Volatile
t = 0
For Each c In champ
If c.EntireColumn.Hidden = False Then t = t + c.Value
Next c
sommeVisibles = t
End Function


Gros ralentissement, c'est inutilisable sur une grande plage...
Commenter la réponse de Anthelm
Messages postés
22428
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 février 2019
7217
0
Merci
Bonjour,

il serait plus logique d'agir en amont.
Que ta macro qui masque fasse contrôle avant et ne masque que ce qui est autorisé.
Exemple :
Sub controle()
    Dim pl As Range, i As Long, nb As Long
    Set pl = [C3:G10]
    'contrôle lignes
    For i = pl.Row To pl.Row + pl.Rows.Count - 1
        nb = Application.Count(Intersect(Rows(i), pl))
        If nb > 0 Then
            MsgBox nb & " valeur(s) numérique(s) en ligne " & i
        End If
    Next i
    'contrôle colonnes
    For i = pl.Column To pl.Column + pl.Columns.Count - 1
        nb = Application.Count(Intersect(Columns(i), pl))
        If nb > 0 Then
            MsgBox nb & " valeur(s) numérique(s) en colonne " & i
        End If
    Next i
End Sub

Seules les valeurs numériques sont comptées. Les textes et valeurs d'erreurs ne gênent pas.
Tu peux utiliser le même principe si tu préfères rester avec un contrôle à-posteriori.
eric

eriiic
Messages postés
22428
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 février 2019
7217 -
Oui, voilà. Agir avant, pas après
Si tu as des valeurs numériques tu ne les masques pas.

Ou, si tu n'as pas besoin du détail colonne par colonne, sans boucle :
Sub test()
    masquerCol Range("C3:G10")
End Sub

Sub masquerCol(ByVal pl As Range)
    ' masquer tout
    pl.EntireColumn.Hidden = True
    ' démasquer colonnes avec valeur numérique
    Set pl = pl.SpecialCells(xlCellTypeConstants, xlNumbers)
    If Not pl Is Nothing Then pl.EntireColumn.Hidden = False
End Sub

même principe pour les lignes.
eric

PS : j'ai oublié de répondre à une de tes interrogations.
Sous.Total() n'est prévu que pour les lignes
eriiic
Messages postés
22428
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 février 2019
7217 -
PS2 : et si tu veux prévenir l'utilisateur, remplacer la dernière ligne par :
    If Not pl Is Nothing Then
pl.EntireColumn.Hidden = False
MsgBox "colonnes non masquées : " & pl.EntireColumn.Address
End If

eric
Anthelm
Messages postés
118
Date d'inscription
lundi 15 octobre 2018
Dernière intervention
11 février 2019
-
Dans le tableau, il y a des plages de 11 colonnes qui représente des bâtiments. 10 bâtiments de 11 niveaux.

Le tableau se "module" pour laisser afficher que ce dont j'ai besoin (2 bâtiments de 4 niveaux, par exemple)...

Batiments = (Worksheets("Aide et quantités").Range("E7") * 11) + 3
Etages = Worksheets("Aide et quantités").Range("E8")

'Masquer étages inutiles

If Etages < 11 Then Range(Columns(13), Columns(13 - 10 + Etages)).Hidden = True
If Etages < 11 Then Range(Columns(24), Columns(24 - 10 + Etages)).Hidden = True
If Etages < 11 Then Range(Columns(35), Columns(35 - 10 + Etages)).Hidden = True
If Etages < 11 Then Range(Columns(46), Columns(46 - 10 + Etages)).Hidden = True
If Etages < 11 Then Range(Columns(57), Columns(57 - 10 + Etages)).Hidden = True
If Etages < 11 Then Range(Columns(68), Columns(68 - 10 + Etages)).Hidden = True
If Etages < 11 Then Range(Columns(79), Columns(79 - 10 + Etages)).Hidden = True
If Etages < 11 Then Range(Columns(90), Columns(90 - 10 + Etages)).Hidden = True
If Etages < 11 Then Range(Columns(101), Columns(101 - 10 + Etages)).Hidden = True
If Etages < 11 Then Range(Columns(112), Columns(112 - 10 + Etages)).Hidden = True



If Batiments < 103 Then Range(Columns(Batiments), Columns(112)).Hidden = True



Je vois pas trop comment je vais faire pour ajouter ta macro à ça :p

Un dernier petit coup de pouce? si tu as une idée...!
Anthelm
Messages postés
118
Date d'inscription
lundi 15 octobre 2018
Dernière intervention
11 février 2019
-
Sinon je fais if NB val > 0 à chaque fois que je masque un truc. Je vais peut être essayer ça, ça va prendre 10 jours à écrire mais bon...
eriiic
Messages postés
22428
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 février 2019
7217 -
Appelle la macro de 3 lignes par :
masquerCol Range("C3:G10")

en remplaçant C3:G10 par la plage de ton tableau. C3:DH542 ?
Toutes les colonnes de la plage passée n'ayant aucun nombre seront masquées.
C'était ta question de départ.
eric
Commenter la réponse de eriiic