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
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")
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")
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")
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")
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")
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")
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 '--------------------------------------------------------
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
'--------------------------------------------------------
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 '--------------------------------------------------------
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
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
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
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!
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!
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!
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
'-------------------------------------
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
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
'-------------------------------------
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
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!
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
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!
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
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!
MichD
Tu pourrais cependant faire ceci :
'----------------------------------------- Function Test(pam) Test = Evaluate(pam) End Function '-----------------------------------------
Et dans une cellule, écrire : =test("=sum(Feuil1:Feuil3!A1)")