copier des éléments d'une feuille excel à une autre selon paramètres

hatem1234

XLDnaute Junior
j'aimerais copier les éléments d'un tableau d'une feuille (nommée Principal) vers une autre (nommée Modele) et créer un document PDF avec le résultat

Les éléments à copier de la feuille Principal sont :

toutes les lignes à partir de la ligne 3
seulement les colonnes A (NOM), B (PRÉNOM), C (DATE DE NAISSANCE) et D (POSITION)

Dans la feuille Modele, il faut copier les données dans les espaces prévus c'est à dire :

ligne 18 à 44 (14 éléments max car 1 ligne vide entre 2 lignes)
ligne 54 à 80 (14 éléments max car 1 ligne vide entre 2 lignes)
ligne 90 à 116 (14 éléments max car 1 ligne vide entre 2 lignes)
ligne 126 à 152 (1 ligne vide entre 2 lignes)

En d'autre termes, voici un exemple comment il faut copier les éléments de la feuille Principal vers la feuille Modele :

ligne 1 (Principal) à copier à la ligne 18 de la feuille Modele
ligne 2 à copier à la ligne 20
ligne 3 à copier à la ligne 22

....
....
....

ligne 14 à copier à la ligne 44
ligne 15 (Principal) à copier à la ligne 54 de la feuille Modele
ligne 16 (Principal) à copier à la ligne 56 de la feuille Modele

....
....
....

le document PDF à créer devra contenir :

Pour faire tout cela, j'ai ajouté un bouton Admin dans la feuille Principal et voici les étapes que j'aimerais avoir :

