VBA pour la lecture d'une colonne Excel ensuite recherche dans BD puis word
Bonjour, je suis nouveau sur ce forum qui d'ailleurs m'a beaucoup dans le passé (sans m’être inscrit) et je remercie la totalités des membres l'aide apporter sur les différents topic, aujourd'hui je me retrouve dans une galère à manipuler plusieurs fichiers excel word en même temps, étant totalement novice en programmation je me retrouve à passer des heures voir des jours ...
Voici ce que je souhaite faire :
- • Récupérer dans la colonne A1 jusqu’à A30 les différents numéros d’articles qui se trouve dans le fichier DE
• Pour ensuite les rechercher dans le fichier BD en reprenant la totalité du tableau qui se trouve dans le fichier BD pour ensuite les coller dans un fichier Word
Je vous mets en PJ une image ainsi que le fichier DE et BD afin que vous ayez une idée plus claire,
Mon objectif est de pouvoir automatiser cette manipulation au travers d'un code VBA,
Pourriez vous m'aidez SVP, Pensez vous que cela est faisable ?
En vous remerciant par avance,
Bonjour Nawaazs,
Une question : Les tableaux du classeur "BD" ont-ils tous les mêmes dimensions (6 lignes x 4 colonnes) ?
Bonjour Nawaazs,
Une question : Les tableaux du classeur "BD" ont-ils tous les mêmes dimensions (6 lignes x 4 colonnes) ?
Bonjour GVIALLES,
Je te remercie pour ce retour, en ce qui concerne les dimensions, les tableaux ont bien 4 colonnes mais les lignes sont différents en en fonction des prestations, tu peux en avoir 6 comme 12 voir plus,
En espérant avoir répondu à ton interrogations,
Nawaazs,
Du coup, comment peut-on déterminer la fin des tableaux ?
Peux-tu fournir un BD.xlsx plus proche de la réalité ?
Nawaazs,
Du coup, comment peut-on déterminer la fin des tableaux ?
Peux-tu fournir un BD.xlsx plus proche de la réalité ?
GVIALLES,
Je m'excuse, rectification, il y a bien 6 ligne et 4 colonnes,
Comme convenu ci joint un exemple rapprochant un peu de la réalité,
Bonsoir Nawaazs,
Je te propose de modifier la feuille 'DE' de la façon suivante:
- on transforme la liste des articles en un tableau nommé "TableauArticles"
- on ajoute une cellule nommé "BD" dans la quelle on stocke le nom du classeur BD
- on ajoute un bouton pour déclencher la création des documents WORD
On ajoute le code suivant :
Option Explicit
Sub createDocs()
Const cNbLignes = 3
Dim oAppWORD As Object
Dim oWK As Workbook
Dim oSheetArticles As Worksheet
Dim oSheetBD As Worksheet
Dim oOL As ListObject
Dim oCell As Range, oCellDB As Range
Dim oRangeFind As Range
Dim oRangeBD As Range
Dim oDoc As Word.Document
Dim sDBFileName As String, sDocname As String
Dim lFirstRow As Long, lLastRow As Long
Dim sArticle As String
Dim lCount As Long
'On affecte la feuille contenant les articles
Set oSheetArticles = ThisWorkbook.Worksheets(1)
'On affecte la listobjet contenant les articles
Set oOL = oSheetArticles.ListObjects("TableauArticles")
'On constitue le nom du classeur BD
sDBFileName = ThisWorkbook.Path & "\" & ThisWorkbook.Names("BD").RefersToRange.Value
'On ouvre le classeur BD
Set oWK = Application.Workbooks.Open(sDBFileName, , True)
ActiveWindow.Visible = False
'On affecte la feuille DB contenant les tableaux
Set oSheetBD = oWK.Worksheets(1)
'On affecte l'objet WORD
Set oAppWORD = CreateObject("Word.Application")
'On boucle sur la liste des articles
For Each oCell In oOL.DataBodyRange.Columns(1).Cells
sArticle = oCell.Value
'Recherche de l'articles dans la BD
With oSheetBD.UsedRange
'Si l'article est dans le 1ère cellule
If InStr(1, .Cells(1, 1), sArticle) > 0 Then
lFirstRow = 1
Else
'Sinon utilisation de la méthode Find
Set oRangeFind = .Find(sArticle, After:=.Cells(1, 1), LookIn:=xlValues, LookAt:=xlPart _
, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True)
If Not oRangeFind Is Nothing Then
'Si l'article est trouvé dans la BD
lFirstRow = oRangeFind.Row
Else
'Sinon
lFirstRow = 0
End If
End If
If lFirstRow > 0 Then
'On recherche de la dernière ligne du bloc soit 3 fois la référence de l'article
lLastRow = oSheetBD.UsedRange.SpecialCells(xlCellTypeLastCell).Row
Set oRangeBD = oSheetBD.Range(oSheetBD.Cells(lFirstRow + 1, 1), oSheetBD.Cells(lLastRow, 1))
lCount = 0
For Each oCellDB In oRangeBD.Cells
If Left(oCellDB.Value, Len(sArticle)) = sArticle Then
lCount = lCount + 1
'Si le nombre limite d'occurences (3) est atteinte
If lCount = cNbLignes Then
lLastRow = oCellDB.Row
'Si la cellule est fusionnée, on inclut les lignes de la fusion
If oCellDB.MergeCells Then
lLastRow = lLastRow + oCellDB.MergeArea.Rows.Count - 1
End If
'On sort
Exit For
End If
End If
Next
'On affecte la plage à copier
Set oRangeBD = oSheetBD.Range(oSheetBD.Cells(lFirstRow, 1), oSheetBD.Cells(lLastRow, 4))
'On copie la plage
oRangeBD.Copy
'On créé un nouveau document WORD
Set oDoc = oAppWORD.Documents.Add
'On y colle la plage EXCEL
oDoc.Content.Paste
'On affecte le bord gauche du tableau dans le document
oDoc.Tables(1).Rows.SetLeftIndent LeftIndent:=-63.8, RulerStyle:=wdAdjustNone
'On construit le nom du document WORD
sDocname = ThisWorkbook.Path & "\" & "Doc_" & sArticle & ".docx"
'On sauvegarde le document
oDoc.SaveAs2 sDocname
'On ferme le document
oDoc.Close
Set oDoc = Nothing
End If
End With
Next
MsgBox "Création des documents WORD terminée!", vbExclamation
'On fait le ménage
oWK.Close False
oAppWORD.Quit
Set oAppWORD = Nothing
Set oDoc = Nothing
Set oWK = Nothing
Set oSheetBD = Nothing
Set oOL = Nothing
Set oCell = Nothing
End SubPour la cohérence, j'ai dû apporter une modification au classeur "BD"
Je joins mon classeur de test et le classeur BD modifié.
Bonsoir Nawaazs,
Je te propose de modifier la feuille 'DE' de la façon suivante:
- on transforme la liste des articles en un tableau nommé "TableauArticles"
- on ajoute une cellule nommé "BD" dans la quelle on stocke le nom du classeur BD
- on ajoute un bouton pour déclencher la création des documents WORD
On ajoute le code suivant :
Option Explicit Sub createDocs() Const cNbLignes = 3 Dim oAppWORD As Object Dim oWK As Workbook Dim oSheetArticles As Worksheet Dim oSheetBD As Worksheet Dim oOL As ListObject Dim oCell As Range, oCellDB As Range Dim oRangeFind As Range Dim oRangeBD As Range Dim oDoc As Word.Document Dim sDBFileName As String, sDocname As String Dim lFirstRow As Long, lLastRow As Long Dim sArticle As String Dim lCount As Long 'On affecte la feuille contenant les articles Set oSheetArticles = ThisWorkbook.Worksheets(1) 'On affecte la listobjet contenant les articles Set oOL = oSheetArticles.ListObjects("TableauArticles") 'On constitue le nom du classeur BD sDBFileName = ThisWorkbook.Path & "\" & ThisWorkbook.Names("BD").RefersToRange.Value 'On ouvre le classeur BD Set oWK = Application.Workbooks.Open(sDBFileName, , True) ActiveWindow.Visible = False 'On affecte la feuille DB contenant les tableaux Set oSheetBD = oWK.Worksheets(1) 'On affecte l'objet WORD Set oAppWORD = CreateObject("Word.Application") 'On boucle sur la liste des articles For Each oCell In oOL.DataBodyRange.Columns(1).Cells sArticle = oCell.Value 'Recherche de l'articles dans la BD With oSheetBD.UsedRange 'Si l'article est dans le 1ère cellule If InStr(1, .Cells(1, 1), sArticle) > 0 Then lFirstRow = 1 Else 'Sinon utilisation de la méthode Find Set oRangeFind = .Find(sArticle, After:=.Cells(1, 1), LookIn:=xlValues, LookAt:=xlPart _ , SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True) If Not oRangeFind Is Nothing Then 'Si l'article est trouvé dans la BD lFirstRow = oRangeFind.Row Else 'Sinon lFirstRow = 0 End If End If If lFirstRow > 0 Then 'On recherche de la dernière ligne du bloc soit 3 fois la référence de l'article lLastRow = oSheetBD.UsedRange.SpecialCells(xlCellTypeLastCell).Row Set oRangeBD = oSheetBD.Range(oSheetBD.Cells(lFirstRow + 1, 1), oSheetBD.Cells(lLastRow, 1)) lCount = 0 For Each oCellDB In oRangeBD.Cells If Left(oCellDB.Value, Len(sArticle)) = sArticle Then lCount = lCount + 1 'Si le nombre limite d'occurences (3) est atteinte If lCount = cNbLignes Then lLastRow = oCellDB.Row 'Si la cellule est fusionnée, on inclut les lignes de la fusion If oCellDB.MergeCells Then lLastRow = lLastRow + oCellDB.MergeArea.Rows.Count - 1 End If 'On sort Exit For End If End If Next 'On affecte la plage à copier Set oRangeBD = oSheetBD.Range(oSheetBD.Cells(lFirstRow, 1), oSheetBD.Cells(lLastRow, 4)) 'On copie la plage oRangeBD.Copy 'On créé un nouveau document WORD Set oDoc = oAppWORD.Documents.Add 'On y colle la plage EXCEL oDoc.Content.Paste 'On affecte le bord gauche du tableau dans le document oDoc.Tables(1).Rows.SetLeftIndent LeftIndent:=-63.8, RulerStyle:=wdAdjustNone 'On construit le nom du document WORD sDocname = ThisWorkbook.Path & "\" & "Doc_" & sArticle & ".docx" 'On sauvegarde le document oDoc.SaveAs2 sDocname 'On ferme le document oDoc.Close Set oDoc = Nothing End If End With Next MsgBox "Création des documents WORD terminée!", vbExclamation 'On fait le ménage oWK.Close False oAppWORD.Quit Set oAppWORD = Nothing Set oDoc = Nothing Set oWK = Nothing Set oSheetBD = Nothing Set oOL = Nothing Set oCell = Nothing End SubPour la cohérence, j'ai dû apporter une modification au classeur "BD"
Je joins mon classeur de test et le classeur BD modifié.
Bonjour GVIALLES,
Je te remercie pour ce ton travail, je test le code et je te fais un retour,
Encore une fois Merci beaucoup
Pour le moment je laisse ouvert le sujet, si au cas ou .... mais en tout cas merci beaucoup
Bonjour GVIALLES,
Je me permets de revenir vers toi, ayant essayer le code cela m'affiche un message d'erreur qui est :
Erreur d'exécution 9 :
L'indice ne n'appartient pas à la selection,
En attendant ton retour,
Bonsoir Nawaazs,
Je te propose de modifier la feuille 'DE' de la façon suivante:
- on transforme la liste des articles en un tableau nommé "TableauArticles"
- on ajoute une cellule nommé "BD" dans la quelle on stocke le nom du classeur BD
- on ajoute un bouton pour déclencher la création des documents WORD
On ajoute le code suivant :
Option Explicit Sub createDocs() Const cNbLignes = 3 Dim oAppWORD As Object Dim oWK As Workbook Dim oSheetArticles As Worksheet Dim oSheetBD As Worksheet Dim oOL As ListObject Dim oCell As Range, oCellDB As Range Dim oRangeFind As Range Dim oRangeBD As Range Dim oDoc As Word.Document Dim sDBFileName As String, sDocname As String Dim lFirstRow As Long, lLastRow As Long Dim sArticle As String Dim lCount As Long 'On affecte la feuille contenant les articles Set oSheetArticles = ThisWorkbook.Worksheets(1) 'On affecte la listobjet contenant les articles Set oOL = oSheetArticles.ListObjects("TableauArticles") 'On constitue le nom du classeur BD sDBFileName = ThisWorkbook.Path & "\" & ThisWorkbook.Names("BD").RefersToRange.Value 'On ouvre le classeur BD Set oWK = Application.Workbooks.Open(sDBFileName, , True) ActiveWindow.Visible = False 'On affecte la feuille DB contenant les tableaux Set oSheetBD = oWK.Worksheets(1) 'On affecte l'objet WORD Set oAppWORD = CreateObject("Word.Application") 'On boucle sur la liste des articles For Each oCell In oOL.DataBodyRange.Columns(1).Cells sArticle = oCell.Value 'Recherche de l'articles dans la BD With oSheetBD.UsedRange 'Si l'article est dans le 1ère cellule If InStr(1, .Cells(1, 1), sArticle) > 0 Then lFirstRow = 1 Else 'Sinon utilisation de la méthode Find Set oRangeFind = .Find(sArticle, After:=.Cells(1, 1), LookIn:=xlValues, LookAt:=xlPart _ , SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True) If Not oRangeFind Is Nothing Then 'Si l'article est trouvé dans la BD lFirstRow = oRangeFind.Row Else 'Sinon lFirstRow = 0 End If End If If lFirstRow > 0 Then 'On recherche de la dernière ligne du bloc soit 3 fois la référence de l'article lLastRow = oSheetBD.UsedRange.SpecialCells(xlCellTypeLastCell).Row Set oRangeBD = oSheetBD.Range(oSheetBD.Cells(lFirstRow + 1, 1), oSheetBD.Cells(lLastRow, 1)) lCount = 0 For Each oCellDB In oRangeBD.Cells If Left(oCellDB.Value, Len(sArticle)) = sArticle Then lCount = lCount + 1 'Si le nombre limite d'occurences (3) est atteinte If lCount = cNbLignes Then lLastRow = oCellDB.Row 'Si la cellule est fusionnée, on inclut les lignes de la fusion If oCellDB.MergeCells Then lLastRow = lLastRow + oCellDB.MergeArea.Rows.Count - 1 End If 'On sort Exit For End If End If Next 'On affecte la plage à copier Set oRangeBD = oSheetBD.Range(oSheetBD.Cells(lFirstRow, 1), oSheetBD.Cells(lLastRow, 4)) 'On copie la plage oRangeBD.Copy 'On créé un nouveau document WORD Set oDoc = oAppWORD.Documents.Add 'On y colle la plage EXCEL oDoc.Content.Paste 'On affecte le bord gauche du tableau dans le document oDoc.Tables(1).Rows.SetLeftIndent LeftIndent:=-63.8, RulerStyle:=wdAdjustNone 'On construit le nom du document WORD sDocname = ThisWorkbook.Path & "\" & "Doc_" & sArticle & ".docx" 'On sauvegarde le document oDoc.SaveAs2 sDocname 'On ferme le document oDoc.Close Set oDoc = Nothing End If End With Next MsgBox "Création des documents WORD terminée!", vbExclamation 'On fait le ménage oWK.Close False oAppWORD.Quit Set oAppWORD = Nothing Set oDoc = Nothing Set oWK = Nothing Set oSheetBD = Nothing Set oOL = Nothing Set oCell = Nothing End SubPour la cohérence, j'ai dû apporter une modification au classeur "BD"
Je joins mon classeur de test et le classeur BD modifié.
Re Bonjour GVIALLES,
Ne prend pas en compte mon dernier message, effectivement le code fonctionne parfaitement,
Une petite erreur de Copier/coller de ma part,
Désolé,
Bonjour GVIALLES,
Je me permets de revenir vers toi, ayant essayer le code cela m'affiche un message d'erreur qui est :
Erreur d'exécution 9 :
L'indice ne n'appartient pas à la selection,
En attendant ton retour,
Bonsoir Nawaazs,
Je te propose de modifier la feuille 'DE' de la façon suivante:
- on transforme la liste des articles en un tableau nommé "TableauArticles"
- on ajoute une cellule nommé "BD" dans la quelle on stocke le nom du classeur BD
- on ajoute un bouton pour déclencher la création des documents WORD
On ajoute le code suivant :
Option Explicit Sub createDocs() Const cNbLignes = 3 Dim oAppWORD As Object Dim oWK As Workbook Dim oSheetArticles As Worksheet Dim oSheetBD As Worksheet Dim oOL As ListObject Dim oCell As Range, oCellDB As Range Dim oRangeFind As Range Dim oRangeBD As Range Dim oDoc As Word.Document Dim sDBFileName As String, sDocname As String Dim lFirstRow As Long, lLastRow As Long Dim sArticle As String Dim lCount As Long 'On affecte la feuille contenant les articles Set oSheetArticles = ThisWorkbook.Worksheets(1) 'On affecte la listobjet contenant les articles Set oOL = oSheetArticles.ListObjects("TableauArticles") 'On constitue le nom du classeur BD sDBFileName = ThisWorkbook.Path & "\" & ThisWorkbook.Names("BD").RefersToRange.Value 'On ouvre le classeur BD Set oWK = Application.Workbooks.Open(sDBFileName, , True) ActiveWindow.Visible = False 'On affecte la feuille DB contenant les tableaux Set oSheetBD = oWK.Worksheets(1) 'On affecte l'objet WORD Set oAppWORD = CreateObject("Word.Application") 'On boucle sur la liste des articles For Each oCell In oOL.DataBodyRange.Columns(1).Cells sArticle = oCell.Value 'Recherche de l'articles dans la BD With oSheetBD.UsedRange 'Si l'article est dans le 1ère cellule If InStr(1, .Cells(1, 1), sArticle) > 0 Then lFirstRow = 1 Else 'Sinon utilisation de la méthode Find Set oRangeFind = .Find(sArticle, After:=.Cells(1, 1), LookIn:=xlValues, LookAt:=xlPart _ , SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True) If Not oRangeFind Is Nothing Then 'Si l'article est trouvé dans la BD lFirstRow = oRangeFind.Row Else 'Sinon lFirstRow = 0 End If End If If lFirstRow > 0 Then 'On recherche de la dernière ligne du bloc soit 3 fois la référence de l'article lLastRow = oSheetBD.UsedRange.SpecialCells(xlCellTypeLastCell).Row Set oRangeBD = oSheetBD.Range(oSheetBD.Cells(lFirstRow + 1, 1), oSheetBD.Cells(lLastRow, 1)) lCount = 0 For Each oCellDB In oRangeBD.Cells If Left(oCellDB.Value, Len(sArticle)) = sArticle Then lCount = lCount + 1 'Si le nombre limite d'occurences (3) est atteinte If lCount = cNbLignes Then lLastRow = oCellDB.Row 'Si la cellule est fusionnée, on inclut les lignes de la fusion If oCellDB.MergeCells Then lLastRow = lLastRow + oCellDB.MergeArea.Rows.Count - 1 End If 'On sort Exit For End If End If Next 'On affecte la plage à copier Set oRangeBD = oSheetBD.Range(oSheetBD.Cells(lFirstRow, 1), oSheetBD.Cells(lLastRow, 4)) 'On copie la plage oRangeBD.Copy 'On créé un nouveau document WORD Set oDoc = oAppWORD.Documents.Add 'On y colle la plage EXCEL oDoc.Content.Paste 'On affecte le bord gauche du tableau dans le document oDoc.Tables(1).Rows.SetLeftIndent LeftIndent:=-63.8, RulerStyle:=wdAdjustNone 'On construit le nom du document WORD sDocname = ThisWorkbook.Path & "\" & "Doc_" & sArticle & ".docx" 'On sauvegarde le document oDoc.SaveAs2 sDocname 'On ferme le document oDoc.Close Set oDoc = Nothing End If End With Next MsgBox "Création des documents WORD terminée!", vbExclamation 'On fait le ménage oWK.Close False oAppWORD.Quit Set oAppWORD = Nothing Set oDoc = Nothing Set oWK = Nothing Set oSheetBD = Nothing Set oOL = Nothing Set oCell = Nothing End SubPour la cohérence, j'ai dû apporter une modification au classeur "BD"
Je joins mon classeur de test et le classeur BD modifié.