Dupliquer données via combo

cheyenne63

XLDnaute Occasionnel
Bonjour
En feuille «BDFT» , ma base de données (tri alphabétique sur la colonne A).
Je voudrais qu’après l’ouverture de l’USF (bouton feuille 2) et après avoir fait un choix d’une valeur dans le combo, ça duplique (via le bouton «Valider») les valeurs associées à ce choix avec en colonne A la nouvelle désignation (indiquée dans le textbox).
Deux contraintes :
- La macro ne doit pas fonctionner (message spécifique) si le textbox est vide (message spécifique)
- La macro ne doit pas fonctionner (autre message spécifique) si le textbox est égal à une valeur déjà présente dans la colonne A de « BDFT »

Pour plus de clarté, j’ai inséré un exemple dans une 3° feuille avec en jaune les nouvelles lignes insérées après duplication de « Désignation 4 »

Merci d’avance et bonne journée
 

Pièces jointes

  • Duplique données.xlsm
    40.6 KB · Affichages: 31
  • Duplique données.xlsm
    40.6 KB · Affichages: 41

GADENSEB

XLDnaute Impliqué
Re : Dupliquer données via combo

Hello
vraiment génial ton code

Code:
If CB_Double.Value = True Then
f.Rows(LastLigne).Copy f.Cells(LastLigne + 1, 1)
f.Cells(LastLigne + 1, 1).Value = f.Cells(LastLigne + 1, 1) + 1
f.Cells(LastLigne + 1, 5).Value = "REEL"
End If


Et pourrez-ton imaginer qu'en plus il fasse sur multi-années, je m'explique :
- on garde la double saisie comme tu viens de me faire
et en plus à avec un checkbox "CB_5ans"
- on remultiplie ces lignes sur les 5 prochaines années
Donc DATESAISIE +360+360+360+360+360

Bien sur il faut que les 2 checkbox (CB_Double et CB_5ans)soit cochés

l'année de saisie s'incremente automatiquement dans ma Bdd en fonction de DATESAISIE

seul contrainte :
LIBELLE est une concaténation de POSTE , voir ce code


Code:
Private Sub POSTE_Change()

  If Me.POSTE.ListIndex = -1 And IsError(Application.Match(Me.POSTE, choix1, 0)) Then
   Me.POSTE.List = Filter(SansDoublons(choix1), Me.POSTE.Text, True, vbTextCompare)
   Me.POSTE.DropDown
  Else
    POSTE_click
  End If

End Sub
Private Sub POSTE_click()
  a = f.Range("C2:C" & f.[C65000].End(xlUp).Row).Value
  Dim b(): ReDim b(1 To UBound(a))
  j = 0
  For i = 1 To UBound(a)
     If a(i, 1) = Me.POSTE Then j = j + 1: '
  Next i
  LIBELLE = ValeurApresTiret(POSTE)
End Sub


Function ValeurApresTiret(ByVal ContenuComboBox As String) As Variant
'Recherche du tiret dans une chaine de caractére
  If ContenuComboBox <> "" Then ValeurApresTiret = Split(ContenuComboBox, " - ")(1) & " " & Format(Date, "mm/yyyy")
  
End Function

du coup, il faudrait que LIBELLE change "au fil des ans" lol


Est-ce assez clair ?
est-ce possible ?


Merci à toi

Bonne am

Seb
 

thebenoit59

XLDnaute Accro
Re : Dupliquer données via combo

Bonjour Seb.

C'est clair et c'est possible, mais ce n'est pas très beau comme code.

Code:
If CB_Double.Value = True Then
f.Rows(LastLigne).Copy f.Cells(LastLigne + 1, 1)
f.Cells(LastLigne + 1, 1).Value = f.Cells(LastLigne + 1, 1) + 1
f.Cells(LastLigne + 1, 5).Value = "REEL"
    If CB_5ans.Value = True Then
    f.Rows(LastLigne & ":" & LastLigne + 1).Copy f.Rows(LastLigne + 2).Resize(10)
            j = 1
        For i = LastLigne + 2 To LastLigne + 10 Step 2
            f.Cells(i, 2).Resize(2).Value = f.Cells(i, 2) + 365 * j
            f.Cells(i, 11).Resize(2).Value = Left(f.Cells(i, 11), Len(f.Cells(i, 11)) - 4) & Right(f.Cells(i, 11).Value, 4) + j
            j = j + 1
        Next i
        For i = LastLigne + 2 To LastLigne + 11
            f.Cells(i, 1).Value = f.Cells(i - 1, 1).Value + 1
        Next i
    End If
End If

Il y a sans aucun doute bien plus propre mais je n'ai pas vraiment cherché.
 

GADENSEB

XLDnaute Impliqué
Re : Dupliquer données via combo

Cela semble parfait !!
Un grand merci à toi

Par contre, je m'apercoie que je dois apporter une précision.
LIBELLE n'est pas toujours (mes excuses de l'oubli) rempli sous la forme que je t'ais indiqué.

Le standard "ELECTRICITE 04/2016", par exemple et parfois juste "COCOTTE" sans la notion de date