on clique sur le bouton Admin
on rentre un mot de passe (par exemple test1234)
les éléments de la feuille Principal seront copiés dans la feuille Modele (tel qu'expliqué précédemment)
le résultat (feuille Modele) sera convertis en format PDF

Je sais déjà comment créer le mot de passe et le document PDF; là où je bloque c'est comment copier les éléments d'une feuille à une autre

Merci pour vos suggestions et pistes de solution
 

Pièces jointes

  • Test_Projet.xlsm
    45.2 KB · Affichages: 30

Marc L

XLDnaute Occasionnel

Bonjour,

c'est très simple, voir par exemple l'aide VBA de la méthode Range.Copy

Ou encore en utilisant l'Enregistreur de macros et en effectuant l'opération manuellement,
une base de code est livrée sur un plateau ! (J'ai appris ainsi et en lisant l'aide …)

 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : copier des éléments d'une feuille excel à une autre selon paramètres

Bonsoir hatem1234,

Un essai dans le fichier joint. (juste la copie des données).
VB:
Sub PrincipalVersModele()
Dim derlig&, tablo, ligEcrit&, i&, j&, n&

  'lecture des valeurs à copier dans tablo
  Application.ScreenUpdating = False
  With Sheets("Principal")
    derlig = .Cells(.Rows.Count, "a").End(xlUp).row
    If derlig = 2 Then
      MsgBox "Pas de données sur la feuille 'Principal' -> Fin"
      Exit Sub
    End If
    tablo = .Range(.Cells(3, "a"), .Cells(derlig, "d")).Value
  End With
  
  With Sheets("Modele")
    'écriture des valeurs de tablo sur "Modele"
    ligEcrit = 18
    For i = 1 To UBound(tablo)
      .Cells(ligEcrit, "a") = tablo(i, 1)
      .Cells(ligEcrit, "k") = tablo(i, 2)
      .Cells(ligEcrit, "s") = tablo(i, 3)
      .Cells(ligEcrit, "w") = tablo(i, 4)
      n = n + 1
      If n = 14 Then
        ligEcrit = ligEcrit + 10
        n = 0
      Else
        ligEcrit = ligEcrit + 2
      End If
    Next i
    Application.Goto .Range("a1"), True
  End With
End Sub
 

Pièces jointes

  • hatem1234-Test_Projet- v1.xlsm
    63.8 KB · Affichages: 30

hatem1234

XLDnaute Junior
Re : copier des éléments d'une feuille excel à une autre selon paramètres

bonjour,

ce que je trouve compliqué c'est ceci :

je dois copier chaque cellule dans un range bien définit par exemple pour la première ligne de la feuille Principal il faut faire :

Sheets("Principal").Range("A3") = Sheets("Modele").Range("A18:I18")
Sheets("Principal").Range("B3") = Sheets("Modele").Range("K18:Q18")
Sheets("Principal").Range("C3") = Sheets("Modele").Range("S18:U18")
Sheets("Principal").Range("D3") = Sheets("Modele").Range("W18:Z18")

le problème c'est qu'en arrivant à la ligne 17 (Sheets("Principal").Range("A17")) je dois copier dans la feuille Modele a partir de la ligne 54 c'est à dire

Sheets("Principal").Range("A17") = Sheets("Modele").Range("A54:I54")
Sheets("Principal").Range("B17") = Sheets("Modele").Range("K54:Q54")
Sheets("Principal").Range("C17") = Sheets("Modele").Range("S54:U54")
Sheets("Principal").Range("D17") = Sheets("Modele").Range("W54:Z54")

comment faire les 2 boucles?
 

hatem1234

XLDnaute Junior
Re : copier des éléments d'une feuille excel à une autre selon paramètres

Bonjour,
la solution de "mapomme" répond parfaitement à ma situation
un gros merci

juste une petite question qui pourrait probablement ouvrir une nouvelle problématique:

dans la feuille Modele, j'ai copié le formulaire 4 fois mais comme je ne sais pas exactement le nombre d'éléments dans la feuille Principal, est-ce qu'il y a un moyen de garder dans la feuille Modele seulement 1 seul formulaire, jusqu'à la ligne 53 (donc qui peut contenir 14 éléments max) et créer un nouveau formulaire en-dessous en fonction du nombre d'éléments dans la feuille Principal (voir le fichier modifié)
Merci beaucoup
 

Pièces jointes

  • test_projet-v1-modifié.xlsm
    53 KB · Affichages: 21

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : copier des éléments d'une feuille excel à une autre selon paramètres

Bonjour hatem1234,

(...) juste une petite question (...) dans la feuille Modele, j'ai copié le formulaire 4 fois mais comme je ne sais pas exactement le nombre d'éléments dans la feuille Principal, est-ce qu'il y a un moyen de garder dans la feuille Modele seulement 1 seul formulaire, jusqu'à la ligne 53 (donc qui peut contenir 14 éléments max) et créer un nouveau formulaire en-dessous en fonction du nombre d'éléments dans la feuille Principal (...)

Voir fichier v2 joint.

Edit: v2a - juste modifié l'emplacement de l'effacement du formulaire

VB:
Sub PrincipalVersModele()
Dim derlig&, tablo, ligEcrit&, i&, j&, n&, nbrLig&, nbbloc&

  Application.ScreenUpdating = False
  'effacer les précédentes valeurs
  With Sheets("Modele")
    .Range("a18:z44").ClearContents   ' du premier bloc
    .Range("a54:a" & .Rows.Count).EntireRow.Delete 'tous les autres blocs
  End With
  
  'lecture des valeurs sources à copier dans tablo
  With Sheets("Principal")
    derlig = .Cells(.Rows.Count, "a").End(xlUp).row
    If derlig = 2 Then
      MsgBox "Pas de données sur la feuille 'Principal' -> Fin"
      Exit Sub
    End If
    ' définir le nombre de lignes à lire (multiple de 14)
    ' ==> on pourra donc prendre des lignes sources vides en compte !
    ' pas d'incidence sur le résultat,
    ' mais ça simplifie grandement le code par la suite
    nbrLig = derlig - 2
    If nbrLig Mod 14 = 0 Then
      derlig = 2 + 14 * Int(nbrLig / 14)
    Else
      derlig = 2 + 14 * (1 + Int(nbrLig / 14))
    End If
    'lecture des données sources
    tablo = .Range(.Cells(3, "a"), .Cells(derlig, "d")).Value
  End With
  
  With Sheets("Modele")
    .Activate
    'copie du 1ier bloc (vide) autant de fois qu'il le faut
    nbbloc = Int((derlig - 2) / 14) - 1
    If nbbloc > 0 Then .Rows("18:53").Copy .Rows(54).Resize(nbbloc * 36)
    'écriture des valeurs de tablo sur "Modele"
    ligEcrit = 18   'ligne de la future écriture des données
    n = 0   ' comptage du nombre de lignes écrites
    For i = 1 To UBound(tablo)
      .Cells(ligEcrit, "a") = tablo(i, 1)
      .Cells(ligEcrit, "k") = tablo(i, 2)
      .Cells(ligEcrit, "s") = tablo(i, 3)
      .Cells(ligEcrit, "w") = tablo(i, 4)
      n = n + 1
      If n = 14 Then    ' fin d'un bloc
        ligEcrit = ligEcrit + 10
        n = 0
      Else              ' toujours dans le même bloc
        ligEcrit = ligEcrit + 2
      End If
    Next i
    Application.CutCopyMode = False
    Application.Goto .Range("a1"), True
    ' définition zone d'impression
    ActiveSheet.PageSetup.PrintArea = .Range("a1:z" & ligEcrit - 1).Address
  End With
End Sub
 

Pièces jointes

  • hatem1234-Test_Projet- v2a.xlsm
    38.7 KB · Affichages: 47
Dernière édition:

hatem1234

XLDnaute Junior
Re : copier des éléments d'une feuille excel à une autre selon paramètres

Bonjour,
un GROS GROS merci à mapomme pour cette solution; ça fonctionne parfaitement bien
personnellement, je vois beaucoup de nouvelles idées en vba dans cette solution. J'ai commencé à écrire un code pour copier le formulaire Modele selon le nombre de lignes dans la feuille Principal mais j'étais loin de ce que mapomme propose dans son fichier
Je vais maintenant analyser ce nouveau fichier et je vous reviens sous peu avec mes commentaires
Merci beaucoup
 

hatem1234

XLDnaute Junior
Re : copier des éléments d'une feuille excel à une autre selon paramètres

Bonjour,

J'ai encore besoin de vous pour adapter la solution de mapomme pour copier les données vers un formulaire un peu différent du premier

En fait la solution de mapomme fonctionne bien mais je n'arrive pas à modifier le code pour pouvoir copier les données dans le Modele 2

Le Modele 2 comprend seulement les noms & prénoms qui doivent être copiés comme suit :

Ligne 18 : Nom Prénom Nom Prénom
Ligne 20 : Nom Prénom Nom Prénom
Ligne 22 : Nom Prénom Nom Prénom
...
...
Ligne 44 : Nom Prénom Nom Prénom (dernière ligne du bloc 1)

Je joins le nouveau fichier v3 dans lequel j'ai modifié le code mais les noms et prénoms sont copiés ligne après ligne et je n'arrive pas à les copier de la façon Nom Prénom Nom Prénom

Merci d'avance pour votre aide
 

Pièces jointes

  • Test_Projet- v3.xlsm
    59.2 KB · Affichages: 30
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : copier des éléments d'une feuille excel à une autre selon paramètres

Bonjour hatem12234,

Désolé, j'avais oublié :mad: votre deuxième demande. Si j'ai bien compris, voir l'essai dans le fichier joint (ça ne passe pas par la fonction Transpose).


EDIT: petite étourderie-> remplacer dans le code de PrincipalVersModele2(), la ligne:
Code:
If nbrLig Mod 14 = 0 Then
par la ligne:

Code:
If nbrLig Mod 28 = 0 Then



 

Pièces jointes

  • hatem1234-Test_Projet- v3a.xlsm
    53.3 KB · Affichages: 29
Dernière édition:

hatem1234

XLDnaute Junior
Re : copier des éléments d'une feuille excel à une autre selon paramètres

Bonjour mapomme et le forum,
Un gros merci comme d'habitude ça fonctionne comme désiré
je note surtout le Step 2 dans la boucle pour permettre un pas de 2 :
...For i = 1 To UBound(tablo) Step 2...
Merci encore et félicitation pour votre expertise en VBA
 

hatem1234

XLDnaute Junior
Bonjour à tous,

Pour ceux qui ont suivi cette discussion, j'ai encore une fois utilisé la solution de mapomme pour l'adapter à un nouveau formulaire nommé Modele3

J'essaye de copier les données de la feuille Principal vers le formulaire Modele3 mais un petit bogue dans le code m'empêche de compléter le projet

En fait voici les deux problèmes que je n'arrive pas à résoudre :

1) si la feuille Principal contient moins que 10 Noms, tout va bien et toutes les données sont bien copiées vers Modèle3. Par contre si la feuille Principal contient plus que 10 Noms, pour les noms à partir du 11ème, seules les données sont copiées mais non pas les entêtes des cellules et ni mêmes les bordures des cellules (il faut faire un test pour le comprendre).

2) le numéro de dossier pour chaque Nom correspond au format suivant :
année + mois + "-" + le rang de l'élément dans le tableau
Par exemple pour le premier nom du tableau, le numéro de dossier équivaut à 201607-1 et ainsi de suite
je remarque que si par exemple j'ai seulement 2 noms dans mon tableau, le système complète comme-même le numéro de dossier pour 5 éléments c'est à dire jusqu'à 201607-5 (il faut faire un test pour le comprendre)

Merci à vous tous pour vos suggestions afin de résoudre ces 2 problèmes mineurs (ci-joint le fichier v4)
 

Pièces jointes

  • Test_Projet- v4.xlsm
    50.9 KB · Affichages: 27

Discussions similaires

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 813
dernier inscrit
kaiyi