Taille de police :

×

Lecture de la page :

Lire Test2
|

Création de série de valeurs, dépasser les limites d'Excel

0
(0)

Je pense que tout le monde connais la "poignée de recopie" donnant à l'utilisateur la possibilité de recopier une valeur ou d'incrémenter-décrémenter celle-ci et permettant ainsi la génération rapide de listes de nombres, de dates ou de textes.

Je vous propose un petit topo sur les différents outils qu'Excel nous propose pour réaliser ce type d'actions et une petite macro permettant de dépasser une limitation des valeurs générées par ces outils.

La poignée de recopie : Le classique

La méthode la plus connue et intuitive. Il s'agit du petit carré noir visible dans le coin inférieur droit de la cellule active.
En faisant un cliqué glissé à partir d'elle, dans une des 4 directions (Haut/Bas/Droite/Gauche), on génère de nouvelles valeurs dans les cellules balayées selon un modèle logique.

Génération de séries - Poigné de recopie

Principe de fonctionnement

En cas d'un glissé de la poignée :

  • Vers les bas ou la droite, la valeur est augmentée de 1 ou passe à l'élément suivant de la liste.
  • Vers le haut ou la gauche, la valeur est diminuée de 1 ou passe à l'élément précédent de la liste.

Remarques :

  • On peut faire le rapprochement avec les n° de ligne ou de colonne qui varient de manière identique.
  • Une cellule d'une ligne ou d'une colonne masquée sera pris en compte et complétés.
Génération de séries - Pougné de recopie

La logique par défaut d'Excel entre copie et incrémentation-décrémentation

Chiffres, nombres, textes ne se terminant pas par un chiffre => COPIE

Génération de séries - Recopie par défaut

Remarque : Les raccourcis CTRL+ B (vers le Bas) et CTRL+ D (vers la Droite) permettent de recopier la 1ere cellule de la sélection sur les autres cellules de la sélection (mais pas de générer des séries).

Dates, horaires, textes se terminant par un chiffre => INCRÉMENTATION-DÉCRÉMENTATION

Génération de séries - Incrémentation/décrémentation par défaut

Remarques :

  • Les horaires s'incrémente par heure.

Jour de la semaine, mois de l'années (en entier ou en abrégé) => INCRÉMENTATION-DÉCRÉMENTATION

Génération de séries - Incrémentation/décrémentation par défaut

Remarques :

  • Ces listes incrémentées sont générées à partir de celle mémorisées dans Options>Options avancées>Générales> bouton Modifier les listes personnalisées.
Génération de séries - Incrémentation/décrémentation
  • Il est possible d'apprendre à Excel de nouvelles listes pour générer d'autres séries de valeurs :
    (Par exemple : Ain, Aisne, Allier, Alpes-de-Haute-Provence, Hautes-Alpes, Ardèche...)
    • Via la sélection de Nouvelle liste (1), on peut saisir en zone (2) une liste de valeurs puis la valider par le bouton Ajouter (3).
    • Via la zone (4), on sélectionne une plage de cellules d'une colonne ou d'une ligne contenant les valeurs à récupérer puis on les importe avec le bouton Importer (5).
  • Ces listes sont liées à Excel et non au classeur (elles seront disponibles pour tous les classeurs sur cet ordinateur mais pas sur un autre ordinateur même en ouvrant le fichier ou elles ont été créées).
  • Elles pourront aussi être utilisées pour générer un ordre de tri spécifique dans Excel (comme les noms des départements Français).

Trimestre (en entier ou en abrégé) => INCRÉMENTATION/DÉCRÉMENTATION

Génération de séries - Incrémentation/décrémentation par défaut

Remarque : Ne fonctionne pas pour les semestres et les quadrimestres.

Valeurs ordinales

Génération de séries - Incrémentation/décrémentation par défaut

Intervertir la logique par défaut entre copie et incrémentation-décrémentation

Si Excel copie les valeurs et que l'on veut qu'il en incrémente les valeurs (ou inversement), il est possible d'intervertir son fonctionnement (exemples : on veut 10, 11, 12... ou que des Mars, Mars...).

En agissant proactivement (avant terminer la manipulation de copie/incrémentation-décrémentation)

  1. Commencer le glisser avec de la poignée de recopie > NE RELACHER PAS LE BOUTON DE LA SOURIS.
  2. Remarquer la valeur s'affichant dans la bulle d'information nous indiquant le futur résultat.
  3. Si la valeur affichée dans la bulle ne convient pas, maintenir la touche CTRL du clavier enfoncé et continuer le glisser de la souris > la bulle se met à jour et montre qu'Excel a bien inversé sa logique par défaut.
  4. Relâcher d'abord le bouton de la souris puis la touche CTRL.

