[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
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
A voir également:
- [Excel VBA]=LIEN_HYPERTEXTE dans un tableau dynamique
- Tableau croisé dynamique - Guide
- Trier un tableau excel - Guide
- Tableau word - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
- Tableau ascii - Guide
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 757
11 déc. 2013 à 11:47
11 déc. 2013 à 11:47
Salut lml,
Deux - trois petites erreurs.
Essaie ce code, tu comprendras.
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
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 191
11 déc. 2013 à 13:56
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+
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+
lml-mike
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
121
11 déc. 2013 à 19:33
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 :)
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 :)
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 757
12 déc. 2013 à 07:59
12 déc. 2013 à 07:59
Salut,
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
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
lml-mike
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
121
Modifié par lml-mike le 12/12/2013 à 13:59
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) :
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 191
12 déc. 2013 à 15:47
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+
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+
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 757
12 déc. 2013 à 15:56
12 déc. 2013 à 15:56
Salut Lermite222,
En effet, le code au complet semble difficilement transposable.
Cependant, des détails comme
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...
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...
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 191
12 déc. 2013 à 16:04
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+
Et je dois dire que j'ai rarement vu un code aussi bien documenté.(Bravo)
A+
lml-mike
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
121
Modifié par lml-mike le 12/12/2013 à 16:51
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 ^_^
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 ^_^
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 757
12 déc. 2013 à 16:26
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.
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.
lml-mike
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
121
Modifié par lml-mike le 12/12/2013 à 16:52
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
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