sarah738
Messages postés8Date d'inscriptionlundi 7 février 2011StatutMembreDernière intervention 5 avril 2012
-
19 sept. 2011 à 17:42
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 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
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
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 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
____________________
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
sarah738
Messages postés8Date d'inscriptionlundi 7 février 2011StatutMembreDerniè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 à:
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
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