Créer un historique en bloquant des cellules.

Karine11

XLDnaute Nouveau
Re bonjour à tous!

J'use probablement de votre gentillesse avec toutes mes questions et j'espère pouvoir aider quelqu'un à mon tour un jour...:eek:

Voici ma problématique: Dans la feuille ci joint, je souhaiterai que les dates triées par années ne bougent pas, c'est dire que quand je change la date de ma dernière visite A2 l'ancienne soit conservée en B2. Est-ce possible? Merci pour tout!
Karine
 

Pièces jointes

  • Classeur 1.xls
    17.5 KB · Affichages: 49
  • Classeur 1.xls
    17.5 KB · Affichages: 57
  • Classeur 1.xls
    17.5 KB · Affichages: 59

Odesta

XLDnaute Impliqué
Re : Créer un historique en bloquant des cellules.

Bonjour
Par formules, il n'y a pas de solution, car les formules donnent toujours un résultat en fonction de l'état actuel (lorsque l'on "recalcul"). Il n'y a donc pas possibilité de "sauver" des informations par ce biais.

En revanche, un petit programme placé dans le classeur ou dans la feuille peut, lui, sauvegarder les informations souhaitées où il faut.

Je vous encourage à chercher de ce côté là pour avancer dans votre problème.

Cdt
Olivier
 

ROGER2327

XLDnaute Barbatruc
Re : Créer un historique en bloquant des cellules.

Bonsoir à tous


Pas certain d'avoir tout compris, mais voyez deux propositions dans le classeur joint...​



ROGER2327
#6184


Jeudi 12 Tatane 139 (Saints Cannibales, philanthropes - fête Suprême Quarte)
7 Thermidor An CCXX, 9,5953h - armoise
2012-W30-3T23:01:43Z
 

Pièces jointes

  • XLD_189275_Valeurs bloquées.xls
    50 KB · Affichages: 64

Karine11

XLDnaute Nouveau
Re : Créer un historique en bloquant des cellules.

Merci Roger! C'est presque cela, sauf que je voudrais que mes nouvelles dates inscrites se "range' automatiquement dans la bonne colonne... Mais sinon pour la forme tu m'as bien aidé! Encore merci!
 

ROGER2327

XLDnaute Barbatruc
Re : Créer un historique en bloquant des cellules.

Bonjour Karine11, bonjour à tous


Merci Roger! C'est presque cela, sauf que je voudrais que mes nouvelles dates inscrites se "range' automatiquement dans la bonne colonne... Mais sinon pour la forme tu m'as bien aidé! Encore merci!
Je ne sais pas exactement ce que vous cherchez. Mais comme l'exercice m'intéresse, j'ai ajouté des autres propositions dans le classeur joint.

Voyez si l'une ou l'autre peut convenir, et dites-moi laquelle. Si aucune ne convient, merci de me dire pourquoi.​


À bientôt.


ROGER2327
#6192


Vendredi 13 Tatane 139 (Saint Dada, prophète - fête Suprême Quarte)
8 Thermidor An CCXX, 5,7470h - carthame
2012-W30-4T13:47:34Z
 

Pièces jointes

  • XLD_189275_Valeurs bloquées-1.xls
    87.5 KB · Affichages: 52

ROGER2327

XLDnaute Barbatruc
Re : Créer un historique en bloquant des cellules.

Re...


Bonjour Roger2327,
Merci pour ton fichier c'est exactement cela que je voulais faire!;)
Je retiens les propositions 2,3 & 4!
A bientôt!
Karine11
Réponse surprenante car la proposition 2 fait des choses très différentes des prop. 3 & 4. Par conséquent, j'ai toujours du mal à comprendre ce que vous voulez réellement.

Les prop. 3, 4 & 5 sont assez voisines : la prop.4 fait la même chose que la prop. 3, puis classe les dates de chaque colonne en ordre croissant ; la prop. 5 fait la même chose que la prop. 4, et supprime les doublons.

Oups.... ta macro est bien trop compliqué pour moi qui suis novice en la matière....
Les codes sont moins compliqués qu'il n'y parait. Mais ils ont un gros défaut : Si on veut traiter un tableau dont la première cellule n'est pas la cellule A1, ils doivent être modifiés en plusieurs endroits, ce qui n'est pas très sérieux. Si vous voulez adapter ces procédures, ce peut être un peu difficile.
J'ai fait ainsi dans un premier temps pour dégrossir le boulot en attendant de savoir ce que vous cherchez exactement. On peut bien sûr améliorer cela, ce que je fais avec la proposition 6, ci-jointe. Elle reprend le principe de la prop. 5. En voici le code commenté ligne par ligne :​
VB:
Private Sub Worksheet_Change(ByVal Cible As Range)
Dim i&, j&, tmp%, EtatCalc&, An(), Ref As Range, Plg As Range, Col As Range, Cel As Range
' Paramètre unique de la procédure : Première cellule du tableau de données.
    Set Ref = [B3]
' Recherche des données à traiter. Les données à traiter sont les cellules qui ont appelé
'la procédure et qui sont situées dans la colonne 'Ref.Column' en dessous de 'Ref' :
    Set Plg = Intersect(Ref.Resize(Rows.Count - Ref.Row, Ref.Column).Offset(1), Cible)
' Si 'Plg' est vide (i.e. si aucune des cellules qui ont appelé la procédure n'est dans
'la colonne 'Ref.Column' en dessous de 'Ref'), on ne fait rien. Sinon :
    If Not Plg Is Nothing Then
        EtatCalc = Application.Calculation
' Ligne "technique" visant à accélerer la procédure.
        With Application: .ScreenUpdating = 0: .Calculation = -4135: End With
' On place dans un 'An' les valeurs de 'Ref' et des cellules situées à droite de 'Ref' :
        An = Ref.Resize(1, Ref.End(xlToRight).Column).Value
' On traite tour à tour chacune des cellules de 'Plg' :
        For Each Cel In Plg.Cells
' Pour la cellule 'Cel' (= la cellule en cours de traitement), on vérifie
'qu'elle contient une date :
            If IsDate(Cel) Then
' Si oui, on relève l'année 'tmp' qui correspond à cette date :
                tmp = Year(Cel.Value)
' On parcourt le tableau 'An' ...
                For i = 2 To UBound(An, 2)
'... pour rechercher s'il contient la valeur de 'tmp' :
                    If An(1, i) = tmp Then
' Si oui, la valeur de 'i' est le rang de la colonne correspondante
'dans le tableau de données.
'
' On cherche dans cette colonne la première cellule vide.
                        j = 0
                        Do Until IsEmpty(Ref.Offset(j, i - 1)): j = j + 1: Loop
' La valeur de 'j' + 1 est le rang de la première cellule vide
'dans la colonne 'i' du tableau de données.
'
' Ligne "technique" visant à éviter des appels intempestifs de la procédure.
                        Application.EnableEvents = 0
' On place la valeur de 'Cel' dans la cellule vide identifiée :
                        Ref.Offset(j, i - 1).Value = Cel.Value
'
' ### Partie facultative qui peut être omise.
' Si on veut un tri croissant ou la suppression des doublons :
                        Set Col = Me.Range(Ref.Offset(0, i - 1), Ref.Offset(j, i - 1))
' Tri croissant : (Version EXCEL2007 et EXCEL2010 ; à adapter pour EXCEL2003)
                        On Error GoTo E
                        With Me.Sort
                            .SortFields.Clear
                            .SortFields.Add Key:=Col, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                            .SetRange Col
                            .Header = xlYes
                            .MatchCase = False
                            .Orientation = xlTopToBottom
                            .SortMethod = xlPinYin
                            .Apply
                        End With
E:                      On Error GoTo 0
' (Fin du tri)
' Suppression des doublons (NE FONCTIONNE QU'À PARTIR D'EXCEL2007) :
                        With Col
                            On Error Resume Next
                            .RemoveDuplicates Columns:=1, Header:=xlYes
                            If Err.Number = 0 Then
                                .Cells(1).Offset(1).Copy
                                .Offset(1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                                Application.CutCopyMode = False
                            End If
                            On Error GoTo 0
                        End With
' (Fin de suppression des doublons)
' ### Fin de la partie facultative
'
' Ligne "technique" visant à rétablir le fonctionnement normal des appels de procédure.
                        Application.EnableEvents = 1
' Fermeture des boucles et des procédures conditionnelles.
                        Exit For
                    End If
                Next
            End If
        Next
' Rétablissement de la sélection courante :
        If Cible.Count = 1 And Not IsEmpty(Cible) Then Cible.Offset(1).Activate Else Cible.Activate
' Ligne "technique" : rétablissement de paramètres.
        With Application: .Calculation = EtatCalc: .ScreenUpdating = 1: End With
    End If
End Sub
Avec ce code, le seul réglage à faire se fait dans cette ligne
Code:
    Set Ref = [B3]
Il faut mettre l'adresse de la première cellule du tableau de données à la place de B3.

Par ailleurs, pour obtenir le code correspondant à la prop. 4, il suffit de supprimer la partie du code de la ligne
Code:
' Suppression des doublons (NE FONCTIONNE QU'À PARTIR D'EXCEL2007) :
à la ligne
Code:
' (Fin de suppression des doublons)

Pour obtenir le code correspondant à la prop. 3, il suffit de supprimer la partie du code de la ligne
Code:
' ### Partie facultative qui peut être omise.
à la ligne
Code:
' ### Fin de la partie facultative

Je n'ai pas fait l'adaptation pour la prop. 2 : compte tenu du message #5, il m'étonnerait qu'elle réponde à votre attente. Si je me trompe, dites-le moi et je la corrigerai pour en faciliter l'adaptation.​



ROGER2327
#6198


Samedi 14 Tatane 139 (Sainte Anne, Pèlerine, énergumène - fête Suprême Quarte)
9 Thermidor An CCXX, 9,9871h - mûre
2012-W30-5T23:58:09Z
 

Pièces jointes

  • XLD_189275_Valeurs bloquées-2.xls
    39 KB · Affichages: 42
Dernière édition:

Statistiques des forums

Discussions
312 836
Messages
2 092 651
Membres
105 479
dernier inscrit
chaussadas.renaud