IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Alimenter des formulaires en vba /JQUERY


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 093
    Billets dans le blog
    20
    Par défaut Alimenter des formulaires en vba /JQUERY
    Bonjour,
    Nous avons un site INTRANET en JQUERY qui sert à saisir des budgets.

    Je souhaite alimenter les formulaires à partir d'un fichier excel en vba.

    le soucis majeur c'est que le site utilise de l'AJAX JQUERY, pour lancer des requetes séparées qui vont alimenter le formulaire
    et n'a pas de bouton valider mais réagis aux "keypress" et aux événements (blur, change, focus)

    Donc je ne sais pas comment attendre la fin de la requete ajax
    le code suivant ne fonctionnant pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            Do Until Not IEwindow.Busy And IEwindow.ReadyState = READYSTATE_COMPLETE
                        Sleep (300)    'wait 0.5 second
                        DoEvents
                    Loop

    et est ce que sendkeys est la seule méthode pour simuler l'appuie sur une touche ?
    Have a nice day. Oliv'
    Votre réponse est peut être dans mon blog !
    https://www.developpez.net/forums/blogs/191381-oliv-/

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Bonjour,

    non il y a d'autres possibilités, voir mes contributions

    [Pilotage Internet Explorer] Comment attendre la mise à jour d'un élément d'une page web … (Ajax inside !)

    Y voir l'exemple de l'évènement Change d'un élément en déclenchant son OnChange
    Mise à jour de l'étape 2 ce jour dans le post #76 !

    _________________________________________________________________________________________________________
    Je suis Paris, Nice, Bruxelles, Charlie, …

  3. #3
    Expert confirmé
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 093
    Billets dans le blog
    20
    Par défaut
    Merci MARC ce sont des discussions très enrichissantes !

    Pour le OnChange, je n'ai pas sur ma page de script associé à cet événement du coup cela ne fonctionne pas.
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    <input class="form-text" id="exerciceFin" style="width: 70px;" type="text" maxlength="10">
    
    <script>
    var exerciceFin = new CalendarEightysix( 
    		"exerciceFin", {
    		  "startMonday": true
    		, "format": "%d/%m/%Y"
    		, "draggable": true
    		, "prefill": false
    		, "offsetX": -10
    		, "offsetY": +10
    		, "theme": "vista"
    });
    
    </script>
    [/quote]
    
    voici un extrait du fichier .js qui a l'air de contrôler cela
    [QUOTE]lastCheckedExercice = null;
            checkExercice = function (force) {
                var $ex = $('#exercice');
    			var $exFin = $('#exerciceFin');
                var v = $.trim($ex.val());
    			var souscripteur = $('#souscripteur').html();
    			var vFin = $.trim($exFin.val());
                err('exercice');
    			/*
                if (v == '' || (lastCheckedExercice == v && force !== true)) {
                    if (v == '') {
                        $('#actions').css({display: 'none'});
                    }
                    return;
                }*/
                if (v == '' || (lastCheckedExercice == v && force !== true) || vFin=='') {
                    if ( (v == '') || (vFin  == '') ) {
                        $('#actions').css({display: 'none'});
                    }
                    return;
                }			
                loading();
                lastCheckedExercice = v;
                var $ac = $('#actions');
                $ac.css({display: 'none'});
                $.ajax({
                    type: 'POST',
                    url: window.baseUrl + '/gererBudgets/ajaxExerciceContrat',
                    dataType: 'json',
                    //data: {contrat: contrat.id, exercice: v, exerciceFin : vFin},
    				data: {contrat: contrat.id, exercice: v, exerciceFin : vFin, souscripteur : souscripteur},
                    success: function (response) {
                        loaded();
                        if (response.success) {
                            $ex.val(response.value);
                            lastCheckedExercice = response.value;
                            $ex.blur();
                            contrat.criteres = response.criteres;
                            contrat.lignes = response.lignes;
                            $('#actions #buttons').css({display: response.exists ? 'block' : 'none'});
                            //$('#newCritere').css({display: response.lignes.length > 0 ? 'none' : 'table-row'});
    						$('#newCritere').css({display: response.lignes.length > 0 ? 'none' : 'block'});
                            $('#actions #criteria').css({display: 'block'});
                            err('duplicate');
                            $('#exercice2').val('');
    						$('#exercice2DtFin').val('');
                            if (response.lignes.length == 0) {
                                $('#btnDupAll').css({display: 'none'});
                                $('#dupButtons').addClass('noDupAll');
                            }
                            else {
                                $('#btnDupAll').css({display: 'block'});
                                $('#dupButtons').removeClass('noDupAll');
                            }
                            updateCriteres();
                            $ac.css({display: 'block'});
                        }
                        else {
                            err('exercice', response.error || 'Une erreur est survenue.');
                            $ac.css({display: 'none'});
                        }
                    },
                    error: function () {
                        loaded();
                        err('exercice', 'Une erreur est survenue.');
                        $ex.focus();
                    }
                });
            };
    
            $("#exercice").keypress(function (event) {
                var code = (event.keyCode ? event.keyCode : event.which);
                if (code == 13) {
                    // Entrée
                    checkExercice(true);
                    return false;
                }
                if (code < 32) {
                    // Contrôle
                    return true;
                }
    			return true;
                /*if (code < 48 || code > 57) {
                    // Pas chiffre
                    return false;
                }*/
            }).blur(checkExercice);
    
            $("#exerciceFin").keypress(function (event) {
                var code = (event.keyCode ? event.keyCode : event.which);
                if (code == 13) {
                    // Entrée
                    checkExercice(true);
                    return false;
                }
                if (code < 32) {
                    // Contrôle
                    return true;
                }
    			return true;
                /*if (code < 48 || code > 57) {
                    // Pas chiffre
                    return false;
                }*/
            }).blur(checkExercice);

    du coup je fais actuellement comme cela :

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Set exercicefIN = myONGLET.getElementById("exerciceFin")   
            exercicefIN.disabled = False
     
            exercicefIN.Value = Format(Intersect(Contrat.EntireRow, xlBook.Names("Budget_date_fin").RefersToRange).Value, "dd/mm/yyyy")
            exercicefIN.Focus
     
            ActiveIE IEwindow.LocationName & " - " & IEwindow.Name
     
            SendKeys "~", True
    avec l'utilisation d'API
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub ActiveIE(subject As String)
    Dim hwnd As Long, Cemail As String
     
        Cemail = subject
     
     
      If Cemail <> "" Then hwnd = FindWindow(vbNullString, Cemail)
     
      If hwnd = 0 Then Exit Sub
      SetForegroundWindow hwnd
      ShowWindow hwnd, SW_SHOWMAXIMIZED
     
    End Sub


    J'avais par contre trouvé l'astuce du gif

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub WaitJquery(myONGLET As Object)
        Do Until myONGLET.getElementById("budgetsLoading").Style.visibility = "hidden"
            Sleep (300)    'wait 0.5 second
            DoEvents
        Loop
    End Sub
    Have a nice day. Oliv'
    Votre réponse est peut être dans mon blog !
    https://www.developpez.net/forums/blogs/191381-oliv-/

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    As-tu vu le post #76 de mon second lien ?
    Sinon dans un document DOM d'IE il y a une collection des scripts associés à la page …
    Un script peut être lancé via ExecScript comme dans cette discussion.
    Sinon tu en connais certainement plus que moi sur le sujet et comme je ne peux accéder à ta page …

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 241
    Par défaut
    hello,

    A titre indicatif voici un exemple de ce que l'on peut faire avec seleniumbasic ( selenium pour vba).
    L'exemple consiste à cliquer sur une date dans un calendrier et à récupérer la date qui est renvoyée en Ajax dans le champ "Selected Dates". Voici la page :
    Nom : AjaxLoadingPanel.png
