VBA
Frenchie83 Messages postés 2254 Statut Membre -
je suis en train de développer un outil pour générer des commandes passé par les clients sur excel et j'ai une feuille dont laquelle j'affiche tout,
je voudrais donc effectuer une boucle en VBA sachant que les valeurs que je souhaite afficher et garder en même temps sont des formules inscrit en colonnes et en ligne!!!
j'ai comme champs de AH13 0 AT18 et les formules sur ces champs sont
=INDEX(Fournisseur!$C$2:$Q$200;Fournisseur!$A$2;1)
=INDEX(Fournisseur!$C$2:$Q$200;Fournisseur!$A$2;2)
=INDEX(Fournisseur!$C$2:$Q$200;Fournisseur!$A$2;3)
=INDEX(Fournisseur!$C$2:$Q$200;Fournisseur!$A$2;4)
=INDEX(Fournisseur!$C$2:$Q$200;Fournisseur!$A$2;5)
je veux en fait au lieu de metre tout les formules dans vba, effectuer directement une boucle dont il pourra lire tout ce valeurs, aurait-il qlqn pour m'aider???
config>Windows / Chrome 46.0.2486.0</config>
31 réponses
Le sujet porte sur une boucle VBA visant à lire et afficher des valeurs issues de formules placées en lignes et colonnes spécifiques sans tout coder en dur.
La solution efficace consiste à écrire directement les formules dans les plages cibles via une macro utilisant FormulaR1C1 (par exemple AR13:BD13, AR14:BD14, etc.), afin d’obtenir les résultats dynamiquement.
Des erreurs fréquentes concernent le nom de la feuille (espace éventuel ou orthographe) et l’absence d’un avertisseur de comparaison ; il faut aligner le nom exact et ajouter Option Compare Text en tête du module.
Après correction du nom de la feuille et de la directive, la macro fonctionne et fournit les mêmes résultats que l’approche manuelle.
Sub Filtrage()
Application.ScreenUpdating = False
Set f1 = Sheets("Fournisseur") ' Activation feuille Fournisseur
Set f2 = Sheets("Article") ' Activation feuille Article
Set f3 = Sheets("Filtre") ' Activation feuille filtre
Set f4 = Sheets("Trame commande") ' Activation feuille Trame commande
f3.Range("A3:H" & [A10000].End(xlUp).Row).ClearContents
f1.Select ' Sélection feuille Fournisseur
[R4].FormulaR1C1 = "=INDEX(R3C3:R" & [C10000].End(xlUp).Row & "C3,R3C1,0)" 'Affectation de la formule Index permetant de filtrer le fournisseur
Entreprise = f1.[R4] ' Affectation fournisseur et la cellule
Sheets("Article").Select ' Sélection de la feuille article
ActiveSheet.AutoFilterMode = False
Rows(1).AutoFilter ' ligne 2 de la feuille article
ActiveSheet.Range("A1:G" & [C10000].End(xlUp).Row).AutoFilter Field:=3, Criteria1:=Entreprise
NbCol = [IV1].End(xlToLeft).Column
Range("_FilterDataBase").Resize(, NbCol).SpecialCells(xlCellTypeVisible).Copy
f3.Select
[A2].Select
ActiveSheet.Paste
f1.AutoFilterMode = False
f2.AutoFilterMode = False
f4.Select
End Sub
Est-ce-t-il possible au lieu de faire
Dim a as string
a=""
Sheets("Fournisseur").[A3] = a
range.fournisseur"a3".value=a
Faire directement
Sheets("Fournisseur").[A3] = Sheets("Fournisseur").[C2]
????
Et j'ai aussi un probleme genre quand j'affecte sur ma macro ce que vous venez de me donner, la feuille Filtre ni Article marche plus, il filtre plus en fait!!!
cldt
Sheets("Fournisseur").[A3] = Sheets("Fournisseur").[C2] OUI
Pour le reste, pouvez-vous remettre le fichier en pièce jointe SVP? .merci
Voici le lien du fichier
https://www.cjoint.com/c/FEvlH6pTy0x
Je souhaite en fait, qu'en sortant de mon fichier, que tout soit vide et quand l'ouvrant pareil, pour la partie où je viens sélectionner mes ref articles dans ma trame c'est deja ok!!.
Maintenant je veux forcer cette partie Sheets("Fournisseur").[A3] = Sheets("Fournisseur").[C2] je l'ai mit en mode commenter car j'arrive pas l'affecter.
Le problème en fait c'est que, si vous tapez un nombre quelconque dans la cellule A3, il sélectionne le fournisseur dû au nombre tapez et il me remplie la trame commande et je souhaite pas avoir un résultat comme cela, c'est pour cela que souhaite en fait la forcer à un champs vide dans ce C2 de la feuille fournisseur, merci
cldt
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionJe vous renvoi le fichier, avec déplacement de la cellule liée de la liste déroulante des entreprises en S1 de Fournisseur.
Cette modification nécessite de corriger la formule "Index" qui devient
[R4].FormulaR1C1 = "=INDEX(R3C3:R" & [C10000].End(xlUp).Row & "C3,R1C19-1,0)"
https://www.cjoint.com/c/FEvqT0jHz1w
Essayez
cldt
Sheets("Fournisseur").[A3] = 1
Mais dans votre macro il faut mettre cette ligne avant
ActiveWorkbook.Save
ActiveWorkbook.Close
Pour ce qui est de vider les feuilles à la fermeture, rajouter ceci. A adapter à votre convenance
Sub Auto_Close()
Application.ScreenUpdating = False
'on efface le contenu de la feuille "Fournisseurs"
Sheets("Fournisseur").Select
Range("M3:R10000").ClearContents
'on efface le contenu de la feuille "Filtre"
Sheets("Filtre").Select
Range("A3:G10000").ClearContents
'On sélectionne la feuille "Trame commande" pour qu'on arrive sur cette feuille à l'ouverture du fichier
Sheets("Trame commande").Select
ActiveWorkbook.Save
End Sub
Vous pouvez inclure toutes les lignes suivantes de votre macro dans celle ci-dessus
'efface les données de la trame commande
Windows("COMMANDE-OUTIL.xlsm").Activate
Worksheets("trame commande").Activate
Range("G22:N22").Value = "" 'efface le numero de la commande
Range("G24:N24").Value = "" 'efface la référence commande
Range("AL28:AN55").Value = "" 'Effacer la quantité
Range("AR24:BB24").Value = "" 'effacer date
Sheets("Fournisseur").[A3] = 1
Cdlt
Maintenant je souhaite en fait faire une copie de toutes mes formules de ligne F28-AK55, AO28-AR55 et BA28-BN55 de la trame commande.
Le but en fait c'est de copier les formules si au fur à et mesure j'ai pas une référence et que je souhaite taper directement sur ma cellule et que j'écrase les formules inscris sr ces champs et puis générer ma commande.
quand je veux rouvrir mon fichier que la macro générer la commande puisse remettre les formules dans les bone endroit et pour cela j'ai rajouté ceci dans ma macro après la ligne Worksheets("commandes").Range("C" & (ligne + 1)).Value = Worksheets("trame commande").Range("AS66:AZ67").Value:
' copie de formules de trame commande de ligne F28-BA55
Sheets("Trame commande").[F28:AK28] = Sheets("Trame commande").[=SI($B$28="";"";RECHERCHEV($B$28;Filtre!$A$3:$G8;4;0)]
Sheets("Trame commande").[F31:AK31] = Sheets("Trame commande").[=SI($B$31="";"";RECHERCHEV($B$31;Filtre!$A$3:$G8;4;0))]
Sheets("Trame commande").[F34:AK34] = Sheets("Trame commande").[=SI($B$34="";"";RECHERCHEV($B$34;Filtre!$A$3:$G8;4;0))]
Sheets("Trame commande").[F37:AK37] = Sheets("Trame commande").[=SI($B$37="";"";RECHERCHEV($B$37;Filtre!$A$3:$G8;4;0))]
Sheets("Trame commande").[F40:AK40] = Sheets("Trame commande").[=SI($B$40="";"";RECHERCHEV($B$40;Filtre!$A$3:$G8;4;0))]
Sheets("Trame commande").[F43:AK43] = Sheets("Trame commande").[=SI($B$43="";"";RECHERCHEV($B$43;Filtre!$A$3:$G8;4;0))]
Sheets("Trame commande").[F46:AK46] = Sheets("Trame commande").[=SI($B$46="";"";RECHERCHEV($B$46;Filtre!$A$3:$G8;4;0)) ]
Sheets("Trame commande").[F49:AK49] = Sheets("Trame commande").[=SI($B$49="";"";RECHERCHEV($B$49;Filtre!$A$3:$G8;4;0))]
Sheets("Trame commande").[F52:AK52] = Sheets("Trame commande").[=SI($B$52="";"";RECHERCHEV($B$52;Filtre!$A$3:$G8;4;0))]
Sheets("Trame commande").[F55:AK55] = Sheets("Trame commande").[=SI($B$55="";"";RECHERCHEV($B$55;Filtre!$A$3:$G8;4;0))]
Sheets("Trame commande").[AO28:AR28] = Sheets("Trame commande").[=SI($B$28="";"";RECHERCHEV($B$28;Filtre!$A$3:$G$8;5;0))]
Sheets("Trame commande").[AO31:AR31] = Sheets("Trame commande").[=SI($B$31="";"";RECHERCHEV($B$31;Filtre!$A$3:$G$8;5;0))]
Sheets("Trame commande").[AO34:AR34] = Sheets("Trame commande").[=SI($B$34="";"";RECHERCHEV($B$34;Filtre!$A$3:$G$8;5;0))]
Sheets("Trame commande").[AO37:AR37] = Sheets("Trame commande").[ =SI($B$37="";"";RECHERCHEV($B$37;Filtre!$A$3:$G$8;5;0))]
Sheets("Trame commande").[AO40:AR40] = Sheets("Trame commande").[=SI($B$40="";"";RECHERCHEV($B$40;Filtre!$A$3:$G$8;5;0))]
Sheets("Trame commande").[AO43:AR43] = Sheets("Trame commande").[=SI($B$43="";"";RECHERCHEV($B$43;Filtre!$A$3:$G$8;5;0))]
Sheets("Trame commande").[AO46:AR46] = Sheets("Trame commande").[=SI($B$46="";"";RECHERCHEV($B$46;Filtre!$A$3:$G$8;5;0))]
Sheets("Trame commande").[AO49:AR49] = Sheets("Trame commande").[=SI($B$49="";"";RECHERCHEV($B$49;Filtre!$A$3:$G$8;5;0)) ]
Sheets("Trame commande").[AO52:AR52] = Sheets("Trame commande").[=SI($B$52="";"";RECHERCHEV($B$52;Filtre!$A$3:$G$8;5;0))]
Sheets("Trame commande").[AO55:AR55] = Sheets("Trame commande").[=SI($B$55="";"";RECHERCHEV($B$55;Filtre!$A$3:$G$8;5;0)) ]
Sheets("Trame commande").[BA28:BN28] = Sheets("Trame commande").[=SI($B$28<>0;RECHERCHEV($B$28;Filtre!$A$3:$G$8;6;0);"")]
Sheets("Trame commande").[BA31:BN31] = Sheets("Trame commande").[=SI($B$31="";"";RECHERCHEV($B$31;Filtre!$A$3:$G$8;6;0))]
Sheets("Trame commande").[BA34:BN34] = Sheets("Trame commande").[ =SI($B$34="";"";RECHERCHEV($B$34;Filtre!$A$3:$G$8;6;0))]
Sheets("Trame commande").[BA37:BN37] = Sheets("Trame commande").[=SI($B$37="";"";RECHERCHEV($B$37;Filtre!$A$3:$G$8;6;0))]
Sheets("Trame commande").[BA40:BN40] = Sheets("Trame commande").[=SI($B$40="";"";RECHERCHEV($B$40;Filtre!$A$3:$G$8;6;0))]
Sheets("Trame commande").[BA43:BN43] = Sheets("Trame commande").[=SI($B$43="";"";RECHERCHEV($B$43;Filtre!$A$3:$G$8;6;0))]
Sheets("Trame commande").[BA46:BN46] = Sheets("Trame commande").[=SI($B$46="";"";RECHERCHEV($B$46;Filtre!$A$3:$G$8;6;0))]
Sheets("Trame commande").[BA49:BN49] = Sheets("Trame commande").[=SI($B$49="";"";RECHERCHEV($B$49;Filtre!$A$3:$G$8;6;0))]
Sheets("Trame commande").[BA52:BN52] = Sheets("Trame commande").[=SI($B$52="";"";RECHERCHEV($B$52;Filtre!$A$3:$G$8;6;0))]
Sheets("Trame commande").[BA55:BN55] = Sheets("Trame commande").[=SI($B$55="";"";RECHERCHEV($B$55;Filtre!$A$3:$G$8;6;0))]
Et que ça marche pas, genre quand j'ouvre mon fichier, il m'affiche dans les cellules
F28-AK55, AO28-AR55 et BA28-BN55 #valeur et j'ai pas les formules.
est-ce que pourriez-vous revoir où mon problème svp!!
cldt
https://www.cjoint.com/c/FEyiUMZODck
Dommage que votre tableau soit rempli de cellules fusionnées, on aurait fait plus court.
Cdlt
1) ajouter en toute première ligne (tout en haut) du module la ligne suivante
Option Compare Text
2)Votre feuille s'appelle "Trame commande " il y a un espace après commande, soit vous supprimez l'espace ou bien vous le rajouté dans la ligne de commande.
voici le programme:
Option Compare Text
Option Explicit
Const Col_destinataire = 34
Const Col_contact = 34
Const Col_Designation = 6
Const col_PrixHT = 31
Dim Lig_contact
Dim Lig_Designation
Dim Lig_PrixHT
Dim Lig_destinataire
Dim i
Sub Macro1()
'Creation du fichier Excel de la commande
Dim ligne As Integer 'numero de la ligne non vide en début de macro
Dim num_commande_old As Integer 'numero de la derniere commande
Dim num_commande_new As Integer 'numero de la nouvelle commande
Dim annee_en_cours As Integer 'année en cours
Dim nom_commande As String 'nom de la commande = PM-anneeencours-num_commande_new
Dim date_commande As Date 'date de la commande
Dim fournisseur As String 'nom du fournisseur
Dim montant_HT As Double 'montant HT
Dim montant_TTC As Double 'montant TTC
Dim objWorkbookCible As Workbook
Dim objworkbooksource As Workbook
'selection de l'onglet
Sheets("commandes").Select
'selection de la derniere ligne non vide dans colonne A, recherche du bas vers le haut
Range("A" & Rows.Count).End(xlUp).Select
'numero de la ligne non vide en début de macro
ligne = ActiveCell.Row
'numero de la derniere commande
num_commande_old = ActiveCell.Value
' numero de la nouvelle commande
num_commande_new = num_commande_old + 1
'inscription du nouveau numero de commande dans la liste
Range("A" & (ligne + 1)).Value = num_commande_new
'année en cours
annee_en_cours = Year(Date)
'nom de la commande
nom_commande = ("PM_" & CStr(annee_en_cours) & "_" & CStr(num_commande_new))
'selection de l'onglet
Sheets("trame commande").Select
'inscrit le numero de la commande sur la commande
Range("G22:N22").Value = nom_commande
'copie des infos d'une feuille vers l'autre
' Worksheets("commandes").Range("I" & (ligne + 1)).Value = Worksheets("trame commande").Range("AX24:BD24").Value 'date de la commande
'nom du fournisseur
Worksheets("commandes").Range("B" & (ligne + 1)).Value = Worksheets("trame commande").Range("AR13:BN13").Value
' TOTAL HT
Worksheets("commandes").Range("C" & (ligne + 1)).Value = Worksheets("trame commande").Range("AS66:AZ67").Value
' Worksheets("commandes").Range("H" & (ligne + 1)).Value = Worksheets("trame commande").Range("AS72:AZ73").Value ' Montant TTC
' copie de formules de trame commande de ligne F28-BA55
'réation du fichier excel de la commande
Set objworkbooksource = ActiveWorkbook
Worksheets(1).Copy
Set objWorkbookCible = ActiveWorkbook
'change le nom de l'onglet
Sheets(1).Name = nom_commande
Sheets(1).Cells.Copy
Sheets(1).Cells.PasteSpecial Paste:=xlPasteValues
'ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True 'active la protection
'ActiveWorkbook.SaveAs Filename:="T:\Vincent\document\" & nom_commande & "test.xls" 'sauvegarde de la commande - modifier le chemin
Suite:
'efface les données de la trame commande
Windows("COMMANDE-OUTIL-MANUELTemo.xlsm").Activate
Worksheets("trame commande").Activate
'efface le numero de la commande
Range("G22:N22").Value = ""
'efface la référence commande
Range("G24:N24").Value = ""
'Effacer la quantité
Range("AL28:AN55").Value = ""
'effacer date
Range("AR24:BB24").Value = ""
Sheets("Fournisseur").[S1] = Sheets("Fournisseur").[C2]
Sheets("Trame commande").[B28:B55] = Sheets("Trame commande").[AL55]
ActiveWorkbook.Save
ActiveWorkbook.Close
ActiveSheet.Unprotect 'desactive la protection
For i = 1 To 1000 'Supprime les boutons
On Error Resume Next
ActiveSheet.Shapes.Range(Array("Picture 1" & i)).Select
If Err.Number = 0 Then
Selection.Delete
GoTo Suite
End If
On Error GoTo 0
Next i
End Sub
cldt
Si il y a un blocage , il faut me dire à quel endroit et me donner la ligne en défaut, parce que chez moi cela se passe bien, l'ai pas de soucis.
j'aimerais rester en contact avec vous, si c'est possible, je souhaite en fait vous suivre et être enseigné par vous, je voudrais élargir, comprendre et approfondir mes connaissances dans la programmation, merci.
cldt
Je ne suis pas enseignant, et n'ai sûrement pas la prétention de pouvoir former qui que ce soit. Mais pour approfondir vos connaissances, il y a plusieurs façons de procéder. Il existe une grande quantité de livres traitant le sujet, des sites internet, des formations personnalisées, des forums comme CCM où des gens de bonnes volontés et très compétents sont prêts à vous donner un coup de main. Amusez-vous à faire des manipulations sur une feuille Excel en utilisant l'enregistreur de macro, puis allez sur la page de code (avec les touches ALT + F11) et essayez de comprendre ce qui à été enregistré. Faites des modifications et observez? servez-vous de l'aide en ligne. Si vous butez sur le sens d'une instruction, positionnez-vous sur le terme en question et appuyez sur la touche F1, une fenêtre s'ouvrira donnant toutes les explications avec des exemples à l'appui. Soyez curieux, regardez les demandes des autres personnes sur ce forum, essayez de résoudre leurs problèmes et analysez les réponses qui leurs sont faites. De toute évidence, il faut du temps, mais si vous êtes passionné et suivez les quelques conseils que je vous ai donné, vous évoluerez rapidement. Courage.
Cordialement


je voudrais forcer une valeur à 1 dans ma macro Trame commande et je vois pas quel fonction utiliser.
je voudrais en fait dire que dans la feuille fournisseur, A3=C2
j'ai essayé de procéder comme cela:
Dim a as string
a="c3"
range.fournisseur"a3".value=a
mais ça marche pas
cldt