XL 2021 Problème d'accès aux datas d'une autre feuille fermée

p'tit vieux

XLDnaute Occasionnel
Bonjour à tous,
Comme le titre l'indique j'ai un petit souci dans un UDF que j'espère pouvoir vous soumettre bientôt..
Je sais que c'est un sujet assez récurant mais je n'ai rien lu qui résolve mon exemple.
Voici le problème ...
J'ai une fonction dans un fichier (Fonction.xlsm) qui lit des valeurs dans un autre fichier (Datas externes.xlsx).
  1. Lorsque celui-ci est ouvert pas de souci.
  2. Lorsqu'il est fermé j'ai 2 cas:
    1. Si c'est une plage de cellule => >Je reçois un tableau (ca me gène mais ca se gère)
    2. Si plusieurs Areas (zones) là j'ai une erreur 2015. :eek::mad:
Je sais que la principale solution est d'ouvrir (masqué !) le fichier par code VBA j'ouvre des données externes mais, dans ma macro, je n'ai pas réussi à ouvrir le fichier(Datas externes.xlsx) avec ce qui est proposé dans les forums. Pour l'instant, je ne comprend pas pourquoi mais c'est ainsi.
Par contre je vois un défaut au fait d'ouvrir un fichier: Par exemple, imaginé le temps d'ouverture avec un gros fichier complexe avec des calculs dans tous les sens 😰

Donc si quelqu'un à une ou plusieurs idées
Cordialement à tous
 

Pièces jointes

  • Fonction.xlsm
    21.4 KB · Affichages: 8
  • Datas externes.xlsx
    17.3 KB · Affichages: 10

patricktoulon

XLDnaute Barbatruc
bonsoir @job75
ok on supprime les valeurs zero alors
VB:
'patricktoulon
'exemple; '='chemin & "\[" & nomfichier &"]" & nomdelafeuille & "'!" address de cellule"
Sub test_récup_plagemacro4()
    Dim Chemin$, fichier$, Feuille$, T, plage As Range
    Chemin$ = ThisWorkbook.Path    'à adapter
    fichier$ = "Datas externes.xlsx"   'à adapter
    Set plage = [C11:C15,C20:C21,C18]    'la plage en range
    Feuille$ = "Feuil1"    'le non de la feuille (Attention pas le codename mais bien le nom que vous lui avez donné)
    T = GetRowNOnColumnCloseFich(Chemin, fichier, "Feuil1", plage)

    [A1].Resize(UBound(T)).Value = T
    MsgBox "min : " & Application.Small(T, 1)
    MsgBox "max : " & Application.Small(T, UBound(T))
    MsgBox "moyenne : " & WorksheetFunction.Sum(T) / UBound(T)
End Sub
Function GetRowNOnColumnCloseFich(Chemin As String, fich As String, Feuille As String, rng As Range)
    Dim tbl, I&, valeur#
    ReDim tbl(1 To rng.Cells.Count)
    For Each cel In rng.Cells
        valeur = CDbl(ExecuteExcel4Macro("'" & Chemin & "\[" & fich & "]" & Feuille & "'!" & cel.Address(, , xlR1C1)))
        If valeur <> 0 Then I = I + 1: tbl(I) = valeur
    Next
    ReDim Preserve tbl(1 To I)
    GetRowNOnColumnCloseFich = Application.Transpose(tbl)
End Function
mais pour moi c'est enlever les zero qui fausse la moyenne
 

patricktoulon

XLDnaute Barbatruc
re
ok empty alors je vois pas trop ce que ca change mais bon
VB:
'patricktoulon
'exemple; '='chemin & "\[" & nomfichier &"]" & nomdelafeuille & "'!" address de cellule"
Sub test_récup_plagemacro4()
    Dim Chemin$, fichier$, Feuille$, T, plage As Range
    Chemin$ = ThisWorkbook.Path    'à adapter
    fichier$ = "Datas externes.xlsx"   'à adapter
    Set plage = [C11:C15,C20:C21,C18]    'la plage en range
    Feuille$ = "Feuil1"    'le non de la feuille (Attention pas le codename mais bien le nom que vous lui avez donné)
    T = GetRowNOnColumnCloseFich(Chemin, fichier, "Feuil1", plage)

    [A1].Resize(UBound(T)).Value = T
    MsgBox "min : " & Application.Small(T, 1)
    MsgBox "max : " & Application.Small(T, UBound(T))
    MsgBox WorksheetFunction.Sum(T) / UBound(T)
End Sub
Function GetRowNOnColumnCloseFich(Chemin As String, fich As String, Feuille As String, rng As Range)
    Dim tbl, I&, valeur#
    ReDim tbl(1 To rng.Cells.Count)
    For Each cel In rng.Cells
        I = I + 1:
        valeur = CDbl(ExecuteExcel4Macro("'" & Chemin & "\[" & fich & "]" & Feuille & "'!" & cel.Address(, , xlR1C1)))
        If valeur = 0 Then tbl(I) = Empty Else tbl(I) = valeur
    Next
    ReDim Preserve tbl(1 To I)
    GetRowNOnColumnCloseFich = Application.Transpose(tbl)
