Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Question bête sur Excel

15 réponses
Avatar
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 Feuil1...Feuil9
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 :

=Feuil1: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.

10 réponses

1 2
Avatar
MichD
Bonjour,

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
Avatar
GL
Le 10/12/2015 11:42, MichD a écrit :
Bonjour,

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")
Avatar
isabelle
bonjour GL,

=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 :

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")
Avatar
MichD
Bonjour,

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
'--------------------------------------------------------
Avatar
isabelle
bonjour Denis,

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
Avatar
isabelle
j'ai fait 2 test, mais sans succès,

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 :
bonjour Denis,

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

Avatar
MichD
Bonjour Isabelle,

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!
Avatar
MichD
En passant, si la feuille "Résultat" est située à l'extérieur
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

'-------------------------------------
Avatar
isabelle
donc si j'ai bien compris, il est uniquement possible d'utiliser l'argument
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 :

'-------------------------------------------------------------------------

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!


Avatar
MichD
Tu pourrais cependant faire ceci :

'-----------------------------------------
Function Test(pam)
Test = Evaluate(pam)
End Function
'-----------------------------------------

Et dans une cellule, écrire :
=test("=sum(Feuil1:Feuil3!A1)")

MichD
---------------------------------------------------------------
1 2