[Excel VBA]=LIEN_HYPERTEXTE dans un tableau dynamique

Fermé
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 - 11 déc. 2013 à 09:17
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 - 12 déc. 2013 à 16:50
Bonjour,

J'ai un soucis vis à vis d'un tableau dynamique MesScreens(). Il contient deux types de variable récupérées dans mon script :

1°) Des variables http. Du coup je les rentre dans le tableau sous forme :
"=LIEN_HYPERTEXTE(""" & Variable_HTTP & """;""Screenshot"")"

2°) Des Cellules contenant la formule suivante :
=LIEN_HYPERTEXTE("https://www.mackage.com/eu/en/craftsmanship","Screenshot")

En les inscrivant sur des cellules par Cells(x,y).FormulaLocal = Messcreens(i), cliquer sur les liens renvoient vers "Serveur ou proxy Introuvable" (normal la formule ne renvoie pas sur un endroit local mais sur une adresse Internet...)

Y a-t-il au même titre que formulalocal un format qui permet d'insérer un lien hypertexte qui renvoie sur Une page web en gardant le format =LIEN_HYPERTEXTE ?
A voir également:

5 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
11 déc. 2013 à 11:47
Salut lml,

Deux - trois petites erreurs.

Essaie ce code, tu comprendras.

Sub Essai()
Dim MonLien As String
Dim MesScreens(0) As String

MonLien = "http://www.commentcamarche.net/forum/affich-29277237-excel-vba-lien-hypertexte-dans-un-tableau-dynamique"
MesScreens(0) = "=HYPERLINK(""" & MonLien & """,""Screenshot"")"
Cells(1, 1).Formula = MesScreens(0)
End Sub

0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
11 déc. 2013 à 13:56
Re,
Ta réponse est là..
Et arrête de vouloir créer une formule à mettre dans une cellule alors qu'il est beaucoup plus simple d'y mettre directement le lien HyperText.
Si tu n'avais pas compris dans ton poste précédant il n'était pas nécessaire d'en ouvrir un nouveau, y revenir aurait été plus simple.
A+
0
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
11 déc. 2013 à 19:33
Salut,

Désolé pour le nouveau sujet, je ne savais pas qu'on pouvait revenir sur un sujet résolu, mea culpa :$

A vrai dire, je n'ai pas le choix pour la Formule car mon tableau dynamique regroupe une bonne centaine de liens hypertexte (un via une cellule hypertexte récupérée, l'autre récupérée via une expression régulière et reformatée en lien hypertexte), pour les réappliquer tous les deux sur un tableau contenant tout ce beau monde...

Très bizarrement, l'erreur disparaît si j'applique le script à un autre feuillet excel. De plus, l'expression HYPERLINK n'est pas reconnue alors que LIEN_HYPERTEXTE l'est, et seulement FormulaLocal ne fonctionne.

Je viens de finir mon script après 8 jours de codage laborieux et avec votre aide, je vous remercierai jamais assez !

En tant que contributeur, j'aurais aimé savoir si certaines parties pouvaient servir à la communauté. Est-ce que par hasard il y a une démarche particulière en terme de validation pour voir si cela peut vraiment servir ou pas ?

Il s'agit de parcourir un énorme tableau, récupérer des informations via des expressions régulières et appliquer le tout sur un Tableau sur un nouvel onglet. ça concerne du QA.

Excellente soirée :)
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
12 déc. 2013 à 07:59
Salut,

En tant que contributeur, j'aurais aimé savoir si certaines parties pouvaient servir à la communauté. Est-ce que par hasard il y a une démarche particulière en terme de validation pour voir si cela peut vraiment servir ou pas ?

Il n'y a pas de démarche particulière pour valider ce qui peut servir ou pas. Ce que je penses à titre personnel : tout peut un jour resservir...

Notamment, tu parles de récupération d'informations sur une feuille (énorme) via des expressions régulières. Ce genre de code ne fait pas légion sur le Net. Places nous ici quelques exemples, nous feront le tri ensemble et peut être pourront ajouter un grain de sel en sus. De cela, tu pourras, éventuellement, disposer de suffisamment de ressources pour poster une astuce.

Cordialement,
Franck
0
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
Modifié par lml-mike le 12/12/2013 à 13:59
Sachez juste que je ne suis pas un codeur à la base, donc patapé ! ^_^

Le tableau contient des bugs répertoriés par mobile. Ces bugs sont au format "OK BUT" (mineur) ou "NOK" (majeur).
Ces bugs sont présent sur une cellule "Commentaire" au format suivant :

> Bug 1
> Bug 2 (Détail du bug 2)
> Bug 3 (http://www.screenshot_associé.com)
> Bug 4

Une cellule "Screenshot" est en bas de ce commentaire et sert de référence pour le Bug 1, 2, 4 mais pas pour le bug 3, qui utilisera plutôt le screen entre parenthèses.

Tous ces bugs seront répertoriés dans un tableau qui va trier les doublons, en incrémentant les différents mobiles sur une même ligne dont le bug est strictement identique. Il y a donc une expression régulière imbriquée, puisqu'on cherche dans un premier temps chaque bug en excluant "> " (sauf s'il n'y a qu'un bug par cellule dans ce cas le chevron ne sera pas utilisé), dans un deuxième temps en extrayant le screenshot entre parenthèse s'il est présent et en le remplaçant par le screenshot de référence.

Voici la partie du code qui traite de l'expression régulière imbriquée (Je n'ai pas mis les déclarations ni les valeurs assignées par défaut, et il manque l'inscription sur le tableau dans un autre onglet) :

Do While ID_test <> "FIN"                                                                                                           'Boucle "TANT QUE" la ligne ne contient pas "FIN". "FIN" est nécessaire car les cellules fusionnées n'ont pour valeur que celle de la cellule la plus en haut à gauche
    If ID_test <> "" Then                                                                                                           'Permet d'éviter les doublons dans les cellules fusionnées
        Do While Device <> ""                                                                                                       'Boucle "TANT QUE" la colonne n'est pas vide
            If Resultat = "OK BUT" Or Resultat = "NOK" Then                                                                         'Récupération des résultats qui présentent un problème
                Probleme = True                                                                                                     'Booléen de contrôle pour l'écriture dans le tableau
                
                Set myRegExp = New RegExp                                                                                           'Création du Ragexp
                myRegExp.IgnoreCase = True                                                                                          'L'expression régulière ignore la casse
                myRegExp.Global = True                                                                                              'Définit la recherche sur toutes les occurences et pas seulement sur la première (Les occurences sont séparées par le retour à la ligne)
                myRegExp.Pattern = "(> )|(.*)"                                                                                      '(> ) recherche toutes les lignes commençant comme "> " pour les isoler (et les ignorer par la suite)
                                                                                                                                    ' | correspond au séparateur "OU". Il sépare les commentaires commençant par "> " des commentaires uniques qui n'en possèdent pas
                                                                                                                                    '(.*) recherche tout ce qu'il y a après la première occurence
                                                                                                                                    
                Set myMatches = myRegExp.Execute(Sheets("tests").Cells(ligne_ID_test, col_Resultat + 1).Value)                      'Execute le ragexp sur la cellule "Commentaire" ciblée
                For Each myMatch In myMatches                                                                                       'Boucle "TANT QUE" par occurence trouvée dans les commentaires
                    For i = 0 To myMatch.SubMatches.Count - 1                                                                       'fonction "POUR" par sous-occurence de l'occurence (par ligne donc, la première sous-occurence étant (> ), la deuxième (.*) ). On enlève 1 car on veut boucler sur les sous-occurences en commençant la boucle à 0. Comme nous commençons à 0 et qu'il nous faut 2 "tours" de boucle, et que SubMatches.Count = 1, il faut lui enlever 1
                        If myMatch.SubMatches(i) <> "> " And myMatch.SubMatches(i) <> "" Then                                       'Fonction "SI" qui ignore la première sous-occurence (> )
                            If InStr(1, myMatch.SubMatches(i), "http") <> 0 Then                                                    'Vérifie si le commentaire contient un lien http. Dans ce cas, il l'extraira dans un deuxième Ragexp et le lien récupéré remplacera le screenshot d'origine. Sinon, il récupèrera les infos du bug avec le screen fourni
                                
                                Set myRegExp2 = New RegExp                                                                          'Création d'une deuxième expression régulière Ragexp
                                myRegExp2.IgnoreCase = True                                                                         'L'expression régulière ignore la casse
                                myRegExp2.Global = True                                                                             'Définit la recherche sur toutes les occurences et pas seulement sur la première (Les occurences sont séparées par le retour à la ligne)
                                myRegExp2.Pattern = "(.*)\((.*)\)"                                                                  'La première sous-occurence contient l'intégralité du texte placé avant la deuxième sous-occurence
                                                                                                                                    'La deuxième sous-occurence contient tout ce qui est contenu entre parenthèses (ou entre les dernières parenthèses de la ligne) tout en excluant celles-ci
                                Set myMatches2 = myRegExp2.Execute(myMatch.SubMatches(i))                                           'Création de la deuxième expression régulière, imbriquée dans le résultat de la première contenant le lien http
                                
                                For Each myMatch2 In myMatches2                                                                     'Boucle "TANT QUE" par occurence trouvée dans le commentaire (il n'y a qu'une seule occurence ici (le commentaire contenant le http), mais c'est nécessaire pour travailler sur les sous-occurences
                                    ReDim Preserve mesComments(Indtab)                                                              'Redimentionnement du tableau contenant tous les bugs individuellement
                                    ReDim Preserve mesScreens(Indtab)                                                               'Redimentionnement du tableau contenant tous les screenshots liés à leur bug
                                    mesComments(Indtab) = myMatch2.SubMatches(0)                                                    'Récupération du bug individuel
                                    mesScreens(Indtab) = "=LIEN_HYPERTEXTE(""" & myMatch2.SubMatches(1) & """;""Screenshot"")"      'Récupération du screenshot associé pré-formaté. Pour inscrire un guillemet dans une variable en VBA, on la double
                                Next
                            
                            Else                                                                                                    'Si le commentaire n'a pas de lien HTTP, on récupère le bug et toutes ses infos dans leurs tableau respectifs
                                ReDim Preserve mesComments(Indtab)                                                                  'Redimentionnement du tableau contenant tous les bugs individuellement
                                ReDim Preserve mesScreens(Indtab)                                                                   'Redimentionnement du tableau contenant tous les screenshots liés à leur bug
                                mesComments(Indtab) = myMatch.SubMatches(i)                                                         'Récupération du bug individuel
                                mesScreens(Indtab) = Sheets("Tests").Cells(ligne_ID_test + 1, col_Resultat + 1).FormulaLocal        'Récupération du Screenshot présent en dessous du commentaire sur le plan de test. Le suffixe FormulaLocal permet de récupérer la formule et non juste "Screenshot".
                            End If
                            ReDim Preserve mesID_Test(Indtab)                                                                       'Redimentionnement du tableau contenant les ID de test (3.1.1, 3.2.2 etc.)
                            ReDim Preserve mesResultats(Indtab)                                                                     'Redimentionnement du tableau contenant les résultats des commentaires (OK, OK BUT etc.)
                            ReDim Preserve mesDevices(Indtab)                                                                       'Redimentionnement du tableau contenant tous les devices associés à leur bug
                            ReDim Preserve mesVersionsOS(Indtab)                                                                    'Redimentionnement du tableau contenant tous les
                            mesID_Test(Indtab) = ID_test                                                                            'Récupération de l'ID du test correspondant au bug
                            mesResultats(Indtab) = Resultat                                                                         'Récupération du résultat correspondant au bug
                            mesDevices(Indtab) = Device                                                                             'Récupération du device lié au bug
                            mesVersionsOS(Indtab) = VersionOS                                                                       'Récupération de la version de l'OS
                            Indtab = Indtab + 1                                                                                     'Incrémentation de la ligne du tableau
                        End If
                    Next i
                Next myMatch
            End If
            If Sheets("Tests").Cells(ligne_Device, col_Device + 2).Value <> "" Then                                                 'Si la colonne n'est pas vide, on passe à la colonne suivante
            col_Device = col_Device + 2                                                                                             'Passage de la colonne du mobile au suivant
            col_Resultat = col_Resultat + 2                                                                                         'Passage de la colonne de Test à Retest, ou inversement
            Else
            col_Device = col_Device + 4                                                                                             'Sinon, on passe directement au mobile suivant
            col_Resultat = col_Resultat + 4
            End If
            Device = Sheets("Tests").Cells(ligne_Device, col_Device)                                                                'Récupération du nouveau mobile
            VersionOS = Sheets("Tests").Cells(ligne_VersionOS, col_Device)                                                          'Récupération de la version de l'OS du nouveau mobile
            Resultat = Sheets("Tests").Cells(ligne_ID_test, col_Resultat)                                                           'Récupération du résultat (OK, OK BUT, NOK etc.)
        Loop
    End If
    ligne_ID_test = ligne_ID_test + 1                                                                                               'Passage au cas de test suivant
    ID_test = Sheets("Tests").Cells(ligne_ID_test, col_ID_test)                                                                     'Récupération de l'ID du test
    col_Device = col_1er_Device                                                                                                                  'On repasse à la colonne du tout premier Device
    col_Resultat = col_1er_Resultat                                                                                                                'On repasse à la colonne du tout premier Résultat
    Device = Sheets("Tests").Cells(ligne_Device, col_Device)                                                                        'Récupération du mobile
    VersionOS = Sheets("Tests").Cells(ligne_VersionOS, col_Device)                                                                  'Récupération de la version de l'OS du mobile
    Resultat = Sheets("Tests").Cells(ligne_ID_test, col_Resultat)                                                                   'Récupération du résultat (OK, OK BUT, NOK etc.)
Loop


Je suis disponible pour balancer une autre partie de code, mon code entier, le fichier excel, mais pas plus, faut pas déconner non plus xP
0

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

Posez votre question
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
12 déc. 2013 à 15:47
Re,
Je ne sais pas ce qu'en pensera Pijaku mais en ce qui me concerne je pense que ton code est trop spécifique à ton application, le but d'un exemple étant d'être transposable à d'autre applications.
Cela dis sans dénigrer la validité de ta prestation et peut-être qu'avec l'insertion de lignes de commentaires il pourrait être utile à quelque un.
Cdlt.
A+
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
12 déc. 2013 à 15:56
Salut Lermite222,
En effet, le code au complet semble difficilement transposable.
Cependant, des détails comme
Set myRegExp = New RegExp 
myRegExp.IgnoreCase = True
myRegExp.Global = True
myRegExp.Pattern = "(> )|(.*)" 

avec leurs commentaires peuvent servir...

Concernant les commentaires, ils y sont. Cependant, avec les nouvelles balises <code>, elles se retrouvent sur la droite, avec l'ascenseur horizontal...
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
12 déc. 2013 à 16:04
Bonjour Pijaku, effectivement je n'avais pas capté les commentaires.
Et je dois dire que j'ai rarement vu un code aussi bien documenté.(Bravo)
A+
0
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
Modifié par lml-mike le 12/12/2013 à 16:51
L'exemple que tu donnes Pijaku est le SEUL exemple du code que j'ai transposé depuis un tuto, soit celui de caféine sur les expressions régulières en vba ^_^' J'avais juste adapté l'expression sur mes besoins !

Sinon je ne cherche pas particulièrement à le placer sur CCM, si vous dites qu'il est trop spécifique pour être utilisé comme exemple c'est pas grave hein !
...Après tout, ma contribution sur CCM concernait à l'époque un script de commandes Cisco publipostées en Telnet et SSH développé en Shell avec Expect (oui, je sais xD)

EDIT : Merci lermite22 ^_^
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
12 déc. 2013 à 16:26
J'avais juste adapté l'expression sur mes besoins !
Et c'est ce qui est intéressant.
En fait, il ne faut pas beaucoup plus pour faire une astuce...
1- présentation de ce qu'est une regexp
2- quelques exemples commentés
et voilà.

Après, je n'ai pas eu le temps de regarder davantage dans ton code.... Je ferais ça à tête reposée.
0
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
Modifié par lml-mike le 12/12/2013 à 16:52
Je vais t'épargner la lecture, encore une fois n'étant pas codeur de métier tu risques d'hurler en voyant le nombre de boucles que j'ai utilisé ^_^

Pour l'expression régulière, tu as UNE cellule avec :

> Bug 1
> Bug 2 (Détail du bug 2)
> Bug 3 (http://www.screenshot_associé.com)
> Bug 4

La première expression régulière renvoie dans un tableau dynamique :

---- La liste des bugs :

Mescomments(0) = Bug 1
Mescomments(1) = Bug 2 (Détail du bug 2)
Mescomments(2) = Bug 3 (http://www.screenshot_associé.com)
Mescomments(3) = Bug 4

(tu remarques que "> " saute)
Puis une deuxième expression régulière check la présence de la chaine "http" sur tous les résultats de la première expression régulière et renvoie :

Mescomments(2) = Bug 3

----- La liste des screenshots associés au bug

Chaque bug a un Screen_Par_Défaut présent juste en dessous de la cellule ou il y a cette liste, au format =LIEN_HYPERTEXTE (le fameux !)

MesScreens(0) = Cells(Screen_Par_Defaut).formulalocal
MesScreens(1) = Cells(Screen_Par_Defaut).formulalocal
MesScreens(2) = "=LIEN_HYPERTEXTE(""" & http://www.screenshot_associé.com & """;""Screenshot"")
MesScreens(3) = Cells(Screen_Par_Defaut).formulalocal

Bon j'ai fini d'expliquer. Je confirme, tu peux lire ça à tête reposée xD
0