VBA excel copier cellule avec lien hypertexte

Résolu/Fermé
grandjean - 24 sept. 2011 à 10:32
 grandjean - 25 sept. 2011 à 15:57
Bonjour à tous,

Je travaille sur une base client. Dans les données clients, j'ai bien sûr le site internet.
J'arrive à générer le lien hypertexte vers le site du client, mais la routine place le résultat non pas dans ma base client (B_Client), mais dans l'onglet gérant la numérotation (Num_An), à la cellule C4.
J'ai essayé avec Anchor = sheets("B_Client").range("P" & lig), sans succès
Je suppose que la cellule active est toujours la C4 de Num_An.

Si quelqu'un pouvait m'aider... j'ai fouillé un peu partout sur le net, sans succès jusqu'à présent.

Voici le début de ma macro, pour plus de précision (je suis sous excel 2003)

Sub Creation_Client()

'création du numéro client
Dim NumClient As Integer
Worksheets("Num_An").Select
Range("C4").Select
NumClient = Worksheets("Num_An").Range("C4").Value
NumClient = NumClient + 1
Worksheets("Num_An").Range("C4").Value = NumClient

'identifier une ligne libre et copier les données (C_Client = formulaire de saisie & B_Client = Base de données)
Dim lig As Integer

With Sheets("B_Client")
lig = .Columns("A").Find("", .Range("A3"), xlValues).Row
.Cells(lig, "A").Resize(1, 27) = Application.Transpose(Sheets("C_Client").Range("C2:C28").Value)
.Range("A3:AA" & lig).Sort .Range("A3")

'création du lien hypertexte du site internet

Sheets("C_Client").Range("C17").Copy
site = Sheets("C_Client").Range("C17")
Selection = .Range("P" & lig)
Sheets("B_Client").Hyperlinks.Add anchor:=Selection, Address:="http://" & site

End With

A voir également:

6 réponses

eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
24 sept. 2011 à 11:56
Bonjour,

Selection est un mot clé de vba, tu n'as pas le droit de l'utiliser en nom de variable.
Et tu peux alléger ton code, tu as des .select et .copy inutiles

eric
0
Merci Eric d'avoir regardé mon sujet, mais j'avoue que ta réponse ne m'aide pas beaucoup... Je me doute bien qu'il y a un truc qui cloche... mais j'aimerais savoir comment écrire mon instruction.
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
Modifié par eriiic le 24/09/2011 à 12:58
remplace Selection par Sel
Pour le reste avec un fichier joint (allégé et anonymisé) pour ne pas à avoir à tout refaire on pourra modifier ton code.
cijoint.fr et coller ici le lien fourni
eric
0
J'ai essayé de remplacer par Sel, comme tu me le suggères. Sans succès. J'avais essayé aussi avec Anchor.

Mon fichier épuré est disponible sur :
http://www.cijoint.fr/cjlink.php?file=cj201109/cijY07VilL.xls

J'explique le fonctionnement en page d'accueil.
Je te remercie par avance pour ton aide. Va quand même profiter du soleil de cette belle journée.

Jean
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
24 sept. 2011 à 15:35
re,

ton code corrigé :
Sub Creation_Client()

'création du numéro client
    Dim NumClient As Integer
    NumClient = [Num_An!C4] + 1
    [Num_An!C4] = NumClient

    'identifier une ligne libre et copier les données (C_Client = formulaire de saisie & B_Client = Base de données)
    Dim lig As Integer
    With Sheets("B_Client")
        lig = .Columns("A").Find("", .Range("A3"), xlValues).Row
        .Cells(lig, "A").Resize(1, 27) = Application.Transpose(Sheets("C_Client").Range("C2:C28").Value)
        .Range("A3:AA" & lig).Sort .Range("A3")
        'création du lien hypertexte du site internet
        Sheets("B_Client").Hyperlinks.Add anchor:=.Range("P" & lig), Address:="http://" & [C_Client!C17]

    End With

    'trier les articles par ordre croissant
    Range("A3:AA3").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Sort Key1:=Range("A3"), Order1:=xlAscending, Header:=xlNo, _
                   OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

    'rendre vierge le formulaire
    With Sheets("C_Client")
        .Range("c2").ClearContents
        .Range("c5:c10").ClearContents
        .Range("c13").Value = "FRANCE"
        .Range("C23").Value = "FRANCE"
    End With

    'revenir sur la feuille Base Clients
    Sheets("B_Client").Activate
    Range("A2").Select

End Sub

J'ai fait le lien hypertexte et modifié aussi un peu les 1ères lignes (5 lignes alors que 2 suffisent).
Quand tu es dans un With Sheets("B_Client"), il faut remplacer le nom de la feuille par un . : anchor:=.Range(...

eric
0
Merci beaucoup, Eric, car ta solution fonctionne parfaitement. C'est beau de savoir !
J'ai par contre un souci avec le tri.

J'ai effacé tous les enregistrements de ma base pour repartir à 0.
Lorsque j'entre le 1er client, les infos vont bien sur la première ligne, sauf le site internet qui s'affiche sur la seconde ligne
Lorsque j'entre le 2d client, cela revient dans l'ordre.
Par contre, après j'ai créé un client qui s'insère entre les deux premiers, et là, il colle bien le site internet mais sans le lien.
Est-ce que le fait que je commence en ligne 3 et non en ligne 2 peut provoquer une erreur ?
Sinon, ma méthode de tri n'est peut être pas la bonne.
Comme tu as pu le remarquer, je débute sur VBA, que je trouve super. J'ai trouvé quelques tutoriels sympa mais on a vite les yeux plus gros que le ventre !
0

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

Posez votre question
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
24 sept. 2011 à 20:25
Re,

Déjà je ne ferais pas .find pour la première ligne libre mais :
lig= .[A65536].end(xlup).row+1
(c'est l'équivalent de ctrl+fleche haut, en partant du bas, qui t'amène sur le dernière ligne remplie. +1 pour la suivante. C'est juste une question de vitesse, mais c'est bien que tu aies vu le .find, ça te resservira ;-) ))

Ensuite tu dois tout coller : données et lien.
Seulement après tu peux trier (tu as un .sort qui se balade au milieu, lig ne pointe plus sur la bonne ligne...)

eric
0
Merci pour ton aide, Eric. J'ai un peu galéré pour trouver l'origine du problème. Effectivement, le sort était en trop.
Tout fonctionne bien à présent.
Je peux attaquer les phases suivantes !
Jean
0