par fois je le remplie à la main et avec juste qq mots et du coup il n'est plus sous la forme du code et cela fait beuger ton code ....
est-ce modifiable ?
bonne am
Seb
 

thebenoit59

XLDnaute Accro
Re : Dupliquer données via combo

Le mieux est de vérifier si les 4 derniers caractères du Libellé correspond à un format numérique.

Code:
If CB_Double.Value = True Then
f.Rows(LastLigne).Copy f.Cells(LastLigne + 1, 1)
f.Cells(LastLigne + 1, 1).Value = f.Cells(LastLigne + 1, 1) + 1
f.Cells(LastLigne + 1, 5).Value = "REEL"
    If CB_5ans.Value = True Then
    f.Rows(LastLigne & ":" & LastLigne + 1).Copy f.Rows(LastLigne + 2).Resize(10)
            j = 1
        For i = LastLigne + 2 To LastLigne + 10 Step 2
            f.Cells(i, 2).Resize(2).Value = f.Cells(i, 2) + 365 * j
            If IsNumeric(Right(f.Cells(i, 11).Value, 4)) Then
                f.Cells(i, 11).Resize(2).Value = Left(f.Cells(i, 11), Len(f.Cells(i, 11)) - 4) & Right(f.Cells(i, 11).Value, 4) + j
            End If
            j = j + 1
        Next i
        For i = LastLigne + 2 To LastLigne + 11
            f.Cells(i, 1).Value = f.Cells(i - 1, 1).Value + 1
        Next i
    End If
End If
 

GADENSEB

XLDnaute Impliqué
Re : Dupliquer données via combo

Hello thebenoit59
Ton code est vraiment genial.


Code:
If CB_Double.Value = True Then
f.Rows(LastLigne).Copy f.Cells(LastLigne + 1, 1)
f.Cells(LastLigne + 1, 1).Value = f.Cells(LastLigne + 1, 1) + 1
f.Cells(LastLigne + 1, 5).Value = "REEL"
    If CB_5ans.Value = True Then
    f.Rows(LastLigne & ":" & LastLigne + 1).Copy f.Rows(LastLigne + 2).Resize(10)
            j = 1
        For i = LastLigne + 2 To LastLigne + 10 Step 2
            f.Cells(i, 2).Resize(2).Value = f.Cells(i, 2) + 365 * j
            If IsNumeric(Right(f.Cells(i, 11).Value, 4)) Then
                f.Cells(i, 11).Resize(2).Value = Left(f.Cells(i, 11), Len(f.Cells(i, 11)) - 4) & Right(f.Cells(i, 11).Value, 4) + j
            End If
            j = j + 1
        Next i
        For i = LastLigne + 2 To LastLigne + 11
            f.Cells(i, 1).Value = f.Cells(i - 1, 1).Value + 1
        Next i
    End If
End If



Et j'ai eu une idée pr le pousser encore plus.

La il tiens sur une valeur fixe : 10
5 ans x 2 (dans mon besoin je crée deux lignes :BUDGET et REEL)

Cette valeur fixe pourrait être variable....
Je m'explique : j'ai créé un combobox "MOISANNEES" qui peut être soit des mois soit des Années.
Et un textbox "RECURSIVITE" qui représente un nombre X

Donc on pourrait avoir 18 mois comme 18 ans....
Ce qui remplacerait la valeur fixe de 10 standard...

Donc les lignes seraient implantées, avec une DATESAISIE du 01/01/2016 par exemple :
- 18 mois : 36 lignes jusqu'au 01/06/2017
- 18 ans : 36 lignes jusqu'au 01/01/2034 :)

Tu crois que c'est réalisable ?
J’espère avoir été assez clair

Bonne journée,
merci de ton aide.

Sébastien
 

GADENSEB

XLDnaute Impliqué
Re : Dupliquer données via combo

hello
je cherche mais j'avoue que je ne sais pas trop où aller

j'imagine qu'il faut remplacer
Code:
LastLigne + 10 Step 2
par une variable

et

Code:
+ 365 * j
se définira pas en fonction que combobox "MOISANNEES" = Mois ou années ...

C'est bien cela ?

Bonne am
Seb
 

thebenoit59

XLDnaute Accro
Re : Dupliquer données via combo

Bonjour Seb.

Je me suis permis de modifier l'écriture du Libellé, en y ajoutant le caractère suivant : "|"
Cela sera plus simple pour modifier l'écriture avec la récursivité.
 

Pièces jointes

  • gadenseb - dupliquer données via combo.xls
    691 KB · Affichages: 23

GADENSEB

XLDnaute Impliqué
Re : Dupliquer données via combo

Hello :!!!

Encore une fois tt simplement parfait !!!

C'est une bonne idée d'avoir introduit "|" et d'avoir splité la macro d'insertion des données la premiére partie avec le texte peut etre du coup réutilisé autre part !!!

Un grand merci à toi !!


Bonne journée
Seb
 

Statistiques des forums

Discussions
312 684
Messages
2 090 916
Membres
104 698
dernier inscrit
miespetico