rajouter une ligne au tableau en copiant les données ds les cellules désignées.

blancolie

XLDnaute Impliqué
Bonjour,

dans ce fichier et l'onglet BDD_Fleurs, j'aimerais rajouter une ligne au tableau et copier le contenu de chaques cellules au fond rouge (tout en respectant les formats) dans les cellules dédier. ex couleur dans la colonne couleur. Plante dans la colonne plante etc etc. peut on incorporer un code pour me dire si la plante est déja présente ds la tableau ou pas. Pour cela, j'ai crée un petit cadre pour cela en mettant ok et si pas ok, impossible d'appuyer sur le bouton valid.

En vous remerciant d'avance
 

Pièces jointes

  • Classeur1 (22)-2.xlsm
    90.4 KB · Affichages: 16

soan

XLDnaute Barbatruc
Inactif
Bonjour blancolie,

Je te retourne ton fichier modifié.

* note que la dernière ligne utilisée du tableau est toujours la même : 504

* fais Ctrl Début ➯ ça va en haut de feuille ; regarde les infos des cellules rouges

* clique sur le bouton « Valid » (ou fais Ctrl e) ➯ ta nouvelle plante exotique
a été ajoutée en fin de tableau, sur la ligne 505 (je te laisse aller vérifier)

---------------------------------------------------------------------------------------------

* regarde la ligne 24 ; il y a : Agapanthus africanus ; Vivace ; Chombart

* en I10, mets : « Agapanthus africanus » ; en I16, choisis : « Plandanjou »

(ne modifie pas les infos des autres cellules rouges)

* fais Ctrl e ➯ ta plante a été modifiée selon les infos des cellules rouges :

Agapanthus africanus ; jaune ; Vivace ; Plandanjou ; G8 ; H.M

---------------------------------------------------------------------------------------------

Tu as écrit : « peut-on incorporer un code pour me dire si la plante est déjà présente
ds la tableau ou pas. »
; c'est fait dans la macro. ;)

Tu as écrit : « j'ai créé un petit cadre pour cela en mettant ok et si pas ok » ; je crois
bien que ce petit cadre est M10:M12 ; en tout cas, je ne m'en suis pas servi ; et tu
peux le supprimer : la macro n'en n'a pas besoin.


---------------------------------------------------------------------------------------------

Si tu as besoin d'une adaptation, n'hésite pas à demander.
À te lire pour avoir ton avis. :)


soan
 

Pièces jointes

  • Classeur 22 v2.xlsm
    94.8 KB · Affichages: 6
Dernière édition:

blancolie

XLDnaute Impliqué
Bonsoir.

Merci pour ton travail, c'est cool cela marche très Bien. Oui effectivement pas besoin de mon peti cadre car ta macro si on retape la même plante, cela si j'ai bien compris cela la modifiera si modification il y a.

Peut-être que même si la boite de dialogue nous indique que la ligne a bien été inséré, le curseur pourrait se caler sur le rajout.

J'essaye de comprendre ton code et oui le vba et moi, nous sommes pas fait pour nous entendre (lol)

je vois que tu as déclaré plusieurs variables et les variables on peut les appeler comme on veut. pour toi tes variables sont lig, cel, plante$ et lig&.

le & cela represente quoi ? $ cela represente ou un raccourci pour dire que c'est string.

ces 2 lignes suivantes :

Set cel = Columns(7).Find(plante, , -4163, 1, 1)
If Not cel Is Nothing Then
lig = cel.Row: b = 1 'plante trouvée ; b = 1

-4163, 1, 1 cela représente quoi ?

Lig : ligne ; cel=cellule et plante, c'est pas ma plage nommée ? ma plage nommée plantes c'est avec un s donc pas cela.

en tout cas merci pour ton travail.
 

soan

XLDnaute Barbatruc
Inactif
Bonsoir blancolie,

Nouvelle version du fichier :

a) j'ai supprimé le petit cadre inutile ; b) le « curseur » va devant la ligne
qui a été ajoutée ou modifiée, colonne F (c'est mieux que colonne G, car
ça évite d'écraser accidentellement le nom de la plante).


---------------------------------------------------------------------------------------

Réponses à tes diverses questions :

* Dim plante$ est idem que Dim plante As String ; et c'est le nom de la plante,
qui est en I10 ; ce n'est pas ton nom défini plantes, qui fait référence à :
=T_BDDTECHNIQUE[Plantes]

* Dim lig& est idem que Dim lig As Long

* Set cel = Columns(7).Find(plante, , -4163, 1, 1) : c'est idem que :
Set cel = Columns("G").Find(plante, , xlValues, xlWhole, xlByRows)

Ça recherche le nom de la plante (I10) en colonne G ; retour :
* si non trouvé : cel = Nothing ➯ lig = n° de la dernière ligne du tableau + 1
* si trouvé : cel = cellule où la plante a été trouvée ; lig = n° ligne de cel ;
b = 1 pour indiquer que la plante a été trouvée (sinon, b reste à 0).

---------------------------------------------------------------------------------------

Suggestion : comme maintenant le « curseur » va devant la ligne qui a été
ajoutée ou modifiée, tu pourrais supprimer les messages de la boîte de
dialogue ; si ça te tente, alors remplace ces 6 lignes de code VBA :


VB:
    If b = 0 Then
      .Value = plante                         'nom plante
      MsgBox "Nouvelle plante, ajoutée en fin de liste.", 64
    Else
      MsgBox "Plante modifiée en ligne " & lig & ".", 48
    End If
par cette seule ligne de code :
VB:
    If b = 0 Then .Value = plante 'nom plante
soan
 

Pièces jointes

  • Classeur 22 v3.xlsm
    95.1 KB · Affichages: 4

soan

XLDnaute Barbatruc
Inactif
Bonjour blancolie,

Tu as écrit : « (7) , je pense que c'est 7 colonnes »

Non, c'est : Columns(7) est la colonne n° 7, donc idem que Columns("G")

car : A = 1ère colonne ; B = 2ème colonne ; C = 3ème colonne ; ... ;
F = 6ème colonne ; G = 7ème colonne

------------------------------------------

La variable plante$ contient le nom de la plante que tu as saisi en i10,
par exemple : « Agapanthus africanus ».

Avec Set cel = Columns("G").Find(plante, , xlValues, xlWhole, xlByRows)

ou Set cel = Columns(7).Find(plante, , -4163, 1, 1) :

La méthode .Find() cherche en colonne G : « Agapanthus africanus » ;
cette recherche est faite par valeur (-4163 : idem que xlValues) ;
ça cherche le mot entier « Agapanthus africanus » (premier 1 : idem
que xlWhole ; si j'avais voulu chercher une partie seulement, j'aurais
mis 2 : idem que xlPart)
; ça fait la recherche verticalement, ligne
après ligne (deuxième 1 : idem que xlByRows ; si j'avais voulu faire
une recherche horizontale, colonne après colonne, j'aurais mis 2 :
idem que xlByColumns)
.

Les 2 instructions sont identiques et ont le même résultat ; je préfère
la 2ème car elle est plus courte à écrire et à lire ; note bien que
dans les 2 cas, je n'ai pas mis de 2ème argument, d'où la double
virgule ; ce 2ème paramètre (facultatif) est pour After, qui est
utile uniquement si on fait une recherche à partir de l'interface
utilisateur.

------------------------------------------

Liens

Pour des infos plus complètes sur la méthode Range.Find,
je te laisse lire ce lien.

Pour apprendre le chinois (mandarin), tu as ce lien.

soan
 

soan

XLDnaute Barbatruc
Inactif
Bonjour blancolie,

La partie consacrée à une recherche pour éviter de copier
la même plante dans le tableau est constituée par :

1) La ligne du Find(), qui fait la recherche :
VB:
Set cel = Columns(7).Find(plante, , -4163, 1, 1)
2) La partie Else .. End If du test complet suivant :
VB:
  If Not cel Is Nothing Then
    lig = cel.Row: b = 1 'plante trouvée ; b = 1
  Else 'plante non trouvée ; b reste à 0
    lig = ActiveSheet.ListObjects("T_BDDTECHNIQUE").ListRows.Count + 19
  End If
Ça correspond donc à : si cel Is Nothing, le n° de ligne à utiliser est :
celui de la dernière ligne du tableau + 19 (car la ligne des en-têtes
est la ligne 18, et la 1ère ligne de données du tableau est la n° 19).

-------------------------------------------------------------------------------

Note bien qu'avec les 3 lignes de code VBA ci-dessous, on écrit le nom
de la plante seulement si plante n'a pas été trouvée ; en effet, si plante
a été trouvée, c'est inutile de réécrire de nouveau ce nom. ;)

Code:
    If b = 0 Then
      .Value = plante                         'nom plante
      MsgBox "Nouvelle plante, ajoutée en fin de liste.", 64
soan
 

blancolie

XLDnaute Impliqué
Ok merci pour les explications Soan, je comprends mieux, j'essaye lol.

je vais poster une nouvelle discussion ces jours ci concernant une recherche avec plusieurs critères avec restitution (je veux pas que cela soit un filtrage)

Merci pour les explications.
 

soan

XLDnaute Barbatruc
Inactif
Bonsoir,

Ton fichier en retour.

Je te laisse faire les tests. ;)

C'est vrai que c'est assez compliqué ; la difficulté est surtout due au fait qu'en bas,
dans le tableau T_Datas, les données ne sont pas dans le même ordre qu'en haut,
dans le « masque de saisie » ; il y a un seul moyen pour y arriver correctement :
il faut être très méthodique et rigoureux !

Dans une ligne comme celle-ci :

VB:
If [P7] <> "" Then .Offset(, 1) = [P7]       'Fournisseur
les cellules (entre crochets) sont les cellules du masque de saisie (la même cellule
à gauche et à droite) ; pour le .Offset(, 1) qui est au milieu, le 1 signifie : 1 colonne
à droite de la colonne F (Plante) ; donc bien sûr, il faut mettre le bon décalage
horizontal pour chaque donnée à copier.

Tu pourras remarquer que pour les 12 mois, au lieu de mettre 12 lignes de code
du même genre, j'ai utilisé cette boucle de 3 lignes de code seulement :

VB:
For i = 0 To 11                              'Mois J à D
  If [W16].Offset(, i) <> "" Then .Offset(, 17 + i) = [W16].Offset(, i)
Next i
bien sûr, j'ai dû ajouter la variable i dans la ligne Dim (2ème ligne de la sub).

N'oublie pas que le nom de la Plante ne doit pas être dans la même partie,
car vu qu'il n'est pas écrit en cas de modification, mais seulement en cas
d'ajout, il est placé plus bas, ainsi :

VB:
If b = 0 Then
  .Value = plante                            'Plante
  MsgBox "Nouvelle plante, ajoutée en fin de liste.", 64
Else
Code VBA complet :
Code:
Option Explicit

Sub LignePlante()
  If ActiveSheet.Name <> "BDD_FLEURS" Then Exit Sub
  Dim cel As Range, plante$, lig&, b As Byte, i As Byte
  plante = [P9]: If plante = "" Then Exit Sub
  Application.ScreenUpdating = 0
  Set cel = Columns(6).Find(plante, , -4163, 1, 1)
  If Not cel Is Nothing Then
    lig = cel.Row: b = 1 'plante trouvée ; b = 1
  Else 'plante non trouvée ; b reste à 0
    lig = ActiveSheet.ListObjects("T_Datas").ListRows.Count + 27
  End If
  With Cells(lig, 6)
    If [P7] <> "" Then .Offset(, 1) = [P7]       'Fournisseur
    If [P11] <> "" Then .Offset(, 7) = [P11]     'Catégorie
    If [P13] <> "" Then .Offset(, 12) = [P13]    'Couleur Fleurs
    If [P15] <> "" Then .Offset(, 11) = [P15]    'Couleurs Feuilles
    If [P17] <> "" Then .Offset(, 14) = [P17]    'Hauteur
    If [P19] <> "" Then .Offset(, 15) = [P19]    'Largeur
    If [P21] <> "" Then .Offset(, 29) = [P21]    'Densité
    If [P23] <> "" Then .Offset(, 16) = [P23]    'Port
    If [W7] <> "" Then .Offset(, 10) = [W7]      'Mellifère
    If [W9] <> "" Then .Offset(, 13) = [W9]      'Inflorescence
    If [W11] <> "" Then .Offset(, 9) = [W11]     'Attrait de la plante
    If [W13] <> "" Then .Offset(, 8) = [W13]     'Contenant
    If [W18] <> "" Then .Offset(, 2) = [W18]     'Marché
    For i = 0 To 11                              'Mois J à D
      If [W16].Offset(, i) <> "" Then .Offset(, 17 + i) = [W16].Offset(, i)
    Next i
    Application.Goto .Offset(, -1), True: Application.ScreenUpdating = -1
    If b = 0 Then
      .Value = plante                            'Plante
      MsgBox "Nouvelle plante, ajoutée en fin de liste.", 64
    Else
      MsgBox "Plante modifiée en ligne " & lig & ".", 48
    End If
  End With
End Sub
soan
 

Pièces jointes

  • BDD_fleurs v2.xlsm
    81.4 KB · Affichages: 8
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
Bonsoir blancolie,

Merci pour ton retour ! :)

Tu as gagné des infos supplémentaires :

* en H7 : choisis "Fanfelle" ➯ tableau filtré sur le fournisseur "Fanfelle"

* en H11 : choisis "Vivaces" ➯ tableau filtré sur "Fanfelle" et "Vivaces"

* en H11 : appuie sur la touche Suppr pour effacer "Vivaces" ➯ défiltrage :
la colonne "Catégorie" n'est plus filtrée ➯ retour à la situation précédente :
tableau filtré sur "
Fanfelle" uniquement.

* en H7 : appuie sur la touche Suppr pour effacer "Fanfelle" ➯ défiltrage :
la colonne "Fournisseurs" n'est plus filtrée ➯ retour à la situation précédente :
tableau non filtré (t'as même pas eu besoin d'cliquer le bouton EFFACER). ;)

mais bon, peut-être que t'avais déjà remarqué tout ça au cours de tes essais ? :p


soan
 

Discussions similaires