Copier tableau et le mettre en forme

sarah738 Messages postés 8 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 5 avril 2012 - 19 sept. 2011 à 17:42
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 22 sept. 2011 à 17:58
Bonjour à tous,

Je reviens vous voir, j'ai encore un petit souci.
Je travaille actuellement dans une entreprise. Afin de facilité la gestion des commande je voudrais qu'à partir des données entrées à propos des commandes, excel me fasse un tableau sur une autre feuille en rangeant les commandes et les postes par délai. Mon problème c'est que sur mon premier tableau je dois avoir obligatoirement 1 ligne = 1 commande et que tous les postes d'une commande n'ont pas le même délai.
Je vous joint mon fichier excel pour mieux comprendre

document excel


J'ai essayé d'écrire un code. L'idée est que dès que le fichier est enregistré, la macro se lance et fasse appelle à 2 autres macros : tout d'abord reprendre les données, puis les trier.
Mais il y a un souci sur CopieTableau alors forcément...
Donc si quelqu'un voit pourquoi ça ne marche pas... y'a surement moyen de l'optimiser mais je suis une grande débutante, soyez indulgents s'il vous plait

Sub CopieTableau()

Dim vtL As Variant ' tableau de lecture command
Dim vtL2 As Variant ' tableau de lecture command info
Dim IL As Long ' indice de ligne
Dim IC As Long 'indice de colonne
Dim LTotal As Long ' nb de ligne a traiter
Dim vtE As Variant 'tableau a copier dans planif
Dim IL2 As Variant ' indice ligne
Dim IC2 As Variant ' indice colonne


'Effacer le contenu de planif et remettre les titres
Sheets("planif").Select
    Cells.Select
    Selection.ClearContents

Range("A4").Select
ActiveCell.FormulaR1C1 = "Clients"
Range("B4").Select
ActiveCell.FormulaR1C1 = "N° Commande interne"
Range("C4").Select
ActiveCell.FormulaR1C1 = "N° Commande client"
Range("D4").Select
ActiveCell.FormulaR1C1 = "Poste"
Range("E4").Select
ActiveCell.FormulaR1C1 = "Date délai"

'Rechercher la ligne de la dernière valeur dans planif
LTotal = ThisWorkbook.Worksheets(1).Range("A" & Application.Rows.Count).End(xlUp).Row

'Charger les tableaux
vtL = ThisWorkbook.Worksheets(1).Range("F8:P" & LTotal).Date
vtL2 = ThisWorkbook.Worksheets(1).Range("B8:E" & LTotal).String
vtE = ThisWorkbook.Worksheets(2).Range("A2:E40000").String
IL2 = 1
IC2 = 1

For IL = LBound(vtL, 2) To UBound(vtL, 2)
    For IC = LBound(vtL, 2) To UBound(vtL, 2)
        ' Si A1 est cochée (commande terminée)
        If ThisWorkbook.Worksheets(1).Range("A" & IL).Variant X Or ThisWorkbook.Worksheets(1).Range("A" & IL).Variant X Then
                IL = IL + 1
        
        ElseIf IsEmpty(vtL(IL, IC)) Then 'si la cellule est vide
                IL = IL + 1
                IC = 1
        
        ElseIf vtL(IL, IC) = "fini" Then 'si le poste est terminé
                IC = IC + 1
        
        ElseIf IsDate(vtL(IL, IC)) Then  's'il y a une date
                vtE(IE, 1) = vtL2(IL, 2)  ' Clients
                vtE(IE, 2) = vtL2(IL, 4)  ' N° commande interne
                vtE(IE, 3) = vtL2(IL, 5)  ' N° commande client
                vtE(IE, 4) = IC           ' N° de poste
                vtE(IE, 5) = vtL2(IL, IC) ' Délai
                IC = IC + 1
                IE = IE + 1

        Else: MsgBox "ERREUR : verifier votre saisie"
        
        End If
    Next
Next

End Sub

5 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 231
19 sept. 2011 à 17:57
Bonjour,

1) Je pense que je ne suis pas le seul à ne pas accepter d'ouvrir un classeur excel joint ! Tu dois être capable d'isoler et montrer la partie spécifique de ton code qui pose problème
2) cette manière de travailler à coups de Select et activecell est totalement déconseillée et source de lenteurs !
3) je suis surpris par tes lignes de code, dont, par exemple, celle-ci :
ActiveCell.FormulaR1C1 = "Clients"

peux-tu nous dire ce que tu penses qu'elle fait et pourquoi tu utilises FormulaR1C1 ?

4) la partie du code que tu nous montres ici traite de tout sauf du problème invoqué, à savoir :

Mais il y a un souci sur CopieTableau alors forcément...


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 231
19 sept. 2011 à 18:02
Et ... D'où sors-tu donc cette propriété "String" d'un Range ?

Par exemple ici :
vtE = ThisWorkbook.Worksheets(2).Range("A2:E40000").String

Explique voir !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
sarah738 Messages postés 8 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 5 avril 2012
22 sept. 2011 à 17:05
Bonjour ucfoutu,

Merci de ta réponse.
Tout d'abord suite à tes nombreuses remarques, je voudrais preciser certaines choses: je n'ai AUCUNE connaissance en VBA. J'ai entendu parler de ça lors de ma formation en informatique qui se résume à un peu de c++, de Ocamel, et ARM que je n'ai pas pratiqué depuis plus d'un an.
Donc je vais essayer de répondre mais je te demande un peu d'indulgence !!

1) Je comprend, mais j'avoue que j'ai un peu du mal à expliquer concrètement ! Pour le code le problème est probablement dans le .String (pour chaine de caractère)et dans les formules du conditionnel.
(A tout te dire, j'avais pas tilter le .String, par contre j'essaye de trouver la bêtise sur la boucle FOR et le IF.)

2)Oui, probablement, en même temps, c'est mon premier code !!! Alors je savais optimiser en c++ par contre j'avoue que là j'y vais a grands coups de macros enregistrées pour comprendre les mécanismes ! ce qui répond également au 3)

4)ma macro s'appelle CopieTableau, c'est tout !!! Théoriquement elle devrait reprendre mes infos et les restituer sur une autre feuille

Je vais essayer de représenter mes 2 feuilles
[u]
FEUILLE DE SAISIE/u

Terminé / Date / Client / N°Cde int / N°ext / Délais par poste (15 postes max)

.........[i]22/09....XXX.......123........456.......22/10 10/12 ...
/i
FEUILLE de RESULTAT
Sur cette feuille je veux représenter un planning en fonction des délais :
Si la commande est terminée, elle ne doit pas apparaitre dans la feuille, de même dans la zone "délais", pour les postes où à la place d'une date il y a "fini".
Sinon, pour les autres je devrait arriver dans un premier temps à:

Client / N°int / N°ext / Poste / Delai
XXX........123........456.....1.........22/10
XXX........123........456.....2.........10/12


Voila. Mon principal souci est de charger des données en ligne et de les restituer en colonne.

J'ai conscience que mon code est un peu pourri mais je n'ai pas actuellement d'outil pour pouvoir faire mieux alors j'essaye et j'apprend sur le tas !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 231
22 sept. 2011 à 17:20
J'ai conscience que mon code est un peu pourri mais je n'ai pas actuellement d'outil pour pouvoir faire mieux alors j'essaye et j'apprend sur le tas


Si si, tu as l'outil nécessaire : ton aide VBA, sur ta machine.

Quelques pistes (et ouvre ton aide sur chacun des mots mis en rouge) :
- on attribue la valeur "toto" à la cellule B1 ainsi : Range("B1").Value = "toto" (et ce n'est pas une formule)
- le contenu d'une cellule est soit une valeur (.Value) pour sa valeur réelle si numérique par exemple, soit .Text pour sa représentation, telle quelle, à l'écran.
- Application.Transpose permet de transposer les lignes en colonnes.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 231
22 sept. 2011 à 17:58
Vas-y pas à pas et sans te presser. Donne loe temps au temps.
Par exemple :

Sheets("planif").Select
    Cells.Select
    Selection.ClearContents

Range("A4").Select
ActiveCell.FormulaR1C1 = "Clients"
Range("B4").Select
ActiveCell.FormulaR1C1 = "N° Commande interne"
Range("C4").Select
ActiveCell.FormulaR1C1 = "N° Commande client"
Range("D4").Select
ActiveCell.FormulaR1C1 = "Poste"
Range("E4").Select
ActiveCell.FormulaR1C1 = "Date délai"


S'écrit plus avantageusement ainsi (puisque tu ne veux effacer que les lignes 1,2,3 et les lignes de 5 à la fin :

 Sheets("planif").Cells.Range(Rows(1), Rows(3)).ClearContents
  Sheets("planif").Cells.Range(Rows(5), Rows(Rows.Count)).ClearContents

ou encore (mieux) :
With Sheets("planif")
  .Cells.Range(Rows(1), Rows(3)).ClearContents
  .Cells.Range(Rows(5), Rows(Rows.Count)).ClearContents
end with


ou encore :
Dim garder
 With Sheets("planif")
   garder = .Rows(4)
   .Cells.ClearContents
   .Rows(4) = garder
 End With

A toi de voir (les chemins possibles ne sont jamais uniques).
Continue sur ce genre de lancée.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0