Automatiser un calcul excel, plusieurs questions
Résolu
Akre66
Messages postés
55
Date d'inscription
Statut
Membre
Dernière intervention
-
Akre66 Messages postés 55 Date d'inscription Statut Membre Dernière intervention -
Akre66 Messages postés 55 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je sais coder en Perl, C:C++ et Python, mais là on me demande de coder en VBA et j'ai du mal.
Premièrement, je voulais savoir si quelqu'un peut m'indiquer un site (gratuit) pour apprendre le VBA ?
J'en trouve pas mal, mais sans exemple concrets, sans types de fonctions bien définies. Je dois mal chercher mais je trouve sur des trucs avec peu de détails, et peu d'exemples. Je trouve pas ce langage intuitif donc j'ai vraiment du mal, mais j'aimerai apprendre.
Sinon, je dois automatiser un procédé.
J'aurai du mal à vous montrer le fichier excel (confidentiel). Mais je pense pourvoir vous l'expliquer.
Il y a plusieurs feuilles de calculs. Chaque feuille dépend de deux critères, du site et d'un mode.
Sur chaque feuille l'opérateur doit rentrer des valeurs (des cases jaunes) et va lui permettre de lire une valeur dans un tableau.
Mon but serait d'automatiser tout ça.
Alors l'opérateur devra juste remplir 7 cases sur une feuille que j'ai nommé « Interface ».
Les deux premiers (menus déroulant imbriqués) donnent le nom de la feuille de calcul cible (nommé « Cible »).
3 sont des données à remplacer dans la feuille « Cible » pour que les calculs s'enchainent avec les bonnes valeurs. Une autre n'est qu'une information. La dernière permet de situer sur le tableau des résultats.
On doit alors sortir deux valeurs, pour l'indiquer à l'operateur de préférence sur la feuille interface.
L'exécution de cette commande doit se faire après avoir rempli les données et appuyer sur un bouton.
Notes : Les cellules dans la feuille cible pour lesquels je dois rentrer les valeurs n'ont pas forcément la même localisation (en général la ligne change entre deux feuilles).
J'ai commencé par ça, mais je pense vraiment que c'est pas super :
Je suis vraiment nul là, donc n'hésitez pas à détruire cette ébauche, je sais que c'est nul.
Merci beaucoup d'avance,
Je sais coder en Perl, C:C++ et Python, mais là on me demande de coder en VBA et j'ai du mal.
Premièrement, je voulais savoir si quelqu'un peut m'indiquer un site (gratuit) pour apprendre le VBA ?
J'en trouve pas mal, mais sans exemple concrets, sans types de fonctions bien définies. Je dois mal chercher mais je trouve sur des trucs avec peu de détails, et peu d'exemples. Je trouve pas ce langage intuitif donc j'ai vraiment du mal, mais j'aimerai apprendre.
Sinon, je dois automatiser un procédé.
J'aurai du mal à vous montrer le fichier excel (confidentiel). Mais je pense pourvoir vous l'expliquer.
Il y a plusieurs feuilles de calculs. Chaque feuille dépend de deux critères, du site et d'un mode.
Sur chaque feuille l'opérateur doit rentrer des valeurs (des cases jaunes) et va lui permettre de lire une valeur dans un tableau.
Mon but serait d'automatiser tout ça.
Alors l'opérateur devra juste remplir 7 cases sur une feuille que j'ai nommé « Interface ».
Les deux premiers (menus déroulant imbriqués) donnent le nom de la feuille de calcul cible (nommé « Cible »).
3 sont des données à remplacer dans la feuille « Cible » pour que les calculs s'enchainent avec les bonnes valeurs. Une autre n'est qu'une information. La dernière permet de situer sur le tableau des résultats.
On doit alors sortir deux valeurs, pour l'indiquer à l'operateur de préférence sur la feuille interface.
L'exécution de cette commande doit se faire après avoir rempli les données et appuyer sur un bouton.
Notes : Les cellules dans la feuille cible pour lesquels je dois rentrer les valeurs n'ont pas forcément la même localisation (en général la ligne change entre deux feuilles).
J'ai commencé par ça, mais je pense vraiment que c'est pas super :
Sub Test() 'Declaration des variables Dim Cible As String Dim Puissance As Single Dim BU As Single Dim Temperature As Single Dim Coeff As Single Dim Grappe As Boolean 'Activation de la feuille d'entrée Worksheets("Interface").Activate 'On récupére les données d'entrée Cible = XL.Range("A7").Value Puissance = XL.Range("C3").Value BU = XL.Range("D3").Value Temperature = XL.Range("E3").Value Coeff = XL.Range("F3").Value Grappe = XL.Range("G3").Value 'Activation de la cible Sheets(Cible).Activate 'On écrit les valeurs d'entrée dans les cases correspondantes Range("C4").Select Selection.Value = Puissance Range("D34").Select Selection.Value = Temperature Range("C36").Select Selection.Value = Coeff End Sub
Je suis vraiment nul là, donc n'hésitez pas à détruire cette ébauche, je sais que c'est nul.
Merci beaucoup d'avance,
A voir également:
- Automatiser un calcul excel, plusieurs questions
- Calcul moyenne excel - Guide
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Classer par ordre alphabétique excel plusieurs colonnes - Guide
- Formule excel pour additionner plusieurs cellules - Guide
6 réponses
A oui et le code ne tient pas encore en compte que les données à rentrer ne sont toujours pas aux memes colonnes ou lignes
Bonjour,
Déjà.. évite de faire des .SELECT .... Selection.value ......
Ensuite.. tu utilises une variable XL .. mais qui n'existe pas (n'est pas initialisée dans ton code)..
Bref.. ton code "corrigé" donne :
Déjà.. évite de faire des .SELECT .... Selection.value ......
Ensuite.. tu utilises une variable XL .. mais qui n'existe pas (n'est pas initialisée dans ton code)..
Bref.. ton code "corrigé" donne :
Sub Test() 'Declaration des variables Dim Cible As String Dim Puissance As Single Dim BU As Single Dim Temperature As Single Dim Coeff As Single Dim Grappe As Boolean Dim FSource As Worksheet Dim FCible As Worksheet 'Feuille Source Set FSource = Worksheets("Interface") 'On récupére les données d'entrée Cible = FSource.Range("A7").Value Puissance = FSource.Range("C3").Value BU = FSource.Range("D3").Value Temperature = FSource.Range("E3").Value Coeff = FSource.Range("F3").Value Grappe = FSource.Range("G3").Value 'Feuille Cible Set FCible = Worksheets(Cible) 'On écrit les valeurs d'entrée dans les cases correspondantes FCible.Range("C4").Value = Puissance FCible.Range("D34").Value = Temperature FCible.Range("C36").Value = Coeff End Sub
Merci beaucoup
Pardon pour les erreurs, mais le problème qui me pose surtout problème c'est comment puis je remplacer les valeurs dans les feuilles cibles ?
J'essaye de trouver un équivalant "grep" pour la VBA, afin de déterminer la cellule ou voir la cellule d'avant.
Pardon pour les erreurs, mais le problème qui me pose surtout problème c'est comment puis je remplacer les valeurs dans les feuilles cibles ?
J'essaye de trouver un équivalant "grep" pour la VBA, afin de déterminer la cellule ou voir la cellule d'avant.
Je ne comprend pas....
Tu veux déterminer dans QUELLES cellules se trouvent les données à remplacer dans tes feuilles cibles c'est ça ??
Il te faudra donc utiliser la méthode FIND :
https://forums.commentcamarche.net/forum/affich-37621992-methode-find-dans-vba-recherche-de-donnees-sous-excel#exemple-d-utilisation
Exemple :
Tu veux déterminer dans QUELLES cellules se trouvent les données à remplacer dans tes feuilles cibles c'est ça ??
Il te faudra donc utiliser la méthode FIND :
https://forums.commentcamarche.net/forum/affich-37621992-methode-find-dans-vba-recherche-de-donnees-sous-excel#exemple-d-utilisation
Exemple :
Sub toto() Dim cellToWrite As Range Dim cherche As String Dim Fcible As Worksheet Set Fcible = Worksheets(1) 'on cherche dans quelle cellule se trouve le mot "test" ' et on y écrit ..."ça marche" cherche = ChercheCelluleByString("test") If cherche <> "erreur" Then Set cellToWrite = Range(cherche) cellToWrite.Value = "ça marche" End If End Sub Function ChercheCelluleByString(Valeur_Cherchee As String) 'déclaration des variables : Dim Trouve As Range Dim AdresseTrouvee As String 'méthode find, ici on cherche la valeur exacte (LookAt:=xlWhole) Set Trouve = Cells.Find(What:=Valeur_Cherchee, LookAt:=xlWhole) 'traitement de l'erreur possible : Si on ne trouve rien : If Trouve Is Nothing Then 'ici, traitement pour le cas où la valeur n'est pas trouvée AdresseTrouvee = "erreur" Else 'ici, traitement pour le cas où la valeur est trouvée AdresseTrouvee = Trouve.Address End If ChercheCelluleByString = AdresseTrouvee Set Trouve = Nothing End Function
Oui, je dois trouver la cellule où la valeur doit être changer. Je pense donc trouver celle juste avant (qui est fixe) pour en sortir sa position pour déterminer celle de cellule à changer.
Ok je saisi je crois avec l'exemple et le lien. Merci beaucoup. Je vais essayer.
Je comprends mieux aussi l'importance de tes corrections dans le premier commentaire, merci encore.
PS: Pas besoin de préciser le Worksheets pour la fonction ChercheCelluleByString ?
EDIT: Sinon puis je utiliser un sorte de find non pas sur la valeur de la cellule mais "son unité" (format de cellule, nombre, Personnalisée etc..) ?
Ok je saisi je crois avec l'exemple et le lien. Merci beaucoup. Je vais essayer.
Je comprends mieux aussi l'importance de tes corrections dans le premier commentaire, merci encore.
PS: Pas besoin de préciser le Worksheets pour la fonction ChercheCelluleByString ?
EDIT: Sinon puis je utiliser un sorte de find non pas sur la valeur de la cellule mais "son unité" (format de cellule, nombre, Personnalisée etc..) ?
PS: Pas besoin de préciser le Worksheets pour la fonction ChercheCelluleByString ?
Ah si...
Passe la feuille en paramètre de la fonction.
Sub toto() Dim cellToWrite As Range Dim cherche As String Dim Fcible As Worksheet Set Fcible = Worksheets(1) 'on cherche dans quelle cellule se trouve le mot "test" ' et on y écrit ..."ça marche" cherche = ChercheCelluleByString("test", Sheets(2)) If cherche <> "erreur" Then Set cellToWrite = Range(cherche) cellToWrite.Value = "ça marche" End If End Sub Function ChercheCelluleByString(Valeur_Cherchee As String, Optional Sh As Worksheet) If Sh Is Nothing Then Set Sh = ActiveSheet 'déclaration des variables : Dim Trouve As Range Dim AdresseTrouvee As String 'méthode find, ici on cherche la valeur exacte (LookAt:=xlWhole) Set Trouve = Sh.Cells.Find(What:=Valeur_Cherchee, LookAt:=xlWhole) 'traitement de l'erreur possible : Si on ne trouve rien : If Trouve Is Nothing Then 'ici, traitement pour le cas où la valeur n'est pas trouvée AdresseTrouvee = "erreur" Else 'ici, traitement pour le cas où la valeur est trouvée AdresseTrouvee = Trouve.Address End If ChercheCelluleByString = AdresseTrouvee Set Trouve = Nothing End Function
Oui j'avais rajouté le truc, sinon ça s'exécute sur le feuille ouverte.
Le fait que Sh soit optionnel me semble embêtant.
J'essaye maintenant, une fois l'adresse de la case trouvé, de modifier celle qui suit (colonne suivante). Y a t'il un lien logique du genre adresse=adresse+1 ou dois je lui faire sortir la colonne et la ligne pour ensuite sauter une colonne ? (je sais pas si j'étais clair).
je vois le "Column + 1" mais je vois pas trop comment le mettre
Le fait que Sh soit optionnel me semble embêtant.
J'essaye maintenant, une fois l'adresse de la case trouvé, de modifier celle qui suit (colonne suivante). Y a t'il un lien logique du genre adresse=adresse+1 ou dois je lui faire sortir la colonne et la ligne pour ensuite sauter une colonne ? (je sais pas si j'étais clair).
je vois le "Column + 1" mais je vois pas trop comment le mettre
Le fait que Sh soit optionnel me semble embêtant.
Pourquoi ?
Soit tu lui passes une feuille lorsque tu appels la fonction.... soit tu ne lui dis rien et dans ce cas il prendra la feuille active..
J'essaye maintenant, une fois l'adresse de la case trouvé, de modifier celle qui suit (colonne suivante). Y a t'il un lien logique du genre adresse=adresse+1 ou dois je lui faire sortir la colonne et la ligne pour ensuite sauter une colonne ? (je sais pas si j'étais clair).
Actuellement la fonction te retourne l'adresse de la cellule où se trouve l'info....
Tu peux, si tu préfères.. ne retourner "que" la colonne....
AdresseTrouvee = Trouve.Address 'Pour la colonne: AdresseTrouvee = Trouve.Column
Ca pouvait pas être aussi facile (mohahaha)
Si c'était "facile".. tu n'aurais pas besoin de nous... :-)
Question, pour la fonction FIND, les cellules fusionnés posent elle pas problèmes ?
J'essaye de retrouver les cellules commes la première fois, le string est le même, j'ai même mis xlPart à la place de xlWhole dans le FIND, mais rien n'y change.
Problème ? .. Non... mais il faut connaitre le fonctionnement d' Excel.
Les Coordonnées d'une plage de cellules Fusionnées.. c'est la cellule la plus en HAUT à GAUCHE
Par exemple.. Fusionne les cellules A1 Jusqu'à C6 ....
Places toi sur la cellule...
Tu verras (dans la zone en haut à gauche de ta fenêtre) que ses coordonnées sont .... A1 !
Donc.. il va te falloir .. vérifier si la cellule est fusionnée ou non avant d'appliquer ton "+1" sur ta colonne.
'on cherche dans quelle cellule se trouve le mot "test" ' et on y écrit ..."ça marche" cherche = ChercheCelluleByString("test") If cherche <> "erreur" Then Set cellToWrite = Cells(Range(cherche).Row, Range(cherche).Column + 1) '------------------------------------------------------- 'On regarde si ce sont des cellules Fusionnées '------------------------------------------------------- If cellToWrite.MergeCells Then Debug.Print "cellule fusionnée : " & cellToWrite.MergeArea.Address MergRng = Split(cellToWrite.MergeArea.Address, ":") LastColMerge = Range(MergRng(1)).Column LastRowMerge = Range(MergRng(1)).Row Set cellToWrite = Cells(LastRowMerge, LastColMerge + 1) End If '------------------------------------------------------- cellToWrite.Value = "ça marche" End If
Avant de poser une question, merci de lire la charte du site.
Cordialement, Jordane
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
A non j'ai dit que j'ai que ça pouvait pas être aussi facile, c'est parce que je pensais que je pouvais appliquer la même logique que pour la première valeur, mais ça marche pas vu que les cellules sont fusionnés. C'était pas du tout dans le sens où j'aurai pu tout déchiré...
En soit non, j'aurai pas pu sans t'aide, du moins il m'aurait fallu bien plus de temps. Merci d'ailleurs.
Je commence à comprendre la logique du VBA mais je trouve ça pas intuitif...
Sinon, j'ai toujours un erreur pour les cellules fusionnées. Si je trouve pas je reviendrai, sinon ça devrait le faire donc merci :)
En soit non, j'aurai pas pu sans t'aide, du moins il m'aurait fallu bien plus de temps. Merci d'ailleurs.
Je commence à comprendre la logique du VBA mais je trouve ça pas intuitif...
Sinon, j'ai toujours un erreur pour les cellules fusionnées. Si je trouve pas je reviendrai, sinon ça devrait le faire donc merci :)
C'est bon !Quelques petits imprévus mais ça marche.
Pour le reste je me pose quelques questions...
Alors avec deux données (une donnée un entier qui varie pas mal et un autre booléen (oui ou non)) je dois déterminer un valeur à l'aide d'un tableau.
Ce tableau à deux entrée (Varriable1(entier): ligne, Varriable2(booléen)=colonne)) se situe toujours pas au même niveau.
Donc j'ai pensé à faire un finder en se situant juste sur la colonne ou sont regroupés la variable 1 (les entiers) et après la première case du tableau, pour sortir la ligne de la valeur que je cherche.
Après pour la colonne comme elle ne varie pas de feuille en feuille je peux juste la donner directement. Du coup je voulais savoir ce que tu en pensais ?
Tu connais d'autres méthodes pour sortir une valeur d'un tableau ?
Merci, mais sinon je pense pouvoir m'en tirer grâce à toi... Merci encors
Pour le reste je me pose quelques questions...
Alors avec deux données (une donnée un entier qui varie pas mal et un autre booléen (oui ou non)) je dois déterminer un valeur à l'aide d'un tableau.
Ce tableau à deux entrée (Varriable1(entier): ligne, Varriable2(booléen)=colonne)) se situe toujours pas au même niveau.
Donc j'ai pensé à faire un finder en se situant juste sur la colonne ou sont regroupés la variable 1 (les entiers) et après la première case du tableau, pour sortir la ligne de la valeur que je cherche.
Après pour la colonne comme elle ne varie pas de feuille en feuille je peux juste la donner directement. Du coup je voulais savoir ce que tu en pensais ?
Tu connais d'autres méthodes pour sortir une valeur d'un tableau ?
Merci, mais sinon je pense pouvoir m'en tirer grâce à toi... Merci encors
Bah j'ai réussis. Ca marche sans soucis.
J'aimerai bien mais y a beaucoup de truc confidentiel (du moins je crois et j'ose pas tester) donc faudrait que je change pas mal de chose donc un peu pénible (désolé).
Je vais essayer de m'expliquer un peu mieux, mais sinon c'est pas grave j'ai réussis. C'est juste pour savoir.
J'ai un tableau à deux dimension, C colonnes, L Lignes.
J'ai une valeur pour un C et une pour L, j'aimerai donc trouver la valeur dans ce tableau associer à L et C. Sachant que mon tableau a L et C qui varient, qui ne commencent pas au début (même qu'un tableau similaire se trouve avant donc il faut pas les confondre).
J'ai cherché la ligne avec Find et puis la Colonne avec un autre find, pour obtenir la jonction, ma valeur. Existe il une meilleure méthode ?
Je présume que le Find est assez gourmand si on définit pas une plage
J'aimerai bien mais y a beaucoup de truc confidentiel (du moins je crois et j'ose pas tester) donc faudrait que je change pas mal de chose donc un peu pénible (désolé).
Je vais essayer de m'expliquer un peu mieux, mais sinon c'est pas grave j'ai réussis. C'est juste pour savoir.
J'ai un tableau à deux dimension, C colonnes, L Lignes.
J'ai une valeur pour un C et une pour L, j'aimerai donc trouver la valeur dans ce tableau associer à L et C. Sachant que mon tableau a L et C qui varient, qui ne commencent pas au début (même qu'un tableau similaire se trouve avant donc il faut pas les confondre).
J'ai cherché la ligne avec Find et puis la Colonne avec un autre find, pour obtenir la jonction, ma valeur. Existe il une meilleure méthode ?
Je présume que le Find est assez gourmand si on définit pas une plage
Si tu as réussi c'est l'essentiel.
Pas sûr... du moins.. aucune qui ne me vienne à l'esprit.
En définissant une plage, tu améliorerait son rendement..
Mais bon.. c'est toujours moins gourmand que de faire des Boucles dans des Boucles........
Et puis bon.. le FIND .. c'est la même chose que si tu te places dans ta feuille et que tu fais RECHERCHER ( CTRL + F )....
Existe il une meilleure méthode ?
Pas sûr... du moins.. aucune qui ne me vienne à l'esprit.
Je présume que le Find est assez gourmand si on définit pas une plage
En définissant une plage, tu améliorerait son rendement..
Mais bon.. c'est toujours moins gourmand que de faire des Boucles dans des Boucles........
Et puis bon.. le FIND .. c'est la même chose que si tu te places dans ta feuille et que tu fais RECHERCHER ( CTRL + F )....