Question bête sur Excel
Le
GL

Bonjour,
Un tableur c'est basiquement un empilement de feuilles qui sont
elles-mêmes un empilement de cases.
Bref : on peut voir ça comme un gros Rubik's Cube en 3D.
J'ai une question toute simple : j'ai des feuilles Feuil1Feuil9
qui sont toutes pareilles et en A1, sur chacune d'elles, il y a un
titre.
Je voudrais une feuille de récap qui liste les titres, du style :
þuil1:Feuil9!A1
ou bien :
=MaFonction(Feuil1:Feuil9!A1)
Je ne vois pas comment faire : si j'écris une fonction VBA (MaFonction)
je n'arrive pas à récupérer l'argument :
Function MaFonction(Param as Variant)
Param affiche toujours 'Error 2015' (dans la fenêtre des "espions").
C'est pas prévu qu'on puisse parcourir les cellules
"dans le sens de l'épaisseur" du classeur ?
Ou quelque chose m'échappe ?
Merci d'avance.
Un tableur c'est basiquement un empilement de feuilles qui sont
elles-mêmes un empilement de cases.
Bref : on peut voir ça comme un gros Rubik's Cube en 3D.
J'ai une question toute simple : j'ai des feuilles Feuil1Feuil9
qui sont toutes pareilles et en A1, sur chacune d'elles, il y a un
titre.
Je voudrais une feuille de récap qui liste les titres, du style :
þuil1:Feuil9!A1
ou bien :
=MaFonction(Feuil1:Feuil9!A1)
Je ne vois pas comment faire : si j'écris une fonction VBA (MaFonction)
je n'arrive pas à récupérer l'argument :
Function MaFonction(Param as Variant)
Param affiche toujours 'Error 2015' (dans la fenêtre des "espions").
C'est pas prévu qu'on puisse parcourir les cellules
"dans le sens de l'épaisseur" du classeur ?
Ou quelque chose m'échappe ?
Merci d'avance.
Pour parcourir une cellule dans toutes les feuilles du classeur sauf la feuille de "Résultat",
une façon de faire...
Dim Sh As Worksheet
X As String
For each Sh in Thisworkbook.Worksheets
If Sh.name <> "Résultat" then
X = X & Sh.range("A1") & " ,"
End if
Next
If x <> "" then
x = Left(x, Len(x)-2) 'pour enlever l'espace et la virgule
End
Oui. Ca complique cependant l'utilisation dans une fonction "3D".
Il faudra alors p.ex. donner à la fonction le nom de la 1ere feuille,
celui de la dernière, et un "Range".
Bref : on ne peut donc pas passer de référence 3D à une fonction VBA.
(c'est microsoft en somme : heu... "on ne peut pas"... heu... tout bien
réfléchi, "on ne peut pas")
=ConcatenerInfoSheet("Feuil1";"Feuil9";A1)
Function (FirstSheet As String, LastSheet As String, cellule As Range) As String
Dim sh As Worksheet, n As Integer, sT As String
For Each sh In Worksheets
If n <> 1 Then
If sh.Name = FirstSheet Then
n = 1
End If
End If
Do
sT = sT & " " & Range(sh.Name & "!" & cellule.Address)
If sh.Name = LastSheet Then Check = False
Loop Until Check = False
Next
ConcatenerInfoSheet = sT
End Function
isabelle
Le 2015-12-17 14:53, GL a écrit :
Une autre alternative :
Dans la cellule de ton choix, pour obtenir le résultat dans une cellule
de la feuille "Résultat" (nom à adapter dans la fonction), tu peux
écrire ceci :
=Conc("Feuil5";"Feuil1";A1)
OU
=Conc("Feuil1";"Feuil5";A1)
L'ordre dans lequel tu inscris le nom des feuilles n'est pas important
aussi longtemps que ces noms d'onglet existent.
'--------------------------------------------------------
Function ConC(FirstSheet As String, LastSheet As String, cellule As Range) As String
Dim Sh As Worksheet
Dim X As String
For Each Sh In ThisWorkbook.Worksheets
If Sh.Index >= Worksheets(FirstSheet).Index And _
Sh.Index <= Worksheets(LastSheet).Index Or _
Sh.Index <= Worksheets(FirstSheet).Index And _
Sh.Index >= Worksheets(LastSheet).Index Then
'Résultat la feuille affichant le résultat.
'Le nom à adapter...
If Sh.Name <> "Résultat" Then
X = X & Sh.Range("A1") & " ,"
End If
End If
Next
If X <> "" Then
X = Left(X, Len(X) - 2) 'pour enlever l'espace et la virgule
End If
ConC = X
End Function
'--------------------------------------------------------
est t'il possible de récupérer l'argument d'une function, lorsque celle-ci est
faite à l'aide de la souris
=test1(Feuil1:Feuil3!A1)
Function test1(MaSelection) As String
test1 = MaSelection.RefersTo
End Function
isabelle
Function test1(MaSelection) As String
t = Application.Transpose(MaSelection)
test1 = t
End Function
Function test2(MaSelection) As String
For i = LBound(MaSelection) To UBound(MaSelection)
t = t & " " & Str(MaSelection(i))
Next
test2 = t
End Function
isabelle
Le 2015-12-18 11:26, isabelle a écrit :
Pour faire ce que tu désires, il faudrait mettre le paramètre
dans la cellule entre guillemets.
Comme ceci : =test1("Feuil1:Feuil3!A1")
On pourrait alors écrire une fonction de ce type :
'-------------------------------------------------------------------------
Function test1(MaSelection As String)
Dim F1 As String, F2 As String, Y As Long
Dim Adr As String, A As Long, R As String
Dim M As String
M = MaSelection
F1 = Split(M, ":")(0)
Y = InStr(1, Split(M, ":")(1), "!", vbTextCompare)
F2 = Left(Split(M, ":")(1), Y - 1)
Adr = Mid(Split(M, ":")(1), Y + 1, 32)
For A = Sheets(F1).Index To Sheets(F2).Index
R = R & Sheets(A).Range(Adr)
Next
test1 = R
End Function
'-------------------------------------------------------------------------
Cette syntaxe =test1(Feuil1:Feuil3!A1) (sans guillemet) est
possible seulement sans une feuille de calcul. Pour le prouver,
essaie ceci :
Function test1(MaSelection) ou MaSelection représente
Feuil1:Feuil3!A1 (sans guillemet). Si tu mets un point d'arrêt
sur la ligne de déclaration de la fonction, passe la souris au-
dessus du paramètre et tu as déjà une erreur!
du premier et du dernier onglet mentionnés dans la fonction,
cette section de la fonction n'est pas utile...C'est seulement
une précaution!
'-------------------------------------
'Résultat la feuille affichant le résultat.
'Le nom à adapter...
If Sh.Name <> "Résultat" Then
X = X & Sh.Range("A1") & " ,"
End If
'-------------------------------------
Feuil1:Feuil3!A1 dans les functions utilisant
l'argument Nombre tel que =SOMME(Feuil1:Feuil3!A1) ou =PRODUIT(Feuil1:Feuil3!A1)
et jamais pour une function perso.
isabelle
Le 2015-12-18 13:18, MichD a écrit :
'-----------------------------------------
Function Test(pam)
Test = Evaluate(pam)
End Function
'-----------------------------------------
Et dans une cellule, écrire :
=test("=sum(Feuil1:Feuil3!A1)")
MichD
---------------------------------------------------------------