Automatiser un calcul excel, plusieurs questions

Résolu/Fermé
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016 - 22 déc. 2014 à 16:15
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016 - 23 déc. 2014 à 17:35
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 :

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:

6 réponses

Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
22 déc. 2014 à 16:22
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
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
22 déc. 2014 à 16:43
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 :

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


0
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
22 déc. 2014 à 16:55
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.
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
22 déc. 2014 à 17:06
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 :
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


0
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
Modifié par Akre66 le 23/12/2014 à 09:52
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..) ?
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
23 déc. 2014 à 09:45
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


0
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
Modifié par Akre66 le 23/12/2014 à 10:27
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
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
23 déc. 2014 à 10:23
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
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
Modifié par jordane45 le 23/12/2014 à 11:57

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
0

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

Posez votre question
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
23 déc. 2014 à 13:28
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 :)
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
23 déc. 2014 à 14:40
j'ai toujours un erreur pour les cellules fusionnées.

Laquelle ?
Le code que je t'ai donné fonctionne chez moi....
bizarre...
0
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
23 déc. 2014 à 15:03
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
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
23 déc. 2014 à 15:10
Heu.. la fatigue aidant.. je n'ai pas bien compris ta question.... :-)

Pourrais tu déposer un fichier Exemple sur le site : www.cijoint.com et nous filer le lien ?
Et en nous réexpliquant ce que tu cherches à faire ?
0
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
23 déc. 2014 à 17:27
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
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
23 déc. 2014 à 17:33
Si tu as réussi c'est l'essentiel.

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 )....
0
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
23 déc. 2014 à 17:35
C'est pas faux.
Ok merci pour tout :)


Je vais m'attaquer à l'interface graphique, mais ça me fait un peu peur...
0