Passage d'un nom de fichier à un fonction : pb open wb

Kinous -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -

Bonjour,

J'ai une fonction à la quelle je passe un nom de fichier Excel.

Si je l'appelle depuis une sub tout va bien, si je l'appelle depuis une cellule l'instruction

  Set Wb = Workbooks.Open(nom_fic)  plante 

voici le code

Function get_val(ByVal Date_recherche As Date, ByVal nom_fic, nom_feuille As Variant) As Double

    Dim Val_trouvee As Boolean
    Dim i As Integer
    Dim nb_col, nb_lignes As Integer
    Dim Wb As Workbook
    Dim ws As Worksheet
    Dim Dd, Df As Date
    
    Set Wb = Workbooks.Open(nom_fic)
    
    If Wb Is Nothing Then
        MsgBox Prompt:="The Workbook is not available", Buttons:=vbOKOnly + vbInformation
        Exit Function
        
    End If
    Set ws = Wb.Sheets(nom_feuille)
    
    nb_lignes = ws.UsedRange.Rows.Count
    i = 2
    Val_trouvee = False
   

    Do While Not (Val_trouvee)
        Dd = ws.Cells(i, 1)
        Df = ws.Cells(i, 2)
    
        If (Date_recherche >= Dd) And (Date_recherche <= Df) Then
    
            get_val = ws.Cells(i, 3)
            Val_trouvee = True
        Else
            i = i + 1
    
        End If
    
        
    Loop
    Wb.Close

End Function

'Sub de test qui marche !

Sub essai() 
Dim Date1 As Date
Dim tarif As Double
Dim fic_Tarif, nom_onglet As String


Date1 = "02/09/2020"


fic_Tarif = "F:\Dominique\Documents\VBA_Exo\tarif_pour_test.xlsm"
nom_onglet = "Tarif_edf"
tarif = get_val(Date1, fic_Tarif, nom_onglet)

End Sub
 

Dans une cellule Excel je met 

=get_val(F1;H1;G1)

avec F1 une date

H1 = F:\Dominique\Documents\VBA_Exo\tarif_pour_test.xlsm => 

G1 = Tarif_edf

Set Wb = Workbooks.Open(nom_fic) retourne "Nothing"

Merci de votre aide

Dominique


Windows / Chrome 108.0.0.0

3 réponses

  1. NonoM45 Messages postés 1050 Date d'inscription   Statut Membre Dernière intervention   5
     

    Bonjour Kinou

    Une petite fonction ADO pour le faire

    ' fonction ADO pour récupérer une valeur entre 2 dates
    ' Demande à activer la référence Microsoft ActivX Data Object dernière version
    ' La BdD comporte 3 colonne : Date début, Date Fin, Tarif
    Function Get_Val(ByVal SearchDate As Date, sPathFic As String, ShtName As String) As Double
      Dim oCn As ADODB.Connection
      Dim oRs As ADODB.Recordset
      Set oCn = New ADODB.Connection
      With oCn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
            & sPathFic & ";Extended Properties=""Excel 12.0;HDR=YES;"""
        .Open
      End With
      Set oRs = New ADODB.Recordset
      oRs.Open "Select * from [" & ShtName & "$]", oCn, adOpenKeyset, adLockOptimistic
      Do While Not (oRs.EOF)
        If SearchDate >= oRs(0) And SearchDate <= oRs(1) Then
          Get_Val = oRs(2)
          Exit Do
        ElseIf oRs(0) <> "" Then
          oRs.MoveNext
        Else
          Exit Do
        End If
      Loop
      oCn.Close
      Set oRs = Nothing: Set oCn = Nothing
    End Function
    

    On pourrait utiliser une condition Where, mais il faudrait que le nom d'entête des colonnes soit toujours le même

    A+

    0
  2. NonoM45 Messages postés 1050 Date d'inscription   Statut Membre Dernière intervention   5
     

    Bonjour yg_be

    La fonction est en cours d'exécution lorsque l'on veut ouvrir le fichier, d'où le problème

    Avez vous essayé chez vous au moins !?

    A+

    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      Je trouve ton "au moins" pas très sympa.

      0
      1. NonoM45 Messages postés 1050 Date d'inscription   Statut Membre Dernière intervention   5 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         

        Désolé,

        Mais perso j'ai testé et effectivement ça ne fonctionne pas... d'où mon interrogation vous concernant ????

        Rien de plus

        0
  3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    bonjour,

    Tu es certain que le fichier tarif_pour_test.xlsm n'est pas ouvert au moment de l'appel?
    J'essaierais deux choses:

    1. mettre un point d'arrêt dans la fonction get_val, et l'exécuter pas à pas quand elle est appelée à partir de la formule
    2. dans la fonction essai(), mettre
      fic_Tarif = [H1]
    -1
    1. KinousDjugu Messages postés 1 Statut Membre
       

      Bonsoir yg_be,

      Merci pour ta réponse et 1000 excuses pour ce retour tardif.

      Le fichier tarif_pout_test.xlsm est bien fermé au moment de l'appel.

      J'avais déjà testé comme indiqué dans 1. C'est comme ça que je sais que le open lookbook plante (renvoie "nothing")

      En mettant fic_tarif = [H1] ça marche mais je vois pas ce que je peux faire pour pouvoir depuis une feuille Excel appeler cette fonction avec succès ?

      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > KinousDjugu Messages postés 1 Statut Membre
         

        Je pense que les fonctions appelées depuis une formule dans une feuille sont très limitées.

        Moi j'essaierais de réaliser cela autrement, pas exemple via un bouton, ou quand un évènement se produit, par exemple une cellule qui change de valeur.

        0