Microsoft 365 lien vers onglet inexistant

ZingoXs

XLDnaute Nouveau
Bonjour,

j'ai un tableau rempli de valeurs que je récupère à partir des fichiers se trouvant dans un SharePoint.
Exemple :
A1 : = 'https://shiftup.sharepoint.com/sites/..../[Finance data.xlsx]VC_Jan'!Z44
A2 : = 'https://shiftup.sharepoint.com/sites/..../[Finance data.xlsx]VC_Fev'!Z44
.....
Chaque cellule correspond à une valeur qui se trouve dans un onglet d'un mois (Jan, Fev, Mar, Apr...)
problème :
ma formule ne marche pas quand l'onglet du mois n'existe pas (l'autre équipe n'a pas encore créer l'onglet du mois décembre :s)
j'aimerais par exemple avoir un X si c'est le cas. du coup j'ai pensé à utiliser SIERREUR :
A12 : = SIERREUR('https://shiftup.sharepoint.com/sites/..../[Finance data.xlsx]VC_Fev'!Z44;"X")
mais cela ne fonctionne pas :( ! Excel affiche le message suivant :
1670407966362.png


comment puis-je contourner ce problème et avoir une cellule Vide ou avec un X si le l'onglet mentionné dans le lien n'existe pas ?
Je vous remercie d'avance pour votre aide.
 

AtTheOne

XLDnaute Impliqué
Supporter XLD
Bonsoir à toutes & à tous, bonsoir @ZingoXs
Pour ton problème je n'ai pas trouvé de solution sans code ...
Mais avec la fonction personnalisée suivante, on obtient un résultat. (Testée sur Excel 2021 avec un fichier local, je n'ai pas SharePoint)
2 conditions cependant : avoir au moins une valeur sur la 1ère ligne des onglets lus, et n'avoir pas plus de 255 colonnes à lire.
La fonction est basée sur une requête SQL.
Tu peux l'appeler de la façon suivante :
Code:
=LireFichier('https://shiftup.sharepoint.com/sites/..../Finance data.xlsx;"VC_Jan","Z44";"X")
ou faire référence à des cellule comme dans l'exemple ci-dessous
1670702097373.png

Reste que pour ramener une cellule on fait une requête. Si tu as plusieurs cellules à ramener de la même feuille il vaudrait mieux adapter la fonction pour qu'elle les ramène toutes en une seule requête.

Le code:
VB:
'Les feuilles doivent comporter au moins une valeur dans la 1ère ligne
'Pas plus de 255 colonnes

Function LireFichier(NomFichier, NomFeuille, Cellule, Optional Message)
     Application.Volatile   'Attention au temps de recalcul si on multiplie les appels de la fonction !
     Dim Cn As Object
     Dim oCat As Object, Feuille As Object
     Dim ComSQL As Object
     Dim Rst As Object
     If IsMissing(Message) Then Message = "?"
    
     'Vérification des arguments
     If NomFichier = "" Then LireFichier = "Argument NomFichier absent !": Exit Function
     tb = Split(Replace(NomFichier, "/", "\"), "\")
     If Dir(NomFichier) <> tb(UBound(tb)) Then LireFichier = "Le fichier n'existe pas !": Exit Function
     If NomFeuille = "" Then LireFichier = "Argument NomFeuille absent !": Exit Function
     If Cellule = "" Then LireFichier = "Argument Cellule absent !": Exit Function
    
     'N° de colonne dans le tableau résultat
     Col = "": On Error Resume Next: Col = Range(Cellule).Column - 1: On Error GoTo 0
     If Col = "" Then LireFichier = "Argument Cellule incorrect !": Exit Function
     'N° de ligne dans le tableau résultat
     Lgn = Range(Cellule).Row - 2
    
     Set Cn = CreateObject("ADODB.Connection")
     Set oCat = CreateObject("ADOX.Catalog")
     Set ComSQL = CreateObject("ADODB.Command")
     Set Rst = CreateObject("ADODB.Recordset")
    
     With Cn
         .Provider = "Microsoft.Jet.OLEDB.4.0"
         .connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & NomFichier & _
         ";Extended Properties=""Excel 12.0;HDR=YES;ReadOnly=True;"""
         .Open
     End With
    
     'Recherche de la feuille
     Set oCat.ActiveConnection = Cn
     Trouvée = False
     For Each Feuille In oCat.tables
          If Replace(Replace(Feuille.Name, Chr(39), ""), "$", "") = NomFeuille Then Trouvée = True: Exit For
     Next
     Set oCat = Nothing
     If Not Trouvée Then LireFichier = Message: Cn.Close: Exit Function
    
     With ComSQL
          .ActiveConnection = Cn
          .CommandType = 1
          .CommandText = "SELECT * FROM [" & NomFeuille & "$]"
     End With
     Set Rst = ComSQL.Execute
     tb = False
     On Error Resume Next: tb = Rst.GetRows: On Error GoTo 0
     If TypeName(tb) = "Boolean" Then  'Cas d'une feuille vide
          LireFichier = ""
     ElseIf Col > UBound(tb, 1) Or Lgn > UBound(tb, 2) Then 'Cellule au delà de la plage de donnée
          LireFichier = ""
     ElseIf Lgn = -1 Then
          LireFichier = Rst.Fields(Col).Name  'Titre de la colonne
     Else
          LireFichier = IIf(IsNull(tb(Col, Lgn)), "", tb(Col, Lgn)) 'Si cellule vide "" sinon la valeur
     End If
    
     Cn.Close
     Set Cn = Nothing
     Set ComSQL = Nothing
     Set Rst = Nothing
    
End Function

En pièce jointe, le fichier contenant la fonction personnalisée ("Lecture Fichier fermé.xlsm") et, pour l'exemple, un fichier de données ("Données Externes.xlsx") à placer dans le même sous-répertoire (pas nécessaire en dehors de l'exemple)

Amicalement
Alain
 

Pièces jointes

  • Lecture Fichier fermé.xlsm
    23.1 KB · Affichages: 1
  • Données Externes.xlsx
    15.4 KB · Affichages: 3

ZingoXs

XLDnaute Nouveau
Bonjour @AtTheOne

J'ai essayé ce code avec la fonction mais malheureusement cela n'a pas fonctionné avec le liens vers le Sharepoint. j'ai eu : #VALEUR! alors que le fichier et l'onglet existent bien avec une valeur dans la case.
Par contre elle a bien fonctionné avec un fichier local comme dans ton exemple.

Je te remercie beaucoup pour le temps et les explications
 

AtTheOne

XLDnaute Impliqué
Supporter XLD
Bonjour à toutes & à tous, bonjour @ZingoXs
Je te réponds de mon téléphone, je suis absent pour l'instant et sans PC...
Merci de ton retour, je regarderai si je peux simplifier la fonction (en particulier supprimer la vérification de l'existence du fichier avec Dir), car les requêtes devraient fonctionner
A bientôt
Amicalement
Alain
 

Discussions similaires

Réponses
0
Affichages
1 K