VBA : Rétablir le format standard d'une cellule

Bonjour à toutes et à tous.

La macro vérifie sur une plage (tableau) les dates saisies. Si une date est supprimée, elle remet le "Format standard" de la cellule.

Je suis arrivé à effectuer pour toute la plage mais cela prend beaucoup de temps car la macro lit toute la plage.

Cependant je voudrais rétablir le format standard que pour la cellule dont la date est supprimée.

Le code est divisé en plusieurs et la macro concernée : vFRestorerFormatGeneral.

D'avance merci.

Nazée

9miseevidence.xlsm (28.54 Ko)

Bonjour,

avec un fichier vide on peut difficilement se rendre compte des données...
Si une plage est dédiée à des dates on peut supposer qu'elle recevra à nouveau des dates et que changer son format est inutile non ?

Sinon le principe est de lire la plage dans une variable tableau, balayer ce tableau en mémoire est 100 fois plus rapide.
Tu te crées une variable Range qui reçoit les ref vides au fur et à mesure du balayage et à la fin tu appliques le format sur ce Range.
eric

Bonsoir eric, le forum,

Merci pour ta réponse.

Le fichier n'est pas vide. Le code est bien présent.

La plage de saisie est de "Q20 à AU76". C'est pour cela que j'ai mis en vert trois cellules pour se repérer. Désolé d'avoir omis ce détails.

Si une date est saisie un comptage et l'adresse des cellules contenant des dates s'affiche en "AE81" et "AE82".

Pour te dire, je n'ai pas compris ce que tu me proposes. Peux-tu apporter tes suggestions à la fonction qui se charge justement de remettre le "Format standard".

Function vFRestorerFormatGeneral(ByVal vArray As Variant, ByVal vPlage As Range)
    'Initialiser le tableau de cellules à rétablir
    Dim i As Long, j As Long

    'Parcourir chaque cellule dans le tableau de dates (vArray)
    For i = LBound(vArray, 1) To UBound(vArray, 1)
        For j = LBound(vArray, 2) To UBound(vArray, 2)
            'Vérifier si la cellule correspondante est vide (date supprimée)
            If IsEmpty(vPlage.Cells(i, j).Value) Then
                'Rétablir le format général ou standard de la cellule
                vPlage.Cells(i, j).NumberFormat = "General"
            End If
        Next j
    Next i
End Function

Merci encore.

Nazée

Re,

Le fichier n'est pas vide. Le code est bien présent.

La feuille est complètement vide, ni entête de champs, ni valeurs.
Comment veux qu'on te conseille correctement si on ne sait pas quel type de donnée ou formule reçoit une cellule ni comment se présentent tes tableaux ?
Si tu as une colonne Date par exemple je te dirais que c'est totalement inutile puisque seule une date pourra y venir.

Bref, un exemple :

Sub test()
    Dim pl As Range
    Set pl = Range("Q20:AU76")
    F_Standard pl
End Sub

Sub F_Standard(pl As Range)
    Dim datas, pl2 As Range, lig As Long, col As Long
    datas = pl.Value ' mise plage en mémoire
    For lig = 1 To UBound(datas, 1)
        For col = 1 To UBound(datas, 2)
            If datas(lig, col) = "" Then
                If pl2 Is Nothing Then Set pl2 = pl(lig, col) Else Set pl2 = Union(pl2, pl(lig, col)) ' on stocke les ref vides dans pl2
            End If
        Next col
    Next lig
    If Not pl2 Is Nothing Then pl2.NumberFormat = "General" ' on change tous les formats d'un coup
End Sub

Je n'ai pas mis en fonction car je n'ai pas perçu l'intérêt. La conversion ne sera pas difficile.
eric

PS : 0.023 s pour remettre toute la plage en Standard
PS2 : il faut éviter de mettre des traitements trop importants dans Worksheet_SelectionChange
Tu te retrouves avec une feuille qui n'est plus réactive et ça devient vite pénible.
Fait sur demande sur un bouton, et/ou sur activation de la feuille

Bonjour eric,

Merci pour ton retour.

Le document final à beaucoup de données, pour cela que je n'ai pas mis de données.

Cette macro permet de vérifier et de comptabiliser les dates saisies avec l'adresse de la cellule. Si une date est supprimée alors elle rétablit le format général pour éviter la confusion d'une date et un nombre. A la fin, des nombres qui seront saisies en définitif.

Cependant, en intégrant la macro comme telle, elle me retourne une erreur : "Erreur d'exécution 91: Variable objet ou variable de bloc With non définie", à niveau "datas = pl.Value ' mise plage en mémoire".

Merci encore

Nazée

re,

si les "dates" se trouvent toujours dans certaines colonnes, on peut faire ceci

Sub Test()
     On Error Resume Next
     Sheets("Feuil1").Range("Q20:Q76, S20:S76,Z20:AC76,AS20:AU76").SpecialCells(xlBlanks).NumberFormat = "general"
     On Error GoTo 0
End Sub

Bonjour BsAlv,

Merci pour ta solution, Elle me va très bien.

Mais je voudrais l'automatiser pour le tableau "Q20:AU76" pour l'appliquer à une cellule quelconque dont la date est supprimée.

Encore merci.

Nazée

re, dans le code ici dessous, vous devez supprimer une ligne dépendant de votre préférence : oubien vous voulez vérifier toutes les cellules (la ligne avec c) oubien seulement les cellules modifiées (ligne avec c1

Private Sub Worksheet_Change(ByVal Target As Range)
     Dim c, c1 As Range
     Set c = Me.Range("Q20:AU76")
     Set c1 = Intersect(c, Target)
     If c1 Is Nothing Then Exit Sub

     On Error Resume Next
     c.SpecialCells(xlBlanks).NumberFormat = "general"     'toutes les cellules de cette plage
     c1.SpecialCells(xlBlanks).NumberFormat = "general"     'uniquement les cellules modifiées dans cette plage
     On Error GoTo 0

End Sub

Re-bonjour BsAlv,

Merci. C'est ce que je cherche, surtout la possibilité c1.

Cependant, peut on utiliser cette macro dans un module standard au lieu d'un module de feuille ou une fonction pour l'inclure dans une autre procédure.

Encore Merci

Nazée

re,

voir fichier : on a la macro "Nazee" avec 2 plages comme argument, qui fait le boulot.

maintenant on peut utiliser cette macro comme dans les macros "Exemple1" à "Exemple4" ou avec la "Worksheet_Change" de feuille "Feuil1"

2nazee.xlsb (22.86 Ko)

Bonjour,

Cependant, en intégrant la macro comme telle, elle me retourne une erreur : "Erreur d'exécution 91: Variable objet ou variable de bloc With non définie", à niveau "datas = pl.Value ' mise plage en mémoire".

Encore une fois, sans fichier comment veux-tu qu'on voit si tu as commis une erreur. ?
Toujours joindre un fichier en situation réduit au minimum...
eric

Bonjour eric, BsAlv et le forum,

Merci infiniment pour votre aide.

Suite à vos propositions et des essais, finalement j'ai résolu le problème.

Encore Merci,

Nazée

Rechercher des sujets similaires à "vba retablir format standard"