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

IHM Discussion :

Dossier par défaut des liens hypertexte [AC-2013]


Sujet :

IHM

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 421
    Points : 132
    Points
    132
    Par défaut Dossier par défaut des liens hypertexte
    Bonjour,

    Malgré mes recherches je n'ai pas trouvé de sujet traitant la question, ou de manière suffisamment claire pour moi.

    Pour un champ hypertexte dans un formulaire, je voudrais savoir comment modifier le dossier par défaut, afin d'éviter de parcourir à chaque fois la multitude de dossiers à explorer pour aller chercher le fichier, car les fichiers concernés seront toujours dans le même dossier.

    Je souhaite éviter le remplissage du champ avec une valeur par defaut vers le dossier voulu.

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Bonjour,

    hypertexte
    Peux-tu donner un exemple concret de ce que tu veux faire ?

    Dans ton formulaire, tu veux ouvrir un fichier. Tous les fichiers se trouvent dans un même répertoire et tu voudrais que ce répertoire soit désigné par défaut.
    C'est ça ?

    Si oui, montre le code actuel.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 421
    Points : 132
    Points
    132
    Par défaut
    C'est exactement ça. Mon petit projet tournera sous runtime, et comme le clic droit est désactivé, j'ai mis ce code sur un bouton pour accéder au menu d'insertion d'un lien hypertexte

    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
    Private Sub btnLien_DblClick(Cancel As Integer)
    On Error GoTo err_btnLien_DblClick
     
        Me.[lienCV].SetFocus
        DoCmd.RunCommand acCmdInsertHyperlink
        Exit Sub
     
    Exit_btnLien_DblClick:
    Exit Sub
     
    err_btnLien_DblClick:
        Select Case Err.Number
            Case 2501
                Resume Exit_btnLien_DblClick
            Case Else
                MsgBox Err.Description & Chr(13) & Err.Number
                Resume Exit_btnLien_DblClick
        End Select
     
    End Sub
    Par défaut, le menu s'ouvre sur l'emplacement de la base de données, je voudrais pouvoir en forcer un autre.

  4. #4
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Donne un exemple de ce que contient LienCV quand tu cliques le bouton et donne le chemin que tu voudais imposer.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 421
    Points : 132
    Points
    132
    Par défaut
    LienCV contiendra essentiellement des documents words comme des CV ou des lettres de motivations, le clic sur le bouton ouvre le menu d'insertion du lien hypertexte comme avec un clic droit sur Access en version complète, 'lien hypertexte', 'modifier le lien hypertexte' et ensuite dans 'regarder dans' j'ai le repertoire par defaut de la base mais je voudrais avoir à la place par défaut

    F:\Stages\CVs\

  6. #6
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Alors, simplement ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub btnLien_DblClick(Cancel As Integer)
      Shell "C:\WINDOWS\EXPLORER.EXE " & "f:\stages\cvs\" & Me.LienCV, vbNormalFocus
    End Sub
    qui te donnera le même résultat qu'un double-clic sur le fichier dont le nom apparaît dans LienCv.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 421
    Points : 132
    Points
    132
    Par défaut
    Ceci ouvre l'explorateur windows avec le dossier demandé mais et après ?

  8. #8
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Je n'ai sans doute pas compris ce que tu veux faire. Désolé.

    Je passe la main.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 421
    Points : 132
    Points
    132
    Par défaut
    Ne t'excuse pas, tu m'aides donc deja je te remercie, je me suis peut-etre aussi mal exprimé, sur le screenshot ci-dessous je voudrais que le chemin actif soit par defaut F:\Stages\CVs\ au lieu de D:
    Images attachées Images attachées  

  10. #10
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    J'ai l'impression qu'on ne pas changer le point de départ de la navigation.
    C'est toujours le dossier de la bdd.

    Si on veut créer un lien vers un fichier, on peut utiliser une méthode alternative consistant à sélectionner un fichier à partir de la boîte de dialogue "Ouvrir un fichier...".
    Ensuite on crée le lien en insérant #chemin_complet# dans le champ hypertexte.
    Exemple de 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
    Dim fDlg As Object, sFile As String
    Dim sFileOnly As String, l1 As Long
     
    ' *** Ouvrir une boîte de dialogue "Sélectionner un fichier"
    Set fDlg = Application.FileDialog(1) '1=msoFileDialogOpen
    ' Mode vue liste
    fDlg.InitialView = 1 '1=msoFileDialogViewList
    ' Titre
    fDlg.Title = "Choisir un fichier..."
    ' Dossier initial
    fDlg.InitialFileName = "E:\Temp\"
    ' Filtres
    fDlg.Filters.Clear
    fDlg.Filters.Add "Documents", "*.doc*;*.pdf"
    fDlg.Filters.Add "Tous", "*.*"
    ' Sélection Multiple
    fDlg.AllowMultiSelect = False
    ' Afficher la boîte de dialogue
    If fDlg.Show Then
       sFile = fDlg.SelectedItems(1)
    End If
    Set fDlg = Nothing
     
    ' *** Si un fichier a été choisi
    If sFile <> "" Then
       l1 = InStrRev(sFile, "\")
       If l1 > 1 Then sFileOnly = Mid(sFile, l1 + 1)
       Me.LienHyperTexte = sFileOnly & "#" & sFile & "#"
    End If
    La navigation commence toujours à partir de "E:\Temp\".
    Le lien est créé sous la forme NomFichier.ext#Chemin\NomFichier.ext#
    NomFichier.ext est ce qui est affiché
    Chemin\NomFichier.ext est le chemin complet vers le fichier

    Remarque: Dans NomFichier.ext#Chemin\NomFichier.ext# , NomFichier.ext est facultatif.
    On peut insérer directement #Chemin\NomFichier.ext# et c'est alors Chemin\NomFichier.ext qui sera affiché.

    A+

  11. #11
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Bonjour tout le monde,

    Je ne sais pas si c'est ce que cherche rag83, mais dans la FAQ, il y a ce code que j'ai utilisé suite à des besoins particuliers, peut-être que ça l'aidera (Il permet de définir un répertoire de départ par défaut).

    Cordialement,
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  12. #12
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 421
    Points : 132
    Points
    132
    Par défaut
    Merci LedZeppII, c'est bien ce que je voulais, l'utilisation du menu normal des liens hypertexte aurait été plus pratique mais c'est aussi très bien comme ça, en fait la seule chose qui est dommage c'est qu'avec le menu par défaut il y a un bouton pour supprimer le lien, la je vais devoir imiter cette fonction, je dois pouvoir mettre un vbNullString si le lien est déja rempli non ?

    Merci aussi à madefemere pour son aide et les liens utiles du dernier message

  13. #13
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Re,

    Si ça fonctionne sous Access 2013, tu peux créer (vba) un menu contextuel et l'affecter au contrôle lié au champ hypertexte.
    C'est dans l'onglet «Autres» de la feuille de propriétés du contrôle.

    Exemple de création de menu contextuel:
    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
    37
    38
    39
    40
    41
    42
    43
    Sub CreerMenuCtxl_mnCtxlHyperlink()
    Dim cmdBar As Object        'Office.CommandBar
    Dim cmdPopup As Object      'Office.CommandBarPopup
    Dim ctlButton As Object, ctlTmpBtn As Object 'Office.CommandBarButton
    Dim sMenu As String
    Dim i As Integer
    Const msoBarPopup = 5
     
    sMenu = "mnCtxlHyperlink"
    On Error Resume Next
    Set cmdBar = Application.CommandBars(sMenu)
    On Error GoTo 0
     
    If Not (cmdBar Is Nothing) Then
       cmdBar.Delete
    End If
     
    Set cmdBar = Application.CommandBars.Add(sMenu, msoBarPopup, False, False)
    ' Bouton Copier
    Application.CommandBars("Database").FindControl(, 19).Copy cmdBar
    ' Bouton Couper
    Application.CommandBars("Database").FindControl(, 21).Copy cmdBar
    ' Bouton Coller
    Application.CommandBars("Database").FindControl(, 22).Copy cmdBar
    ' Bouton Coller spécial
    Application.CommandBars.FindControl(, 755).Copy cmdBar
     
    ' Bouton supprimer hypertexte personnalisé, pour être visible en runtime
    Set ctlButton = cmdBar.Controls.Add(msoControlButton, , , , False)
    ctlButton.Caption = "Supprimer lien hypertexte"
    ctlButton.Style = msoButtonIconAndCaption
    ctlButton.OnAction = "=fnMyDeleteHyperlink()"
    Set cmdPopup = Application.CommandBars("Form DataSheet Cell").FindControl(, 30094)
    For i = 1 To cmdPopup.Controls.Count
        If cmdPopup.Controls(i).ID = 3626 Then
           Set ctlTmpBtn = cmdPopup.Controls(i)
           ctlTmpBtn.CopyFace
           ctlButton.PasteFace
        End If
    Next
     
    cmdBar.Enabled = True
    End Sub
    Code de la fonction fnMyDeleteHyperlink() appelé par le bouton "Supprimer lien hypertexte":
    (doit être publique et dans un module de code)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Function fnMyDeleteHyperlink()
    On Error GoTo ErrH
    Application.RunCommand acCmdClearHyperlink
    Exit Function
    ErrH:
    Select Case Err.Number
        Case 2501 ' L'action RunCommand a été annulée (clic sur Annuler)
        Case Else
            MsgBox "Erreur exécution No." & Err.Number & " : " & Err.Description
    End Select
    End Function
    La sub CreerMenuCtxl_mnCtxlHyperlink() n'est à exécuter qu'une seule fois, pour créer (ou recréer) le menu contextuel dans la bdd.
    Une fois exécuté, le menu "mnCtxlHyperlink" sera disponible dans la liste déroulante en face de la propriété «Barre de menu contextuel», dans l'onglet «Autres» de la feuille des propriétés du contrôle.


    On peut même déporter le premier code que j'ai posté, dans une fonction publique de manière à pouvoir le faire appeler par un bouton de menu contextuel.
    Voici le code déplacé (et adapté) dans une fonction publique nommée fnMyEditHyperlinkFile():
    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
    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
    Public Function fnMyEditHyperlinkFile()
    Dim fDlg As Object, sFile As String, oCtl As Access.Control
    Dim sCurrFullPath As String, sCurrPath As String, sCurrFile As String
    Dim sFileOnly As String, l1 As Long
     
    ' *** Référencer le contrôle actif (celui qui a le focus)
    On Error GoTo ErrIgnore
    Set oCtl = Screen.ActiveControl
    ' Si pas de contrôle actif, sortir
    On Error GoTo ErrH
    If oCtl Is Nothing Then GoTo ExitP
     
    ' *** Y a-t-il un chemin à récupérer ?
    sCurrFullPath = oCtl.Hyperlink.Address
    If Len(sCurrFullPath) > 4 Then
       l1 = InStrRev(sCurrFullPath, "\")
       If l1 > 2 Then
          sCurrPath = Left(sCurrFullPath, l1)
          If (l1 < Len(sCurrFullPath)) Then sCurrFile = Mid(sCurrFullPath, l1 + 1)
       End If
    End If
     
    ' *** Ouvrir une boîte de dialogue "Sélectionner un fichier"
    Set fDlg = Application.FileDialog(1) '1=msoFileDialogOpen
    ' Mode vue liste
    fDlg.InitialView = 1 '1=msoFileDialogViewList
    ' Titre
    fDlg.Title = "Choisir un fichier..."
    ' Dossier initial
    If Len(sCurrPath) > 0 Then
       fDlg.InitialFileName = sCurrPath
    Else
       fDlg.InitialFileName = "E:\Temp\"
    End If
    ' Filtres
    fDlg.Filters.Clear
    fDlg.Filters.Add "Documents", "*.doc*;*.pdf"
    fDlg.Filters.Add "Tous", "*.*"
    ' Sélection Multiple
    fDlg.AllowMultiSelect = False
    ' Afficher la boîte de dialogue
    If fDlg.Show Then
       sFile = fDlg.SelectedItems(1)
    End If
    Set fDlg = Nothing
     
    ' *** Si un fichier a été choisi
    If sFile <> "" Then
       l1 = InStrRev(sFile, "\")
       If l1 > 1 Then sFileOnly = Mid(sFile, l1 + 1)
       oCtl.Value = sFileOnly & "#" & sFile & "#"
    End If
     
    ExitP:
        Exit Function
     
    ErrH:
        MsgBox "Erreur exécution No." & Err.Number & " : " & Err.Description
        Resume ExitP
     
    ErrIgnore:
        Resume Next
    End Function
    Pur l'ajouter au menu contextuel, insérer cette séquence dans la sub CreerMenuCtxl_mnCtxlHyperlink():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ' Bouton Lien hypertexte personnalisé, pour lier des fichiers
    Set ctlButton = cmdBar.Controls.Add(msoControlButton, , , , False)
    ctlButton.Caption = "Lien hypertexte fichier..."
    ctlButton.BeginGroup = True
    ctlButton.Style = msoButtonIconAndCaption
    ctlButton.OnAction = "=fnMyEditHyperlinkFile()"
    Set ctlTmpBtn = Application.CommandBars("Table Datasheet").FindControl(, 1576)
    ctlTmpBtn.CopyFace
    ctlButton.PasteFace
    A+

  14. #14
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 421
    Points : 132
    Points
    132
    Par défaut
    Très intéressant, je regarde ça quand j'ai un peu + de temps et te donne un retour, merci.

    Une petite question toutefois, mes connaissances en VBA étant limitées pour le moment (mais je me soigne ), je voudrais faire en sorte que si le champ du lien hypertexte n'est pas vide, une msgbox propose de le vider, j'ai donc tenté ceci
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Private Sub CV_Étiquette_DblClick(Cancel As Integer)
    On Error GoTo err_CV_Étiquette_DblClick
     
        Dim fDlg As Object, sFile As String
        Dim sFileOnly As String, l1 As Long
     
        If Me.CV.Value = "" Or IsNull(Me.CV) Then
     
            ' *** Ouvrir une boîte de dialogue "Sélectionner un fichier"
            Set fDlg = Application.FileDialog(1) '1=msoFileDialogOpen
            ' Mode vue liste
            fDlg.InitialView = 1 '1=msoFileDialogViewList
            ' Titre
            fDlg.Title = "Choisir un fichier..."
            ' Dossier initial
            fDlg.InitialFileName = "F:\Temp\"
            ' Filtres
            fDlg.Filters.Clear
            fDlg.Filters.Add "Documents", "*.doc*;*.pdf"
            fDlg.Filters.Add "Tous", "*.*"
            ' Sélection Multiple
            fDlg.AllowMultiSelect = False
            ' Afficher la boîte de dialogue
            If fDlg.Show Then
                sFile = fDlg.SelectedItems(1)
            End If
            Set fDlg = Nothing
     
            ' *** Si un fichier a été choisi
            If sFile <> "" Then
                l1 = InStrRev(sFile, "\")
                If l1 > 1 Then sFileOnly = Mid(sFile, l1 + 1)
                Me.CV = sFileOnly & "#" & sFile & "#"
            End If
     
        Else
            If MsgBox("Supprimer le lien actuel ?", vbYesNo + vbQuestion) = vbYes Then
                Me.CV = vbNullString
            End If
        End If
     
    Exit_CV_Étiquette_DblClick:
    Exit Sub
     
    err_CV_Étiquette_DblClick:
        MsgBox Err.Description & Chr(13) & Err.Number
        Resume Exit_CV_Étiquette_DblClick
     
    End Sub
    Mais je ne sais pas si je dois mettre "" ou IsNull pour tester le champ alors je mets les deux.
    Si je ne mets pas le 'Or'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Me.CV.Value = "" Or IsNull(Me.CV) Then
    cela ne fonctionne pas. Pourquoi ? A la fin si le champ est rempli il devient Null donc pourquoi si en haut je ne mets que

    ça ne marche pas ?

  15. #15
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    C'est toujours un peu particulier de gérer les Null.

    Me.CV n'est pas un champ, mais un contrôle dont la propriété Value et liée à un champ d'une table.

    Le champ d'une table est Null si ...
    - Il n'a jamais été rempli et qu'il n'a pas de valeur par défaut.
    - Si on lui affecte explicitement Null.

    Il faut traiter les deux cas (Null ou chaîne vide), car les deux peuvent se présenter, et parce que on ne peut pas comparer Null à "".
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub TestNull()
    Dim v As Variant
     
    v = Null
    Debug.Print ((v = "") Or (IsNull(v)))
     
    v = ""
    Debug.Print ((v = "") Or (IsNull(v)))
     
    v = "x"
    Debug.Print ((v = "") Or (IsNull(v)))
     
    End Sub
    renvoi respectivement
    Maintenant, si je fais l'impasse sur le test IsNull:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub TestNull()
    Dim v As Variant
     
    v = Null
    Debug.Print ((v = ""))
     
    v = ""
    Debug.Print ((v = ""))
     
    v = "x"
    Debug.Print ((v = ""))
     
    End Sub
    cela renvoi
    Lorsque v est Null, le résultat de l'expression (v = "") n'est pas une valeur booléenne, mais Null.
    Or If ... Then attend un True pour entrer dans le bloc Then.

    Une autre pratique courante pour tester si on est "" ou Null en une seule fois, c'est d'utiliser Nz.
    Au lieu d'écrire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Me.CV.Value = "" Or IsNull(Me.CV) Then
    ...on écrit...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Nz(Me.CV.Value, "")  = "" Then
    Si Me.CV.Value est Null, Nz(Me.CV.Value, "") retourne le deuxième argument, c.à.d "".
    Si Me.CV.Value n'est par Null, Nz(Me.CV.Value, "") retourne le premier argument, c.à.d Me.CV.Value .

    A+

  16. #16
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 421
    Points : 132
    Points
    132
    Par défaut
    Merci pour cette explication très instructive.

    Après quelques recherches, j'avais bien fini par mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Nz(Me.CV, "") = "" Then
    mais sans le .Value, et ça fonctionne quand même... D'ailleurs,

    fonctionne aussi.

    Quand on apprend, c'est pas évident de voir plusieurs syntaxes qui fonctionnent, du coup on ne sait plus trop laquelle est la bonne ou la meilleure...
    Heureusement qu'il y a des personnes comme toi pour dissiper le brouillard !

    Je n'arrive par contre pas à faire fonctionner ton exemple de création de menu contextuel un peu plus haut...

  17. #17
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,
    Citation Envoyé par rag83 Voir le message
    Quand on apprend, c'est pas évident de voir plusieurs syntaxes qui fonctionnent, du coup on ne sais plus trop laquelle est la bonne ou la meilleure...
    Les fonctions et les méthodes des objets ont parfois des comportement par défaut.
    Cela se traduit par des arguments, dits facultatifs.
    Dans le cas de Nz, on voit dans l'aide en ligne que le deuxième argument est facultatif.
    Avec Nz(Me.CV, ""), le deuxième argument est fourni de manière explicite (chaîne vide).
    Avec Nz(Me.CV), le deuxième argument est omis.
    -> On s'en remet entièrement à la manière dont la fonction gère le fait que le deuxième argument n'est pas fourni.
    -> On accepte le risque que la fonction ne se comporte pas de la manière attendue, sauf si cela est clairement documenté dans l'aide en ligne.
    Dans le cas de Nz, je préfère la manière explicite. Ainsi, pas de surprise désagréable.

    Nz(Me.CV.Value, "") et Nz(Me.CV, "") fonctionnent de la même manière, car pour la plupart des contrôles Access (zone texte, zone de liste, ...) le membre par défaut est Value. Là, c'est marqué dans l'aide, pas de surprise.
    Ça veut dire en clair, que lorsque tu écris en VBA Nz(Me.CV, ""), le compilateur ajoute .Value -> Nz(Me.CV.Value, "").
    Attention: Tous les objets n'ont pas forcement un membre par défaut.


    Citation Envoyé par rag83 Voir le message
    Je n'arrive par contre pas à faire fonctionner ton exemple de création de menu contextuel un peu plus haut...
    Je voulais te donner un code ne nécessitant pas de référence VB à la bibliothèque Office, mais je réalise que je n'ai pas fini le travail.
    Donc, pour aller au plus rapide, va dans l'éditeur Visual Basic.
    Depuis le menu principal fais Outils > Références... -> une boîte de dialogue apparaît.
    Fais défiler la liste jusqu'à trouver «Microsoft Office 15.0 Object Library» et coche cette référence.
    Ferme la boîte de dialogue en cliquant sur le bouton Ok et réessaie le code.

    A+

  18. #18
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 421
    Points : 132
    Points
    132
    Par défaut
    Tout fonctionne maintenant parfaitement, effectivement pour le menu contextuel c'est beaucoup mieux avec "Microsoft Office 15.0 Object Library" coché

    Je vais garder ce menu plutot que mon autre système, c'est mieux.

    Deux petites questions, que signifie

    Est ce que ça a un rapport avec le nombre d'options disponibles dans le menu contextuel (copier, coller, etc), car en fait je préfère ne garder que la commande de suppression du lien hypertexte, il faut donc supprimer les lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ' Bouton Copier
    Application.CommandBars("Database").FindControl(, 19).Copy cmdBar
    ' Bouton Couper
    Application.CommandBars("Database").FindControl(, 21).Copy cmdBar
    ' Bouton Coller
    Application.CommandBars("Database").FindControl(, 22).Copy cmdBar
    ' Bouton Coller spécial
    Application.CommandBars.FindControl(, 755).Copy cmdBar
    c'est bien ça ? Et donc est ce qu'il faut mettre msoBarPopup à 1 au lieu de 5 ?

    Et comme le menu contextuel sera activable sur le controle du lien hypertexte, peut-on empecher son activation si celui-ci est vide ? Ce n'est pas indispensable, c'est juste pour mieux "cadrer" l'utilisateur.

    Et merci encore pour toutes ces explications !

  19. #19
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    msoBarPopup est une constante de la bibliothèque "Microsoft Office 15.0 Object Library".
    Elle définit le type de menu à créer.
    La déclaration de la constante msoBarPopup (Const msoBarPopup = 5) vient de mon travail inachevé, visant à faire fonctionner mon code sans référence à "Microsoft Office 15.0 Object Library".
    Tu peux supprimer la déclaration de cette constante si la référence à "Microsoft Office 15.0 Object Library" est cochée.

    ... je préfère ne garder que la commande de suppression du lien hypertexte, il faut donc supprimer les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ' Bouton Copier
    Application.CommandBars("Database").FindControl(, 19).Copy cmdBar
    ' Bouton Couper
    Application.CommandBars("Database").FindControl(, 21).Copy cmdBar
    ' Bouton Coller
    Application.CommandBars("Database").FindControl(, 22).Copy cmdBar
    ' Bouton Coller spécial
    Application.CommandBars.FindControl(, 755).Copy cmdBar
    c'est bien ça ? Et donc est ce qu'il faut mettre msoBarPopup à 1 au lieu de 5 ?
    Oui, c'est ça.
    Et non, il ne faut surtout pas mettre msoBarPopup à 1 au lieu de 5. Soit tu laisses 5, soit tu supprimes la déclaration de la constante msoBarPopup.

    Et comme le menu contextuel sera activable sur le contrôle du lien hypertexte, peut-on empêcher son activation si celui-ci est vide ? Ce n'est pas indispensable, c'est juste pour mieux "cadrer" l'utilisateur.
    Je viens de tester et c'est moins compliqué que je ne le pensais.
    Crée une procédure événementielle pour le contrôle hypertexte (CV), pour l'événement "Sur souris appuyée"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CV_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
     
    End Sub
    Au dessus (ou au dessous, aucune importance) de cette sub événementielle, colle le code de cette procédure (UpdateMenumnCtxlHyperlink):
    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
    Sub UpdateMenumnCtxlHyperlink()
    Dim sMenu As String
    Dim cmdMenuBar As Office.CommandBar
    Dim cmdCmdBarCtl As Office.CommandBarControl
     
    sMenu = "mnCtxlHyperlink"
     
    On Error GoTo ErrMenuExistePas
    Set cmdMenuBar = Application.CommandBars(sMenu)
     
    On Error GoTo ErrH
    For Each cmdCmdBarCtl In cmdMenuBar.Controls
        If cmdCmdBarCtl.Caption = "Supprimer lien hypertexte" Then
           If Nz(Me.CV.Text, "") = "" Then
              cmdCmdBarCtl.Enabled = False
           Else
              cmdCmdBarCtl.Enabled = True
           End If
        End If
    Next
     
    ExitP:
        Exit Sub
     
    ErrMenuExistePas:
        Resume ExitP
     
    ErrH:
        MsgBox "Erreur No." & Err.Number & " : " & Err.Description, vbExclamation, "Erreur"
        Resume ExitP
    End Sub
    Ensuite, fais appeler cette procédure UpdateMenumnCtxlHyperlink, par la procédure événementielle NomDuControle_MouseDown:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CV_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    UpdateMenumnCtxlHyperlink
    End Sub
    A partir de maintenant, chaque clic au niveau du contrôle du lien hypertexte va générer un appel à la procédure UpdateMenumnCtxlHyperlink, laquelle va activer ou griser l'élément de menu dont le texte (Caption) est "Supprimer lien hypertexte", en fonction du texte contenu dans le contrôle du lien hypertexte.

    A+

  20. #20
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 421
    Points : 132
    Points
    132
    Par défaut
    Voila tout fonctionne parfaitement, le menu grisé si le controle est vide est un petit plus bien pratique pour la cohérence de l'ensemble.

    Un grand merci pour ton aide LedZeppII

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. associer des liens hypertexte par macro
    Par bobafric dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/06/2013, 10h01
  2. [OL-2003] Dossier par défaut des liens hypertext
    Par Adri687 dans le forum Outlook
    Réponses: 0
    Dernier message: 17/02/2011, 11h59
  3. Changer le dossier par défaut des Helpers
    Par oOXimOo dans le forum Zend Framework
    Réponses: 6
    Dernier message: 23/09/2010, 17h22
  4. partage des dossiers par défaut nécessaire ?
    Par nanourene dans le forum Windows Serveur
    Réponses: 6
    Dernier message: 19/05/2008, 20h41
  5. Aspect des liens hypertextes
    Par flzox dans le forum Mise en forme
    Réponses: 5
    Dernier message: 04/09/2004, 15h29

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