Passer une macro du lancement automatique à un bouton
Bonjour,
Je travail sur une macro qui utilise une fonction pour allez rechercher des données dans un bdd ou un autre fichier.
Je ne m'y connais pas assez pour comprendre la macro donc la modifier m'est difficile.
Cette fonction s'exécute dès le lancement du tableur et prend plusieurs minutes. Je souhaiterai la lié à un bouton mais je n'arrive pas à la retirer du lancement automatique et à la replacer dans les macro "classique" qu'on peut sélectionner dans les macro exécutables d'un bouton.
Je pensais qu'il fallait remplacer "public function" par "sub" mais je me retrouve avec plein d'erreurs d'arguments, etc...
Voici les fonctions en question :
Public Function getPrixFournisseur(ByVal codeArticle As String) As Double
Dim http As Object, JSON As Object, i As Integer
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", "http://frn-srv-mdm/rest/articles/" & codeArticle, False
http.Send
Set JSON = ParseJson(http.responseText)
For Each Item In JSON
getPrixFournisseur = Item("Unite_Cost")
Next
End Function
Public Function getPRI(ByVal codeArticle As String) As Double
Dim http As Object, JSON As Object, i As Integer
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", "http://frn-srv-mdm/rest/articles/" & codeArticle, False
http.Send
Set JSON = ParseJson(http.responseText)
For Each Item In JSON
getPRI = Item("Standard_Cost")
Next
End Function
Merci !
Bonjour,
Si le code s'exécute au démarrage du fichier, c'est que le code est dans "ThisWorkbook" ...
Private Sub Workbook_Open()
ric
Je ne comprends pas vraiment ce que je dois faire de cette information
Le mettre avant le "public function" (avec un "end sub") ne marche pas.
Si je remplace le "public function" par ce que tu m'a dit j'ai une erreur de syntaxe.
Je sais que je demande qu'on me fasse tout le travail mais je n'y arrive vraiment pas tout seul
Edit:
J'ai fait quelques recherche pour finalement comprendre que c'était très différent des macro.
Mon fichier met du temps à s'ouvrir car la formule personnalisée est présente dans bcp de cellules.
Existerait-il un moyen de désactiver de base la mise à jour de cette formule personnalisé en particulier (pas de toutes les formules car j'ai d'autres formules plus simple qui trainent et doivent se mettre à jour en temps réel) et de la réactiver sur demande grâce à une macro ?
Bonjour,
Ces "Function" sont appelées par d'autres codes.
Éventuellement, on pourrait créer une condition afin de pauser.
Sans le fichier (anonymisé), il est bien difficile de bien comprendre le fonctionnement.
ric
Voici le fichier anonymisé
Edit:
La seule solution que j'ai trouvé est de mettre une colonne avec des cases à cocher (ça pourrait juste être un chiffre hein) et que ensuite une macro sélectionne les cases X1 colonnes à droite de celles qui ont la valeur "vrai" (quand la case est cochée) et d'y insérer une formule qui va comprendre la cellule X2 cases à droite puis copier/coller (que les nombres).
Je vais faire un exemple pour détaillé mon explication
Ex :
- si A1, A2, B5 sont égales à "vrai" (case cochée) alors les cases B1, B2 et B5 sont sélectionnées (et pas B3 et B4)
- la macro écris alors, dans les cases sélectionnées, =getPRI(C1) , =getPRI(C2) et =getPRI(C5) soit "getPRI(x)" avec x 1 cases à gauche des cellules sélectionnée
- la macro copie ensuite ces cases tjr sélectionnées et les colle en valeur uniquement (afin que les formules ne se remettent pas à jour à la prochaine ouverture)
Malheureusement je ne saurai pas le faire moi même, quelqu'un pourrait me rédiger cette macro svp
Bon, j'ai avancé sur la question.
Avec quelques recherches j'ai réussi à définir un range des cases en fonction de la valeur de la première colonne (vrai ou faux).
J'arrive à y appliquer une formule avec des valeurs simples mais pas une formule faisant référence à un case de la même ligne (pour chaque cellule de ma range).
Voici le code et un fichier :
Sub SelectByCellValue()
Dim lastrow As Long
Dim xRg As Range, yRg As Range, Ref As Range 'Déclaration des ranges
With ThisWorkbook.Worksheets("Feuil1") 'Sélection de la feuille
lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
'Pour accélérer la macro
For Each xRg In .Range("A1:A" & lastrow)
If UCase(xRg.Text) = "VRAI" Then
Set yRg = .Range("B" & xRg.Row) 'J'associe les valeur en B de xRg à la range yRg
yRg.Formula = "=sum("C" xRg.Row)" 'ma formule, là où j'ai une erreur de syntaxe
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
End If
Next xRg
End With
End Sub
La fonction sum n'est utilisé que pour le test, j'utiliserai une formule personnalisée en réalité ( .formule marchera ?)
Je n'arrive donc pas à faire une formule qui prenne en compte ma range yRg (mettre en BX, formule prennant CX si AX=Vrai)
J'arrive à y mettre un formule avec des valeur simple (=sum(C2) ) mais dès que je veux faire référence à un cellule qui dépend de la ligne dans laquelle je suis, je suis bloqué
Je voudrai également savoir si il y a une solution pour le faire dans toutes mes feuilles d'un coup ? ou est-ce que je dois appliquer la macro à chaque feuille ?
Si vous avez une solution à mon problème ou un meilleur moyen de faire ce que je veux, merci :
La seules solution alternative que je vois est de copier une cellule avec ma formule et de la copier dans la range.
Mais ce ne serait pas très propre
Bon, je suis parti sur la solution de copier/coller-spéciale une autre case avec la formule afin que la formule s'adapte à la ligne où elle est posée.
La macro est plutôt rapide (1-2sec) même si elle fait parfois buguer excel (15-20sec) si j''utilise trop de ressources hors excel (PC de boulot pas très performant)
Voici la macro si jamais :
Sub getPRImacro()
Dim lastrow As Long
Dim xRg As Range
'Déclaration des variables
With ThisWorkbook.ActiveSheet
'Sélection de la feuille active
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
'Désactivation de certains trucs pour accélérer la macro
For Each xRg In .Range("J6:J150")
If UCase(xRg.Text) = "VRAI" Then
'Cherche les valeurs "Vrai" (case à cocher cochée) dans la colonne
ThisWorkbook.Worksheets("Modifications").Range("i4").Copy
'va chercher la case avec la formule
ActiveSheet.Range("K" & xRg.Row).PasteSpecial
'colle-special la formule en adaptant les cases auxquelles elle fait référence
ActiveSheet.Range("K" & xRg.Row) = ActiveSheet.Range("K" & xRg.Row).Value
'copie/colle (que les valeurs) les cases afin que la formule ne reste pas (sinon elle se met à jour à l'ouverture et fait rammer excel)
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
'Réactive les trucs qui ralentissaient la macro
End If
Next xRg
End With
End Sub