Affichages : 789
Taille : 25,4 Ko
    La synchronisation consiste à attendre que le curseur de chargement de page disparaisse (comme toi un peu avec le test de visibilité du GIF )
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Public Sub Test_Ajax()
      'J.P Aout 2016
      Dim by As New by, Assert As New Assert, Verify As New Verify, Waiter As New Waiter
      Dim driver As New WebDriver
      'driver.Start "firefox"
      driver.Start "internet explorer", _
      "http://demos.telerik.com/aspnet-ajax/ajaxloadingpanel/functionality/explicit-show-hide/"
      driver.Get "/defaultcs.aspx"
      ' on attend que la grille apparaisse timeout de 5 secondes max
      Dim container As WebElement
      Set container = driver.FindElement(by.Css(".demo-container"))  '
      While Waiter.Not(EstPresent(container), 10000): DoEvents: Debug.Print "wait grille": Wend
     ' on récupère le texte avant l'appel AJAX
      Dim noDatesTextElement As WebElement
      Set noDatesTextElement = driver.FindElementByXPath("//div[@class='RadAjaxPanel']/span")
      Dim TexteAvantAppelAjax As String
      ' texte présent dans le champ Selected Dates
      TexteAvantAppelAjax = noDatesTextElement.Text
      Debug.Print "Avant : " & TexteAvantAppelAjax
      ' on clique sur la date du 2 du mois en cours dans le calendrier
       driver.FindElement(by.linktext("2")).Click
      ' on attend la disparition du "loader" timeout de 7 secondes
      Dim loader As WebElement
      Set loader = driver.FindElement(by.Class("raDiv"))
       While Waiter.Not(EstPlusPresent(loader), 10000): DoEvents:  Debug.Print "wait fin loader": Wend
      ' texte présent dans le le champ rempli par ajax
      Dim TexteApresAppelAjax As String
      Dim selectedDatesTextElement As WebElement
      Set selectedDatesTextElement = driver.FindElement(by.XPath("//div[@class='RadAjaxPanel']/span"))
      ' on attend que le texte soit présent timeout de 5 secondes
      While Waiter.Not(EstVisible(selectedDatesTextElement), 5000): DoEvents:  Debug.Print "wait texte": Wend
      TexteApresAppelAjax = selectedDatesTextElement.Text
      Debug.Print "Après : " & TexteApresAppelAjax
      Application.Wait Now + TimeValue("0:00:10")
      driver.Quit
    End Sub
    Les fonctions appelées dans les wait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Function EstPresent(ele1 As WebElement)
    EstPresent = ele1.IsPresent
    End Function
    Private Function EstPlusPresent(ele1 As WebElement)
    EstPlusPresent = Not ele1.IsPresent
    End Function
    Private Function EstInVisible(ele1 As WebElement)
    EstInVisible = Not ele1.IsDisplayed
    End Function
    Private Function EstVisible(ele1 As WebElement)
    EstVisible = ele1.IsDisplayed
    End Function
    voici le résultat obtenu :
    Avant : No Selected Dates to display.
    wait fin loader
    wait fin loader
    wait fin loader
    wait fin loader
    wait fin loader
    wait fin loader
    wait fin loader
    wait fin loader
    wait fin loader
    wait fin loader
    wait fin loader
    temps écoulé : 1,1
    Après : Tuesday, August 02, 2016
    Comme on peut le constater le while Wait.Not du "loader" n'est pas une boucle infernale et contient une tempo de 100ms.
    Cela fonctionne aussi avec Firefox (attention voir ici)

    Ami calmant, J.P

  6. #6
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 241
    Par défaut
    hello,
    avec selenium on peut aussi attendre la fin d'activités Ajax jquery comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ' on attend la fin d'activité Ajax
      While Waiter.Not(AttenteFinAjax(driver), 5000): DoEvents:  Debug.Print "wait fin ajax": Wend
    avec AttenteFinAjax :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Function AttenteFinAjax(driver As WebDriver)
    AttenteFinAjax = driver.ExecuteScript("return jQuery.active == 0")
    End Function
    Attention cela ne fonctionne pas dans mon exemple précédent (pas jquery)

    Ami calmant, J.P

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/08/2010, 23h07
  2. Edition des Form des Formulaires dans VBA
    Par GuixInDaMixx dans le forum IHM
    Réponses: 4
    Dernier message: 23/04/2008, 23h17
  3. Appeler des variables à partir d'un formulaire et VBA
    Par LeBihan dans le forum Modélisation
    Réponses: 2
    Dernier message: 19/03/2008, 20h25
  4. Réponses: 2
    Dernier message: 05/02/2007, 17h09
  5. [VBA] créer un executable des formulaires access
    Par benjapar dans le forum VBA Access
    Réponses: 4
    Dernier message: 18/12/2006, 14h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo