Remplir un classeur excel avec des éléments d'un index

lumiexcel

XLDnaute Nouveau
Bonjour,
J'ai vu sur le forum le code suivant :
VB:
Sub PublipostageSurExcel()
  Dim sPath As String, sFicBdD As String
  Dim ShtD As Worksheet
  Dim DLig As Long, Lig As Long
  ' Définir le chemin d'accès et le nom du fichier de données
  ' Avec ce code, les 2 fichiers doivent être au même endroit
  sPath = ThisWorkbook.Path & "\"
  ' sPath = "C:\" ' Chemin en dur
  sFicBdD = "base de données.xls"
  ' Ouvrir le classeur de données
  Workbooks.Open sPath & sFicBdD
  ' Définir l'objet feuille de données
  Set ShtD = ActiveWorkbook.Sheets("données")
  ' Trouver la dernière ligne du tableau
  DLig = ShtD.Range("A" & Rows.Count).End(xlUp).Row
  ' Activer ce classeur
  ThisWorkbook.Activate
  ' Lancer le travail
  With ThisWorkbook.Sheets("Type")
    ' Pour chaque ligne du tableau de donnée
    For Lig = 2 To DLig
      ' Inscrire les valeurs contenues dans le tableau
      ' Le point devant range indique que l'on travaille avec l'objet compris dans With
      .Range("B9") = ShtD.Range("G" & Lig)
      .Range("B11") = ShtD.Range("H" & Lig)
      .Range("B13") = "M. DUPONT" ' pas de colonne définit pour ce champ
      .Range("B9") = ShtD.Range("K" & Lig)
      ' Etc ...
      ' On lance l'impression
      .PrintOut
    Next Lig
  End With
  ' On peut ferme le classeur des données
  Workbooks("base de données.xls").Close SaveChanges:=False
End Sub
Je suis très intéressée par cette possibilité, mais comme je débute juste dans les macro, j'aimerais avoir des précisions :