En agissant postérieurement (après la copie/incrémentation-décrémentation)

Il faut le faire juste après avoir fait le glisser en utilisant la balise active apparaissant en bas à droite de la zone glissée (si l'on fait d'autres actions dans Excel, la balise active ne sera plus disponible).

Les balises actives servent à corriger ou ajuster le comportement par défaut d'Excel s'il n’a pas interprété correctement notre intention.

Il suffit de choisir "Copier les cellules" ou "Incrémenter une série" selon le besoin.

Génération de séries - Balise active

En agissant proactivement postérieurement via le menu contextuel 🤪

Solution hybride des 2 précédentes, existante avant l'apparition de l'outil balise active.

  1. Faire le glisser de la poignée de recopie avec le bouton DROIT de la souris !
  2. En relâchant le bouton de la souris un menu contextuel apparaît.
  3. Choisir "Copier les cellules" ou "Incrémenter une série" selon le besoin.
Génération de séries - Menu contextuel

Réalisation de séries plus complexes

Pour les dates

Au lieu de décaler les dates d'un jour, Excel peut faire le décalage sur le mois, l'année ou sur les jours en enlevant les samedis et dimanches.

Pour cela utiliser la balise active ou le menu contextuel.

Génération de séries - Spécifique dates

Pour les Heures : Minutes : Seconde, Excel ne propose que d'incrémenter-décrémenter les heures.

Incrémentation-décrémentation avec un pas différent de 1

Dans ce cas on va sélectionner plusieurs cellules donnant ainsi à Excel un modèle à dupliquer. Utilisable sur les chiffres, nombres, dates et les éléments de liste.

Valeur de 2 en 2

Génération de séries - Incrémenter-décrémenter en utilisant un pas différent de 1

On retire les mercredis

Génération de séries - Retirer un élément d'une liste

Remarque : Ainsi on va pouvoir utiliser un pas en minutes ou secondes pour un valeur horaire.

L'outil Remplissage instantané : Le petit "nouveau"

Microsoft a intégré cette fonctionnalité dans Excel depuis la version 2016 (Flash Fill en anglais).
Cet outil permet à Excel de reconnaître automatiquement des motifs dans les données de la colonne à gauche et de compléter les cellules en vis à vis (ne fonctionne pas en orientation ligne).

Pratique pour nettoyer, séparer ou combiner des données rapidement sans formule (donc sans mise à jour automatique en cas de modifications des données de départs) !

Principe d'utilisation

Lors de la saisie du modèle permettant à Excel de reconnaitre le motif, Excel parfois, déclenche directement cet outil et propose des valeurs de remplissage que l'on acceptera par la touche ENTRER du clavier, sinon il faudra faire un glisser avec la poignée de recopie puis passer par la balise active ou sélectionner la plage puis chercher l'outil dans le ruban (Accueil>Recopier) ou utiliser le raccourcis clavier CTRL + E (sélectionner la cellule saisie avant).

Exemples

Extraire une partie des caractères

Assembler de parties

Extraire et assembler

Astuce : Il suffit de saisir un exemple (pas forcement la 1ere ligne), sélectionner cette cellule puis utiliser le raccourcis clavier CTRL+E 😮.

L'outil Série : L'ancien outil

Accessible via le ruban Accueil>Recopier (groupe Édition) >Série...

Génération de séries - Outil Série

On retrouve ici les possibilités offertes par la poignée de recopie (hors Remplissage instantané) avec quelques options en plus.

Série en :

  • Si la série génère une ligne ou une colonne de valeurs.