End Function
 

patricktoulon

XLDnaute Barbatruc
re
le small(max) ne fonctionne pas avec un empty
on prend directement les fonction min et max
VB:
'patricktoulon
'exemple; '='chemin & "\[" & nomfichier &"]" & nomdelafeuille & "'!" address de cellule"
Sub test_récup_plagemacro4()
    Dim Chemin$, fichier$, Feuille$, T, plage As Range
    Chemin$ = ThisWorkbook.Path    'à adapter
    fichier$ = "Datas externes.xlsx"   'à adapter
    Set plage = [C11:C15,C20:C21,C18]    'la plage en range
    Feuille$ = "Feuil1"    'le non de la feuille (Attention pas le codename mais bien le nom que vous lui avez donné)
    T = GetRowNOnColumnCloseFich(Chemin, fichier, "Feuil1", plage)

    [A1].Resize(UBound(T)).Value = T
    MsgBox "min : " & Application.Min(T, 1)
    MsgBox "max : " & Application.Max(T)
    MsgBox WorksheetFunction.Sum(T) / UBound(T)
End Sub
Function GetRowNOnColumnCloseFich(Chemin As String, fich As String, Feuille As String, rng As Range)
    Dim tbl, I&, valeur#
    ReDim tbl(1 To rng.Cells.Count)
    For Each cel In rng.Cells
        I = I + 1:
        valeur = CDbl(ExecuteExcel4Macro("'" & Chemin & "\[" & fich & "]" & Feuille & "'!" & cel.Address(, , xlR1C1)))
        If valeur = 0 Then tbl(I) = Empty Else tbl(I) = valeur
    Next
    ReDim Preserve tbl(1 To I)
    GetRowNOnColumnCloseFich = Application.Transpose(tbl)
End Function
 

patricktoulon

XLDnaute Barbatruc
ok donc du string
il faut donc convertir ce n'est plus cdbl mais Val
VB:
'patricktoulon
'exemple; '='chemin & "\[" & nomfichier &"]" & nomdelafeuille & "'!" address de cellule"
Sub test_récup_plagemacro4()
    Dim Chemin$, fichier$, Feuille$, T, plage As Range
    Chemin$ = ThisWorkbook.Path    'à adapter
    fichier$ = "Datas externes.xlsx"   'à adapter
    Set plage = [C11:C15,C20:C21,C18]    'la plage en range
    Feuille$ = "Feuil1"    'le non de la feuille (Attention pas le codename mais bien le nom que vous lui avez donné)
    T = GetRowNOnColumnCloseFich(Chemin, fichier, "Feuil1", plage)

    [A1].Resize(UBound(T)).Value = T
    MsgBox "min : " & Application.Min(T, 1)
    MsgBox "max : " & Application.Max(T)
    MsgBox WorksheetFunction.Sum(T) / UBound(T)
End Sub
Function GetRowNOnColumnCloseFich(Chemin As String, fich As String, Feuille As String, rng As Range)
    Dim tbl(), I&, valeur
    ReDim tbl(1 To rng.Cells.Count)
  
   For Each cel In rng.Cells
        I = I + 1:
       valeur = ExecuteExcel4Macro("""""&'" & Chemin & "\[" & fich & "]" & Feuille & "'!" & cel.Address(, , xlR1C1))
         
         tbl(I) = IIf(valeur <> "", Val(valeur), valeur)
    Next
    ReDim Preserve tbl(1 To I)
    GetRowNOnColumnCloseFich = Application.Transpose(tbl)
End Function
 

patricktoulon

XLDnaute Barbatruc
Bonjour
en terme simple @p'tit vieux
je recupérais les données tel quel , @job75 lui ajoute un vbnullstring pour récupérer en texte afin d'avoir vide si la cellule est vide dans le fichier fermer(sinon la macro4 renvoie "0"
la chose etonnante c'est que de ce fait vba converti la virgule de la decimale en point
on ne passe donc plus par cdbl mais Val
du reste bien sur il faut ajouter si ="" alors Empty sinon val(le resultat de la macro4)

tout simplement ;)

donc
1°pour l'utilisation des macro4 utiliser le post#56
ou
2°pour les formules de liaison implantées directement dans les cellule par la collection dans une variable tableau utiliser alors la version du post #32

3° la version ADO de robert @dysortographie

le choix va dependre ce que tu veux faire avec les données (pré traitement , post traitement , traitement)

je pense que l'udf doit s'arréter là
c'est à dire quelque possibilités mais pas plus car
c'est un exercice qui peut avoir de diverses forme correspondant à un besoin

tu a donc 3 méthodes pour récupérer des données brutes dans fichiers fermés
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
315 087
Messages
2 116 086
Membres
112 656
dernier inscrit
VNVT