J'ai un tableur sur lequel figure plusieurs connexions de données externes (format texte) donc sur plusieurs feuilles...
Afin de me simplifier certains calculs, j'ajoute, sur les feuilles ou les connexions de données se déversent, des colonnes de formules que je veux mettre à jour à chaque fois que je rafraichi la connexion concernée (et uniquement elle). Le but étant d'augmenter ou de réduire les nombre de lignes de ces formules en fonction de la taille du fichier importé.
Pour ce faire, je ne lance pas la MAJ par l'interface Excel, mais par VBA. (Thisworkbook.connections(x).Refresh)
Mon problème est que je ne trouve pas le moyen de trouver simplement sur quelle feuille se trouve la connexion rafraichie afin d'y mettre à jour les formules.
Actuellement je parcoure l'ensemble des feuilles jusqu'à trouver la bonne :
Code:
ThisWorkbook.Connections(1).Refresh
On Error Resume Next
For Each Feuille In ThisWorkbook.Worksheets
If Feuille.QueryTables(1).WorkbookConnection.Name = ThisWorkbook.Connections(1).Name Then
If Feuille.QueryTables.Count > 0 Then
Call MàJ_Formules(Feuille.Name)
Exit For
End If
End If
Next Feuille
Je ne trouve pas le moyen d’accéder au nom de la feuille plus simplement... Une idée ? (Ma procédure fonctionne très bien mais je pense qu'il y a plus Sioux !)
Par avance, merci !
PS : Ma procédure MàJ_Formules,en plus, copie-colle en valeur le résultat des formules afin d'accélerer Excel...Utile quand on ramène 40 000 Lignes et plus sur plusieurs connexions... Dailleurs merci 'Crosoft pour le format xlsb...
Re : Trouver la feuille d'une connexion de données externe
Bonjour
À vérifier par MsgBox TypeName(ThisWorkbook.Connections(1)), mais à priori cette expression renvoie directement un objet de type WorkbookConnection, lequel possède une propriété Ranges. Essayez MsgBox Workbook.Connections(1).Ranges.Address(External:=True)
Si ça affiche bien une adresse de plage vous auriez tout intérêt à réécrire Sub MàJFormules(ByVal Plage As Range)
Ce serait déjà mieux de transmettre l'objet Worksheet lui même plutôt que le nom de la feuille Excel qu'il représente, mais transmettre carrément le Range serait encore mieux.
J'avais bien noté l'objet Ranges mais l'ayant mal utilisé je n'arrivait qu'à en obtenir le nom de la connexion. En effet, si on omet l'index à Ranges, après avoir tapé "." Address ne faisait pas partie des objets accessibles...(J'utilisait ...Ranges.Parent)
Quant au passage du range en paramètre, j'ai un peu de mal avec cette technique...mais je promet de m'améliorer...
Re : Trouver la feuille d'une connexion de données externe
Ça ne m'était pas venu à l’idée que la propriété Ranges de l'objet WorkbookConnection pouvait être un tableau ou une collection.
j'imaginais plus une plage multi-zones.
Adoptez la technique tout de suite. Il vaut toujours mieux transmettre à une procédure l'objet lui même quand on le tient que de ses propriétés d'identification qui obligent à le reconstituer de l'autre coté.
Pourquoi s'obliger, en transmettant Feuille.Name, à écrire dans la procédure ActiveWorbook.Worksheets(NomFeuille) au lieu de simplement LaFeuille à la place de tout ça, si on a mis comme paramètre ByVal LaFeuille As Worksheet au lieu de ByVal NomFeuille As String ?
Pourquoi s'obliger, en transmettant Plage.Address, à écrire dans la procédure ActiveSheet.Range(Adresse) au lieu de simplement Plage à la place de tout ça, si on a mis comme paramètre ByVal Plage As Range au lieu de ByVal Adresse As String ?