1/ Est-ce que la macro est faite dans le document à remplir ou dans le document de données?
(hrem, si la réponse est "dans le document à remplir" j'ai plein de question complémentaire sur à quoi se réfère "Activeworkbook" après)

2/ dans le code suivant, nous sommes d'accord qu'il s'agit de la plage de données complète, pas seulement la ligne qui m’intéresse pour le développement de la première macro ?
2bis/ (sur le format A12:N250 ?)
VB:
' Définir l'objet feuille de données
 Set ShtD = ActiveWorkbook.Sheets("données")

3/ dans la formule suivante, mon A est correct (va bien chercher la dernière ligne où A est remplit) si mon range est A12:N250 ?
VB:
' Trouver la dernière ligne du tableau
 DLig = ShtD.Range("A" & Rows.Count).End(xlUp).Row

4/ que signifie le "Type" dans :
VB:
With ThisWorkbook.Sheets("Type")
    ' Pour chaque ligne du tableau de donnée

5 / Please help (#perdue) :
5.1 comment gère t'on le document source/bdd et le document "fils/à remplir" ? (c'est le .range, c'est ça? je pense que ça reste toujours embrouillée avec cette idée que je ne sais pas sur lequel des classeur est ma macro et comme j'intègre les lien avec la bdd ? en dur ? j'imagine que non le plus possible...)

5.2 'Lig' c'est pour récuperer des infos sur une ligne ??

VB:
With ThisWorkbook.Sheets("Type")
    ' Pour chaque ligne du tableau de donnée
   For Lig = 2 To DLig
      ' Inscrire les valeurs contenues dans le tableau
     ' Le point devant range indique que l'on travaille avec l'objet compris dans With
     .Range("B9") = ShtD.Range("G" & Lig)
      .Range("B11") = ShtD.Range("H" & Lig)
      .Range("B13") = "M. DUPONT" ' pas de colonne définit pour ce champ
     .Range("B9") = ShtD.Range("K" & Lig)
      ' Etc ...
     ' On lance l'impression
     .PrintOut
    Next Lig
  End With

-----

Sinon, j'ai aussi vu ceci :
VB:
Sub CreeOnglets()
   Application.ScreenUpdating = False
   supOnglets
   Set bd = Sheets("bd")
   bd.[A1].CurrentRegion.Sort Key1:=bd.Range("A2"), Order1:=xlAscending, Header:=xlGuess
   ligBD = 2
   Do While ligBD <= bd.[A65000].End(xlUp).Row
       nom = bd.Cells(ligBD, 1)       ' Premier nom
       Sheets("modèle").Copy After:=Sheets(Sheets.Count)
       ActiveSheet.Name = "F_" & nom
       Set fiche = Sheets("F_" & nom)
       fiche.Range("B3").Value = nom
       fiche.Range("b4").Value = bd.Cells(ligBD, "B")
       fiche.Range("b6").Value = bd.Cells(ligBD, "C")
       fiche.Range("b7").Value = bd.Cells(ligBD, "D")
       fiche.Range("b8").Value = bd.Cells(ligBD, "E")
       fiche.Range("b10").Value = bd.Cells(ligBD, "F")
       bd.Cells(ligBD, "G").Copy fiche.Range("b11")
       ligBD = ligBD + 1
    Loop
End Sub
Sub supOnglets()
  Application.DisplayAlerts = False
  For s = Sheets.Count To 1 Step -1
     If Left(Sheets(s).Name, 2) = "F_" Then Sheets(s).Delete
  Next s
End Sub
Sub exportOnglets()
    CheminAppli = ThisWorkbook.Path
    Application.DisplayAlerts = False
    For i = 1 To Sheets.Count
        If Left(Sheets(i).Name, 2) = "F_" Then
          Sheets(i).Select
          nonglet = ActiveSheet.Name
          ActiveSheet.Copy
          ActiveWorkbook.SaveAs Filename:=CheminAppli & "\" & nonglet
          ActiveWindow.Close
        End If
    Next i
End Sub
Sub consolideOngletsBD()
    ligBD = 2
    Set bd = Sheets("bd")
    For f = 1 To Sheets.Count
        If Left(Sheets(f).Name, 2) = "F_" Then
           bd.Cells(ligBD, "A") = Sheets(f).[B3]
           bd.Cells(ligBD, "B") = Sheets(f).[B4]
           bd.Cells(ligBD, "C") = Sheets(f).[B6]
           bd.Cells(ligBD, "D") = Sheets(f).[B7]
           bd.Cells(ligBD, "E") = Sheets(f).[B8]
           bd.Cells(ligBD, "F") = Sheets(f).[B10]
           Sheets(f).[B11].Copy bd.Cells(ligBD, "G")
           ligBD = ligBD + 1
        End If
    Next f
End Sub
qui dans ce cas ci ouvre dans des onglets (ça m’intéresse un peu moins, mais peut être est-ce moins dur à gérer)


J'ai tenté de modifier les éléments suivants

en 3e ligne :
VB:
Set bd = Sheets("bd ")
=>
VB:
Set bd = Sheets("Chrono MR")

en me disant qu'ensuite ce que je voyais en tant que "bd" était peut être cette feuille? ou une valeur de VBA, ou les deux, selon les cas ?

Par contre, là où sans doute j'ai fait une erreur, même si le débug ne dit rien, c'est en passant de
VB:
bd.[A1].CurrentRegion.Sort Key1:=bd.Range("A2")
à
VB:
bd.[A7].CurrentRegion.Sort Key1:=bd.Range("A8")

car ça m'efface tout mon tableau


(mais l'erreur que j'ai est une
erreur runtime 1004 à dit:
"Cannot rename a sheet to the same name as another sheet, a referenced object library or a workbook referenced by visual Basic"
Bref, déjà, pouvez-vous m'aider avec ça?

Comment faire commencer mon tableau à la huitième ligne ? (septième si on compte la ligne de titre, je ne sais pas si elle peut être utilisé comme référence...)


Question subsidiaire :
Est-ce qu'il y a moyen de modifier le code pour qu'il ne génère que la dernière ligne ou la ligne sélectionnée ?

Bon, je m'arrête là pour le moment ;-)

Autres précisions, je suis assez noob dans excel et n'ai jamais fait de macro, donc désolé si je pose des questions bêtes
sinon j'avoue, ce ne doit pas être facile de travailler sans fichier exemple, mais je n'ai pas trop le temps de "maquiller" mes fichiers, et les règles de confidentialité sont toujours importantes... même si un fichier vide...donc si vraiment nécessaire je verrai mais j'ai essayée de me concentrer sur le code plutôt que sur mon fichier, pour simplifier
 
Dernière édition:

Modeste

XLDnaute Barbatruc
Re : Remplir un classeur excel avec des éléments d'un index

Bonjour lumiexcel et bienvenue (ton premier message étant resté sans réponse)

Un petit commentaire, si tu le permets: le premier message en question remonte à 5 jours ... depuis lors, tu n'as pas trouvé le temps de créer un (même deux, dans ton cas!) petits fichiers qui serviraient de support :rolleyes: et tu dis ça à des gens qui donnent de leur temps bénévolement :eek: et qui répètent à longueur de journée qu'un petit fichier permettrait (notamment) de tester les solutions proposées ;)

Tu noteras aussi que dans le fil original, Bruno notait lui-même qu'un publipostage au départ de Word serait préférable! Alors, te lancer dans les macros, pourquoi pas? Simplement tu ne te facilites pas la tâche en t'y prenant comme tu le fais.

Pour apporter un ou deux éléments de réponse, dans "With ThisWorkbook.Sheets("Type")" "Type" est le nom de la (seule) feuille du classeur "Document type.xls" fourni par lulu502
Quant à savoir dans quel classeur figure la macro, si -dans le code- on trouve "Workbooks.Open sPath & sFicBdD" (sachant que sFicBdD correspond à "Base de données.xls") ... il me semble que tu devrais pouvoir répondre toi-même à ta question?
Pour le ActiveWorkbook, consulte l'aide avant toute chose: c'est un réflexe à acquérir, si tu veux découvrir le monde magique des macros.

Si tu fais l'effort de fournir deux petits fichiers, c'est promis on te donnera un coup de main pour comprendre comment y adapter le code fourni par Bruno.
 

camarchepas

XLDnaute Barbatruc
Re : Remplir un classeur excel avec des éléments d'un index

Bonjour Modeste , LumiExcel,

Allez comme on est gentils , voici quelques réponses à tes questions , bien nombreuses ma fois .

Code:
2/ dans le code suivant, nous sommes d'accord qu'il s'agit de la plage de données complète, pas seulement la ligne qui m’intéresse pour le développement de la première macro ? 
2bis/ (sur le format A12:N250 ?)
Code vba:
 ' Définir l'objet feuille de données
   Set ShtD = ActiveWorkbook.Sheets("données")

C’est l’objet Feuille en effet qui est définit comme objet,

Pour la plage :

  Dim plage as range
  Set Plage = workbooks(Nom du fichier si connu).sheets(« données »).range(« A12 :N250 »)

3/ dans la formule suivante, mon A est correct (va bien chercher la dernière ligne où A est remplit) si mon range est A12:N250 ?
Code vba:
' Trouver la dernière ligne du tableau
  DLig = ShtD.Range("A" & Rows.Count).End(xlUp).Row
 
Ecrit comme cela nom si A4500 contient quelque chose , c'est 4500 qu'il te remonte
'
Il faudrait faire :

Sub test()
Dim Dlig As Long
Dim plage As Range
Set plage = Workbooks("Classeur_données").Sheets("données").Range("A12:N250") '

Dlig = plage.End(xlUp).Row

End Sub

4/ que signifie le "Type" dans :
Code vba:

With ThisWorkbook.Sheets("Type")
' Pour chaque ligne du tableau de donnée
Tous simplement un objet fixé sur l’onglet nommé « Type »

Voilà
 

lumiexcel

XLDnaute Nouveau
Re : Remplir un classeur excel avec des éléments d'un index

En fait, je n'ai pas excel chez moi, sinon j'aurais essayé ces 5 jours de modifier les fichiers que j'ai pour en faire quelque chose d'à la fois complètement anonymisé et utilisable (quoique, ramener des fichiers chez moi ne serait pas non plus le summum coté sécurité).

Et ici, à mon travail, même si j'y ai déjà consacré un peu de temps, notamment parce que je pense que ça m'aidera pour d'autres fichiers/manipulation que celui-ci si je connais le fonctionnement des macros, je n'ai pas non plus un temps énorme à y consacrer. (et, peut être n'est-ce pas vrai, mais essayer de comprendre le code me semble moins difficile que le transformer en pesant ce que je peux dire, je me/vous complique sans doute la vie, désolé)

Quand au document index / template de fiche, ce sont des documents formatés au niveau de la société (ou en tout cas de la Business Unit en question) donc je n'ai pas une marge énorme pour les modifier à mon niveau.(notamment pas celui de passer à un publipostage word qui serait en effet plus simple)

Pour apporter un ou deux éléments de réponse, dans "With ThisWorkbook.Sheets("Type")" "Type" est le nom de la (seule) feuille du classeur "Document type.xls" fourni par lulu502
Oups désolé j'avais plein de fichier ouvert quand j'ai commencé à poser mes question, dont un certain nombre déjà modifiés pour essayer de comprendre...
J'avais cru que c'était une sorte de déclaration de la feuille pour qu'on puisse utiliser le nom de "données" ensuite, j'avais pas vu que ça faisait référence à un nom de feuille existant.
Donc ça réponds plus ou moins à ma question (j'imagine qu'en fait ce qui m’intéressait, c'est à dire définir ma plage de donnée, était plutôt la ligne suivante, même s'il me reste encore à trouver ce que ça veux dire ;-))


Quant à savoir dans quel classeur figure la macro, si -dans le code- on trouve "Workbooks.Open sPath & sFicBdD" (sachant que sFicBdD correspond à "Base de données.xls") ... il me semble que tu devrais pouvoir répondre toi-même à ta question?
euh non je crois pas justement, vu que j'essayais de comprendre qu'est ce que je devais mettre à la place, mais je vais relire, j'ai peut être juste mal compris...
J'ai toujours un peu l'impression en lisant que ma macro se trouve dans la feuille résultante/feuille template, ce qui me semble un peu bête dans la façon de procéder, mais pourquoi pas...


Bon, pas le temps (j'ai fini par écrire cet email en 15x5min, mais là surchargée), je repasse, dsl ...
 
Dernière édition:

lumiexcel

XLDnaute Nouveau
Re : Remplir un classeur excel avec des éléments d'un index

;-)
J'écris vite (et je l'avais fait tout au long de la journée)

J'essaie de repasser (peut être pas aujourd'hui, une fois que mes logiciel se seront enfin décidés à marcher, je ne sais pas combien de temps j'aurais)
 

Discussions similaires

Statistiques des forums

Discussions
311 721
Messages
2 081 928
Membres
101 842
dernier inscrit
seb0390