Récupération de l'année d'une cellule au format "yy" et concaténation

Résolu
DESTIN8TE Messages postés 40 Statut Membre -  
DESTIN8TE Messages postés 40 Statut Membre -
Bonjour,

Désolé s'il y a un double post mais je n'ai pas arrêté de faire des recherches et pas moyen d'avoir une réponse clair et fonctionnelle.

Dans la première cellule d'un tableau je récupère la date actuelle avec NOW() au format d/m/yy h:nn,
dans la deuxième cellule, à l'heure actuelle, il s'agit d'un numéro qui est incrémenté,
maintenant je voudrais que dans la deuxième cellule, je récupère l'année au format "yy" de la première cellule en concaténant ce numéro.

Comme je ne connais pas trop le VBA, au tout début j'avais réussi à récupérer l'année au format "yy" et maintenant plus moyen de l'avoir dû au fait que j'ai modifié le code plusieurs fois pour essayer de concaténer ce numéro.
En clair je veux que se soit comme ceci :
19 - 2345

Voici un bout de code de ce que j'avais déjà fait (au passage le fichier excel est de quelqu'un d'autre)
Le texte en gras est le code que j'ai ajouté.

' Incrémente le n° du POST-IT puis Copie Colle la valeur
Range("C9").Select

Annee = "=Year(B9)"
Annee_formater = Format(Annee, "yy")
ActiveCell.Value = Annee_formater

'ActiveCell.FormulaR1C1 = "=R[1]C+1"
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Avec ce code je récupère toujours l'année au format "yyyy" alors que j'indique bien "yy" alors que j'ai déjà récupéré ce format.

Pour information, c'est un fichier qui est utilisé tout les jours toute l'année, ensuite un nouveau est créé mais ça ce n'est pas important.

Voilà ça parait bête mais pas moyen de trouver "les" solutions.
Et le pire c'est que comme je viens de commencer le VBA, j'ai du mal à m'en sortir avec les méthodes parce que des fois il faut les écrire comme ça :
...= "=Year(B9)" ou ...= Year("B9")

Alors est-ce que je suis pas futé ou alors il y a une cou**** dans le paté car des fois l'un marche et l'autre non et vice - versa et j'en pète des plombs.

Merci de vos réponses