Type :

  • Linéaire : Progression arithmétique. Le fonctionnement classique. On précise la valeur du pas en bas (la raison) de la fenêtre (par exemple +2 à chaque nouvelle valeur).
  • Géométrique : Progression géométrique. Solution non disponible avec la poignée de recopie. On précise la valeur du pas (la raison) en bas de la fenêtre (par exemple : x2 à chaque nouvelle valeur comme illustré par l'image).
  • Chronologique : Incrémentation selon jours, mois, années ou jours ouvrés selon l'option choisie dans Unité de temps.
  • Remplissage auto : Série correspondante à celle généré par la poignée de recopie (Option Valeurs du pas, Unité de temps ignorées).

Valeur du pas : La raison à utiliser.

Dernière valeur : Valeur d’arrêt de la série. Quand la valeur générée par Excel dépasse cette limite, Excel arrête de générer de nouvelles valeurs. On peut ne pas utiliser cette valeur (si on ne connait pas cette limite) mais il faudra alors sélectionner préalablement la plage où sera générer les valeurs (leur nombre dépendra de la taille de la plage).

Tendance : Permet de renvoyer les valeurs correspondantes à celles qui seraient générées par les fonctions.

  • TENDANCE : si Type Linéaire (correspondant aux points d'une courbe de type y = mx+b). Même résultat en faisant une recopie à partir de la sélection de 3 cellules contenant des valeurs numériques.
  • CROISSANCE : si Type Géométrique (correspondant aux points d'une courbe de type y = bmx).

Une limite infranchissable ?

L'incrémentation-décrémentation des valeurs numériques est limitée en valeurs par la limite d'Excel à manipuler des nombres ayant au maximum 15 chiffres significatifs. Ainsi on plafonne à 1 000 000 000 000 000 et à -1 000 000 000 000 000.

Pour écrire de plus grand nombre, on pourrait penser utiliser l'astuce de les saisir en tant que texte. Cela semble une bonne idée 😰.

Mais là, on est encore plus limité qu'avec les valeurs numériques !

On bute sur la valeur 4 294 967 295 correspondante à 232-1.

Je vous propose donc d'utiliser une macro pour aller au-delà de ces valeurs limites.

Private Declare PtrSafe Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Sub IncrementeValeurs()
    ' Objectif    : Générer une recopie incrémentée-décrémentée pouvant aller au-delà de :
    '                   > ± 1E+15 ( ± 1 000 000 000 000 000) pour les valeurs numériques.
    '                   > 4 294 967 295 pour les valeurs alphanumériques.
    ' Utilisation : Sélectionner une plage dont la 1ère ligne/colonne contient les valeurs de départ.
    '               Important : Commencer la sélection à partir des cellules ayant les valeurs de départ.
    '               Pour une recopie horizontale, maintenir la touche du clavier AltGr (à droite
    '                   de la barre d'espace) enfoncée lors de l'appel de la macro.
    ' Retour      : Valeurs suivant la même logique que la poignée de recopie sauf pour le cas du
    '                   passage en valeur négative pour les valeurs alphanumériques.
    '                   Ex : En faisant un glissé vers le haut out la gauche, on obtient
    '                        A2>A1>A0>A-1>A-2 et non A2>A1>A0>A1>A2.
    ' Auteur      : Arnaud (www.1forme.fr).
    ' Licence     : CC-BY-NC-SA (Vous pouvez diffuser/partager/modifier cette macro dans les
    '               même conditions, seulement à titre personnel et citant l'auteur/site d'origine.
    ' MAJ         : Conservation des 0 non significatifs de la partie numérique (01/2026)
    
    Dim rgnPlage        As Range
    Dim rgn             As Range
    Dim objRegEx        As Object
    Dim rngCellule      As Range
    Dim boKeyPressed    As Boolean
    Dim intPas          As Integer
    Dim intSigne        As Integer
    Dim rgDerCell       As Range
    
    On Error GoTo erreur
    If TypeName(Selection) <> "Range" Then _
        MsgBox "Sélectionner une plage avant d'exécuter la macro.", vbExclamation: Exit Sub
    Set rgnPlage = Selection
    Set objRegEx = CreateObject("VBScript.RegExp")
    objRegEx.Pattern = "^(.*?)(\d+)$"
    objRegEx.IgnoreCase = True
    objRegEx.Global = False
    
    Set rgDerCell = Selection.Cells(Selection.Cells.Count)
    'boKeyPressed = CBool(GetAsyncKeyState(vbKeyControl) And &H8000) ' Détecte si Ctrl est enfoncée
    boKeyPressed = CBool((GetAsyncKeyState(vbKeyControl) And &H8000) _
                     And (GetAsyncKeyState(&HA5) And &H8000))        ' Détecte si AltGr est enfoncée
    If boKeyPressed Then ' Recopie horizontal
        intPas = IIf(rgDerCell.Column > ActiveCell.Column, 1, -1)
        For Each rgn In rgnPlage.Rows
            Set rngCellule = IIf(intPas = 1, rgn.Cells(1, 1), rgn.Cells(1, rgn.Cells.Count))
            intSigne = IIf(rngCellule > 0, 1, -1)
            Call IncrementeVecteur(rgn, objRegEx, rngCellule, False, intPas, intSigne)
        Next
    Else                ' Recopie vertical
        intPas = IIf(rgDerCell.Row > ActiveCell.Row, 1, -1)
        For Each rgn In rgnPlage.Columns
            Set rngCellule = IIf(intPas = 1, rgn.Cells(1, 1), rgn.Cells(rgn.Cells.Count, 1))
            intSigne = IIf(rngCellule > 0, 1, -1)
            Call IncrementeVecteur(rgn, objRegEx, rngCellule, True, intPas, intSigne)
        Next
    End If
suite:
    Set rngCellule = Nothing
    Set rgDerCell = Nothing
    Set objRegEx = Nothing
    Set rgnPlage = Nothing
    Exit Sub
erreur:
    MsgBox Err.Description & "(" & Err.Number & ")", vbCritical, "Erreur procédure IncrementeValeurs"
    End
End Sub

Sub IncrementeVecteur(rgn As Range, objRegEx As Object, rngCellule As Range, _
                      boVertical, intPas As Integer, intSigne As Integer)
    ' Objectif    : Faire l'incrémentation-décrementation sur une colonne/ligne unique
    ' Appelée par : IncrementeValeurs
    Dim objMatches      As Object
    Dim strPrefix       As String
    Dim strSuffixNombre As String
    Dim intLenSuffix    As Integer ' Longeur de la partie décimale pour conserver les 0 non significatifs
    Dim nbCells         As Long
    Dim i               As Long
    Dim decValeur       As Variant
    Dim lgLigCol        As Long
    
    On Error GoTo erreur
    If Not IsEmpty(rngCellule.Value) Then
        If objRegEx.Test(rngCellule.Value) Then
            Set objMatches = objRegEx.Execute(rngCellule.Value)
            strPrefix = objMatches(0).SubMatches(0)
            strPrefix = IIf(strPrefix = "-", "", strPrefix)
            strSuffixNombre = objMatches(0).SubMatches(1)
            intLenSuffix = Len(strSuffixNombre)
            nbCells = rgn.Cells.Count
            If boVertical Then
                For i = 1 To nbCells - 1
                    lgLigCol = IIf(intPas = 1, i + 1, nbCells - i)
                    decValeur = CDec(strSuffixNombre) + i * intPas * intSigne
                    rgn.Cells(lgLigCol, 1).Value = FormatValue(decValeur * intSigne, strPrefix, intLenSuffix)
                Next
            Else
                For i = 1 To nbCells - 1
                    lgLigCol = IIf(intPas = 1, i + 1, nbCells - i)
                    decValeur = CDec(strSuffixNombre) + i * intPas * intSigne
                    rgn.Cells(1, lgLigCol).Value = FormatValue(decValeur * intSigne, strPrefix, intLenSuffix)
                Next
            End If
        End If
    End If
suite:
    Set objMatches = Nothing
    Exit Sub
erreur:
    MsgBox Err.Description & "(" & Err.Number & ")", vbCritical, "Erreur procédure IncrementeVecteur"
    End
End Sub

Private Function FormatValue(decValeur As Variant, strPrefix As String, intLenSuffix As Integer) As String
    ' Objectif    :  Conversion en texte des nombres dépassant ± 1E+15 dans le cas des
    '                   valeurs numériques (sans préfixe)
    ' Appelée par : IncrementeVecteur
    Dim strValeur As String
    
    strValeur = CStr(decValeur)
    strValeur = Right(String(intLenSuffix, "0") & strValeur, intLenSuffix) ' Ajout des 0 non significatifs
    If strPrefix = "" And (decValeur > 1E+15 Or decValeur < -1E+15) Then
        FormatValue = "'" & strValeur
    Else
        FormatValue = strPrefix & strValeur
    End If
    Exit Function
erreur:
    MsgBox Err.Description & "(" & Err.Number & ")", vbCritical, "Erreur fonction FormatValue"
    End
End Function

Démonstration de l'utilisation de la macro

Merci pour votre attention bienveillante.

Article intéressant ?

Cliquez sur une étoile pour noter cet article !

Note moyenne 0 / 5. Nombre de votes : 0

Aucun vote pour l'instant ! Soyez le premier à noter ce post.

Nous sommes désolés que cet article ne vous ait pas été utile !

Améliorons cet article !

Dites nous comment nous pouvons améliorer cet article ?

Publications similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *