XL 2016 Remplir automatiquement mon tableau excel à partir des données de mes devis

David10

XLDnaute Nouveau
Bonjour à tous!!
J'aimerais savoir si vous pouvez m'aider svp.
j'ai un devis pré-remplir que je dois complèter à chaque fois, et j'aimerais que les informations que je complète puissent apparaitre directement aussi dans mon tableau de données que j'ai sur la feuille2.

C'est à dire, si je complète mon devis en question avec le n°devis, la date et le montant et l'adresse du client, j'aimerais qu'un bouton vba, me permettra de complèter directement les données en question dans mon tableau(sur la feuille 2) après l'enregistrement du devis.

j'espère que c'est un peu claire pour vous, si quelqu'un peut m'aider ça serait sympa.
Merci pour vos retour
 
Solution
Bonjour,
Bonjour @Phil69970,

Dans le fichier joint une solution qui crée ou modifie une ligne de devis (si déjà existant) dans le tableau des devis, transformé également en tableau structuré.
Si la référence de devis existe déjà dans le tableau, alors l'utilisateur à le choix entre :
Modifier la ligne existante, En créer une nouvelle ou abandonner.
Ces trois actions sont confirmées par un message en fin de procédure

Cordialement

David10

XLDnaute Nouveau
Re

Voici le fichier

1)Il y a 3 cellules qui ne sont pas remplies en automatique
==>Ville , Type chantier, Référence

On peut y remédier très facilement....

2)Après copie on peut effacer le devis si tu le souhaites

3)J'ai transformé les données sur la 2eme feuille en tableau structuré
*Précision : Il ne doit jamais avoir de ligne vide dans un tableau structuré

*Merci de ton retour

@Phil69970
Merci pour la solution que tu m'a donné, j'ai reussi à traiter mon problème. j'ai pu relié mon devis à mon tableau excel
 

David10

XLDnaute Nouveau
Bonjour,
Bonjour @Phil69970,

Dans le fichier joint une solution qui crée ou modifie une ligne de devis (si déjà existant) dans le tableau des devis, transformé également en tableau structuré.
Si la référence de devis existe déjà dans le tableau, alors l'utilisateur à le choix entre :
Modifier la ligne existante, En créer une nouvelle ou abandonner.
Ces trois actions sont confirmées par un message en fin de procédure

Cordialement
Salut,
Merci pour votre aide hier. Ducoup j'ai appliqué le vba, mais à la fin j'ai le message suivant :

ERREUR 9 'L'indice n'appartient pas à la selection' c'est bizarre, j'ai vérifié deux foix.

Sub EnregistrerDevis()
Dim DataRow As Range
Dim RefDevis As String
Dim idxDevis As Variant
Dim action As String
action = "enregistré !" ' Pour message final

'
' Récupérer la référence du devis pour contrôle d'existence
RefDevis = ThisWorkbook.Sheets("Devis(2)").Range("C12")

With ThisWorkbook.Sheets("BDD-CHANTIERS").ListObjects("T_Devis")
'
' Chercher la référence du devis dans la colonne
idxDevis = Application.Match(RefDevis, .ListColumns("N°Devis").Range, 0)
'
' Si trouvée : devis déjà enregistré
If Not IsError(idxDevis) Then
'
' Demander ce que souhaite faire l'utilisateur
Select Case MsgBox("Un devis à la référence '" & RefDevis & "' semble déjà exister dans la table des devis." & vbCrLf & vbCrLf & _
"Modifiez le devis existant ?" & vbCrLf & vbCrLf & _
"Si vous cliquez sur 'Non' une nouvelle ligne sera créée." & vbCrLf & _
"Si vous cliquez sur 'Annuler' l'enregistrement n'aura pas lieu.", vbQuestion + vbYesNoCancel, "Enregistrer un devis")
'
' L'utilisateur à répondu oui, récupéré la ligne du devis pour modifications
Case vbYes
Set DataRow = .ListRows(idxDevis).Range
action = "modifié !"
' L'utilisateur à répondu 'annuler'
Case vbCancel
action = "abandon de l'enregistrement ou la modification !"
GoTo FIN
End Select
End If
'
' si aucune ligne alors en créer une
If DataRow Is Nothing Then
If .InsertRowRange Is Nothing Then
Set DataRow = .ListRows.Add().Range
Else
Set DataRow = .InsertRowRange
End If
End If
End With
'
' Ecriture des données dans la ligne
With ThisWorkbook.Sheets("Devis(2)")
DataRow(1, 2).Value = .Range("J10").Value ' Nom client
DataRow(1, 3).Value = .Range("C40").Value ' Désignation
DataRow(1, 4).Value = .Range("C41").Value ' Adresse
DataRow(1, 8).Value = .Range("C13").Value ' Date
DataRow(1, 9).Value = RefDevis ' Ref devis
DataRow(1, 10).Value = .Range("K47").Value ' Total HT
DataRow(1, 12).Value = .Range("K49").Value ' Total TTC
End With

FIN:
MsgBox "Devis '" & RefDevis & "'" & vbCrLf & action, vbInformation, "Enregistrer un devis"

End Sub
 

David10

XLDnaute Nouveau
Re

Voici le fichier

1)Il y a 3 cellules qui ne sont pas remplies en automatique
==>Ville , Type chantier, Référence

On peut y remédier très facilement....

2)Après copie on peut effacer le devis si tu le souhaites

3)J'ai transformé les données sur la 2eme feuille en tableau structuré
*Précision : Il ne doit jamais avoir de ligne vide dans un tableau structuré

*Merci de ton retour

@Phil69970
Salut,
Merci pour votre aide hier. Ducoup j'ai appliqué le vba, mais à la fin j'ai le message suivant :

ERREUR 9 'L'indice n'appartient pas à la selection' c'est bizarre, j'ai vérifié deux foix.

Sub EnregistrerDevis()
Dim DataRow As Range
Dim RefDevis As String
Dim idxDevis As Variant
Dim action As String
action = "enregistré !" ' Pour message final

'
' Récupérer la référence du devis pour contrôle d'existence
RefDevis = ThisWorkbook.Sheets("Devis(2)").Range("C12")

With ThisWorkbook.Sheets("BDD-CHANTIERS").ListObjects("T_Devis")
'
' Chercher la référence du devis dans la colonne
idxDevis = Application.Match(RefDevis, .ListColumns("N°Devis").Range, 0)
'
' Si trouvée : devis déjà enregistré
If Not IsError(idxDevis) Then
'
' Demander ce que souhaite faire l'utilisateur
Select Case MsgBox("Un devis à la référence '" & RefDevis & "' semble déjà exister dans la table des devis." & vbCrLf & vbCrLf & _
"Modifiez le devis existant ?" & vbCrLf & vbCrLf & _
"Si vous cliquez sur 'Non' une nouvelle ligne sera créée." & vbCrLf & _
"Si vous cliquez sur 'Annuler' l'enregistrement n'aura pas lieu.", vbQuestion + vbYesNoCancel, "Enregistrer un devis")
'
' L'utilisateur à répondu oui, récupéré la ligne du devis pour modifications
Case vbYes
Set DataRow = .ListRows(idxDevis).Range
action = "modifié !"
' L'utilisateur à répondu 'annuler'
Case vbCancel
action = "abandon de l'enregistrement ou la modification !"
GoTo FIN
End Select
End If
'
' si aucune ligne alors en créer une
If DataRow Is Nothing Then
If .InsertRowRange Is Nothing Then
Set DataRow = .ListRows.Add().Range
Else
Set DataRow = .InsertRowRange
End If
End If
End With
'
' Ecriture des données dans la ligne
With ThisWorkbook.Sheets("Devis(2)")
DataRow(1, 2).Value = .Range("J10").Value ' Nom client
DataRow(1, 3).Value = .Range("C40").Value ' Désignation
DataRow(1, 4).Value = .Range("C41").Value ' Adresse
DataRow(1, 8).Value = .Range("C13").Value ' Date
DataRow(1, 9).Value = RefDevis ' Ref devis
DataRow(1, 10).Value = .Range("K47").Value ' Total HT
DataRow(1, 12).Value = .Range("K49").Value ' Total TTC
End With

FIN:
MsgBox "Devis '" & RefDevis & "'" & vbCrLf & action, vbInformation, "Enregistrer un devis"

End Sub
 

Hasco

XLDnaute Barbatruc
Bonjour,

Tous les noms doivent correspondre dans le fichier qui contient la macro. Sinon, on est plus dans le même cas de figure.

Vérifiez que "T_Devis" correspond au nom d'un tableau structuré de la feuille 'Feuil1' du classeur qui contient la macro (ThisWorkbook)

Nous ne pourrons pas toujours être derrière vous et vos modifications pour adapter, c'est à vous d'essayer de comprendre ce à quoi correspondent les lignes de codes que nous vous donnons :

Que veut dire ThisWorkbook, Workbooks, Workbook, Sheets, Sheet, WorkSheets, Worksheet (avec un s et sans s finaux)

Tout ça nous ne pouvons l'apprendre à votre place.

Résumé :

Workbooks -> Collection des classeurs ouverts dans une instance excel
Workbook -> un classeur dans la collection des classeurs ouverts
Worksheets -> Collection des feuilles de travail d'un classeur ouvert
Sheets -> Collection de toutes les feuilles (Travail, graphiques macro xl4, etc..) d'un classeur ouvert
Sheet -> une feuille (de travail, graphique, macro xl4...) dans la collection des feuilles d'un classeur
Worksheet -> une feuille de travail (exclusivement) dans la collection des feuilles de travail
ListObjects -> Collection des tableaux structurés d'une feuille de travail
ListObject -> un tableau structuré dans la collection des tableaux structurés d'une feuille de travail
ListRows -> Collection des lignes d'un tableau structuré
ListRow -> Une ligne de tableau structuré.

Tous ces objets ont leur 'propriétés' et leur méthodes.

Par exemple pour ListObject vous pouvez en trouver la définition ici:

ThisWorkbook.Sheets("Feuil1").ListObjets("T_Devis") = Tableau structuré nommé T_Devis dans la collection des Tableaux structurés de la feuille nommée "Feuil1" dans le classeur qui contient la macro référencé par 'ThisWorkbook'



Cordialement
 

David10

XLDnaute Nouveau
Bonjour,

Tous les noms doivent correspondre dans le fichier qui contient la macro. Sinon, on est plus dans le même cas de figure.

Vérifiez que "T_Devis" correspond au nom d'un tableau structuré de la feuille 'Feuil1' du classeur qui contient la macro (ThisWorkbook)

Nous ne pourrons pas toujours être derrière vous et vos modifications pour adapter, c'est à vous d'essayer de comprendre ce à quoi correspondent les lignes de codes que nous vous donnons :

Que veut dire ThisWorkbook, Workbooks, Workbook, Sheets, Sheet, WorkSheets, Worksheet (avec un s et sans s finaux)

Tout ça nous ne pouvons l'apprendre à votre place.

Résumé :

Workbooks -> Collection des classeurs ouverts dans une instance excel
Workbook -> un classeur dans la collection des classeurs ouverts
Worksheets -> Collection des feuilles de travail d'un classeur ouvert
Sheets -> Collection de toutes les feuilles (Travail, graphiques macro xl4, etc..) d'un classeur ouvert
Sheet -> une feuille (de travail, graphique, macro xl4...) dans la collection des feuilles d'un classeur
Worksheet -> une feuille de travail (exclusivement) dans la collection des feuilles de travail
ListObjects -> Collection des tableaux structurés d'une feuille de travail
ListObject -> un tableau structuré dans la collection des tableaux structurés d'une feuille de travail
ListRows -> Collection des lignes d'un tableau structuré
ListRow -> Une ligne de tableau structuré.

Tous ces objets ont leur 'propriétés' et leur méthodes.

Par exemple pour ListObject vous pouvez en trouver la définition ici:


ThisWorkbook.Sheets("Feuil1").ListObjets("T_Devis") = Tableau structuré nommé T_Devis dans la collection des Tableaux structurés de la feuille nommée "Feuil1" dans le classeur qui contient la macro référencé par 'ThisWorkbook'



Cordialement
Ah merde c'est ma faute désolé, j'ai oublié de nommer mon tableau, dans mon nouveau fichier.. j'avais mis Devis au lieu de T_Devis.

Merci beaucoup pour ton aide, je suis un débutant désolé!!!
 

Hasco

XLDnaute Barbatruc
Re,

Le T_ devant le nom du tableau structuré, n'est qu'une convention d'écriture que j'ai fait mienne, mais qui permet de savoir (dans les formules par exemple) qu'on a à faire à un tableau structuré de données et non une plage de cellules normal ou autre chose.

De façon générale j'essaie de préfixer les noms de 1 à 3 lettres qui permettent de renseigner la nature des objets qu'ils désignent.

Cordialement
 

Phil69970

XLDnaute Accro
Re

@David10

D’où l’intérêt de mettre un fichier représentatif
Un fichier représentatif de 10 à 20 lignes avec tes attendus (avant/après) ET respectant le RGPD permettrait de comprendre le problème et de t'apporter une ou des réponses.

C'est quoi représentatif ?
- représentatif, même organisation des lignes et des colonnes, mêmes libellés, mêmes noms de feuilles...
- anonymisé, pas de données personnelles réelles tels nom, n° sécu, adresse ...
- simplifié, une quinzaine de lignes reproduisant l'ensemble des différents cas envisageables


*Éventuellement préciser l'ordre de grandeur des lignes à traiter, exemple mon fichier comporte 1 000 lignes ou bien 20 000 lignes ==> la méthodologie peut être différents.

Une demande claire donne très souvent une réponse rapide et qui correspond au mieux à la demande.

*Et ici cela aurait éviter les 10 derniers messages !! ;)

@Phil69970
 

Discussions similaires