7 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    [B9].Value = Format(Now, "yy") & "-" & [B9].Value
    1
    1. DESTIN8TE Messages postés 40 Statut Membre
       
      Bonjour et merci mais j'ai le même soucis, ça me le fait pour une seul ligne et après le champ est vide puis il revient à 1. Voici le résultat :


      Je pense que c'est le tiret qui est la cause de tout ça car il transforme le type de données de la cellule en chaîne de caractère.
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > DESTIN8TE Messages postés 40 Statut Membre
       
      peux-tu être plus précis, et donner des numéros de ligne au lieu de "aprés" et "puis".
      le code fourni est prévu pour la ligne 9.
      0
    3. DESTIN8TE Messages postés 40 Statut Membre
       
      Le code est prévu pour insérer une ligne à la ligne 9. A chaque fois qu'une ligne est insérer la première cellule de la ligne 9 récupère la date de maintenant (méthode NOW() ) ensuite dans dans la cellule de droite on incrément un numéro. Bien sûr, quand il n'y a aucune ligne, le numéro est 1 et ensuite ça s'incrémente à la suite. Par contre j'ai pensé à ça :


      Range("C9").Select     'Je sélectionne la cellule C9
      If [C9].Value = "" Then 'si la cellule C9 est vide
      [C9].Value = Format(Now, "yy") & " - " & 1 'alors j'ajoute à C9 l'année de la date actuelle au format "yy" concaténé avec un tiret et concaténé avec 1
      Else 'sinon
      Dim num As Integer
      num = Mid([C10].Value, 6) 'je récupère toutes les valeurs qui sont à partir du 6ème caractère dans num
      [C9].Value = Format(Now, "yy") & " - " & num + 1 'et je concaténe l'année avec un tiret et concaténe la valeur récupérée dans num.
      End If


      Question 1 : Mid =() renvoit une chaîne, un entier ou il s'adapte en fonction du type de données manipulé ?

      Question 2 : Si dans le résultat final on met un tiret, est-ce que la valeur de la cellule passe obligatoirement en chaîne de caractère ?
      0
    4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > DESTIN8TE Messages postés 40 Statut Membre
       
      mid renvoie une chaîne.
      comment un tiret pourrait-il représenter un nombre plutôt qu'une chaîne? tu n'as pas expliqué ce que tu voulais obtenir: un nombre affiché comme une chaîne? je pense que tu confonds le contenu de la cellule et l'affichage de ce contenu.
      0
    5. DESTIN8TE Messages postés 40 Statut Membre
       
      Bonjour,

      Bin oui c'est un peu bête comme question mais jai préféré la posé.
      C'est là le problème c'est que techniquement, exemple 19 - 2674, est une chaîne de caractère du coup. Donc dans cette chaîne, je veux juste récupérer le numéro après le tiret mais comme il est en String, j'ai utilisé CInt(num) et c'est au nievau de l'incrémentation qui ne fonctionne pas. Sinon le reste fonctionne. Voici comment j'ai utilisé CInt(num) :

      ...
      num = Mid([C10].Value, 6)
      [C9].Value = Format(Now, "yy") & " - " & CInt(num) + 1
      ...


      Je m'en mêle surtout les pinceaux.
      0
  2. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
     
    Bonjour
    si vous placez dans la cellule =YEAR(cell date), ça fonctionne sans VBA un fois la date entrée
    crtdlmnt
    0
    1. DESTIN8TE Messages postés 40 Statut Membre
       
      Merci mais je veux obligatoirement passer en VBA car j'utilise un bouton qui est affecté à une macro qui insert une ligne.
      0
  3. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Bonjour

    1) les "" sont superflus
    2) Format modifie le format d'affichage mais pas le nombre récupéré qui est toujours à 4 chiffres
    3) Si les années sont toutes postérieures à 2000 il suffit de soustraire 2000 pour avoir un nombre à 2 chiffres
    Annee=Year(B9)-2000
    Sinon on prend les 2 derniers chiffres avec :
    Annee=Right(Year(B9),2)

    Cdlmnt
    Via
    0
    1. DESTIN8TE Messages postés 40 Statut Membre
       
      Merci mais j'ai essayé les deux méthodes et la première me retourne -101 tant dit que la deuxième 99.
      J'en ai marre :'(
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bonjour tout ce beau monde

      Option Explicit
      '----------------------------------
      Sub xxx()
      Dim An As String * 2
      An = Format(Range("B9"), "yy")
      Range("C9") = An & "-" & Range("C9")
      End Sub
      0
    3. DESTIN8TE Messages postés 40 Statut Membre
       
      Merci michel_m, ça a marché pour la première ligne mais la suivante je n'ai rien à l'intérieur. Voici un sreen du résultat :
      0
    4. DESTIN8TE Messages postés 40 Statut Membre
       
      Ah oui et à quoi sert le "* 2" ?
      0
    5. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Et où avais tu indiqué qu'il s' agissait de plusieurs lignes ?

      pas très sérieux....


      le *2 indique la délibération d'un mot de 2 lettres
      0
  4. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    Bonjour,

    Peux tu nous poster un exemple de ton fichier ?
    Ou au moins nous poster le code complet de ta macro... qu'on voit comment tu as inséré le code dedans...

    Car, si tu as plusieurs lignes à traiter.. il faut, bien entendu, adapter le code que Michel t'a donné...

    0
    1. DESTIN8TE Messages postés 40 Statut Membre
       
      Et moi du coup je voudrais récupérer l'année de la cellule de gauche pour la mettre sur celle de droite en le concaténant avec le N° du Post - It ce qui ferait : "19 - 4696" (Le " - " s'agit d'un tiret et non d'une soustraction) et je ne veux pas utiliser cette méthode : "Annee=Year(B9)-2000" car je trouve que c'est de la mauvaise pratique en terme d'automatisation car si on passe en l'an 3000 on sera obliger de modifier le code, bon on a de la marge en terme d'année pour le modifier ^^ mais je préfére éviter ce genre de méthode.
      0
    2. DESTIN8TE Messages postés 40 Statut Membre
       
      Après je ne peux pas trop vous donner d'information sur ce fichier car il s'agit d'un fichier confidentiel, seulement les informations que je vous ai donné qui sont sans importance pour le monde extérieur.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. DESTIN8TE Messages postés 40 Statut Membre
     
    Voici la solution finale :
    '' Concatène l'année actuelle avec un n° de POST-IT incrémenté puis Copie Colle la valeur
            Range("C9").Select
            If [C10].Value = "" Then ' Si la cellule positionné
                [C9].Value = Format(Now, "yy") & " - " & [C10].Value + 1
            Else
                Dim num As Integer
                num = CInt(Mid([C10].Value, 6))
                [C9].Value = Format(Now, "yy") + " - " + CStr(num + 1)
            End If

    Ps : Le commentaire est de nature personnelle mais je l'ai laissé, on ne sait jamais, s'il peut vous éclaircir.
    0
  7. DESTIN8TE Messages postés 40 Statut Membre
     
    Ah excellent la communauté. Le jour où je créé mon compte, ça va j'aime bien.
    -1
  8. DESTIN8TE Messages postés 40 Statut Membre
     
    Bonjour,

    Oui le voici ( En gras c'est ce que j'ai ajouté au code) :

    Sub Insertion()

    On Error Resume Next
    ActiveSheet.ShowAllData

    ' Supprime les filtres

    Range("B8:W8").Select
    Selection.AutoFilter

    ' Selectionne la ligne 9, insère une ligne, copie les valeurs puis l'efface
    Rows("9:9").Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    Range("B10:AD10").Select
    Selection.AutoFill Destination:=Range("B9:AD10"), Type:=xlFillDefault
    Range("B9:AD10").Select
    Rows("9:9").Select
    Range("L9").Activate
    Rows("9:9").EntireRow.AutoFit
    Range("B9:W9").Select
    Selection.ClearContents
    Range("C9").Select

    ' Copie de la date du jour en B9
    Range("B9").Select
    ActiveCell.FormulaR1C1 = "=NOW()"
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

    ' Incrémente le n° du POST-IT puis Copie Colle la valeur
    Range("C9").Select

    Annee = "=Year(B9)"
    Annee_formater = Format(Annee, "yy")
    ActiveCell.Value = Annee_formater

    'ActiveCell.FormulaR1C1 = "=R[1]C+1"
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

    ' Mise en forme : Hauteur de ligne
    Rows("9:9").Select
    Rows("9:9").EntireRow.AutoFit

    ' Ajoute les filtres
    Range("B8:W8").Select
    Selection.AutoFilter
    Range("B8").Select
    ActiveWorkbook.Worksheets("DATA").AutoFilter.Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("DATA").AutoFilter.Sort.SortFields.Add Key:=Range( _
    "B8"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
    xlSortNormal
    With ActiveWorkbook.Worksheets("DATA").AutoFilter.Sort
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
    End With
    Range("C9").Select

    End Sub

    Voici le résultat de la macro sans ma modification.

    En sachant que le N° du Post It signifie le n-ième Post-It, donc comme sur le screen, le dernier est le 4695ième Post It.
    -1