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

8forum.xlsm (57.23 Ko)

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

3test.xlsm (25.54 Ko)

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
Rechercher des sujets similaires à "passer macro lancement automatique bouton"