VBA Journée - Date
Bonjour à tous !
J'espère que vous vous portez bien en cette période difficile.
J'ai besoin de vous pour ce code :
Sub test()
End Sub
Ce code s'applique uniquement sur la feuille activée et j'aimerai pouvoir l'utiliser sur les onglets que je sélectionne sur ma feuille de calcul. Pas toutes les feuilles mais seulement celles que j'aurai sélectionné au préalable pour y appliquer la macro.
Je vous remercie par avance de votre retour !
Laplacea
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
Bonjour,
Une proposition en PJ.
Le traitement se fait sur l'onglet passé en paramètre.
Public Sub Test(poOnglet As Worksheet)
With poOnglet 'agit sur l'onglet
Bouben
Bonjour,
Merci de ton retour et de ton aide !
Ca ne marche par car j'aimerai que tout le code listé dans le premier message de la discussion puisse se réaliser sur chaque onglet que j'aurai séléctionné avant d'utiliser la macro.
Je n'obtiens ce resultat avec la macro que tu as proposé. Il ajoute des colonnes mais n'effectue pas la macro sur les onglets que j'ai pu selectionner avant.
Est-il possible de le faire ?
Je te remercie beaucoup pour ton aide et à tous ceux qui liront ce message !
Bien à vous et prenez soin de vous.
Laplacea
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
Bonsoir,
Dans le fichier envoyé :
> le nom de l'onglet est passé en paramètre
> la procédure est reprise telle quelle, en se basant non plus sur "ActiveSheet ", mais sur l'onglet passé en paramètre.
Pour lancer la procédure sur l'onglet X ou sur n onglets différents, il suffit d'appeler la procédure avec l'onglet (ou les onglets) en paramètre.
Un exemple est fourni, dans la procédure "XXXX", avec un seul onglet, il reste à dupliquer la ligne, avec tous les onglets à traiter
Public Sub XXXX()
Test Worksheets("14-15")
End Sub
Tu as bien pris en compte ces différents points, avant de conclure que "ça ne marche pas"
Si oui, merci de préciser davantage le résultat attendu ...
Bouben
Bonjour,
Si j'ai bien compris tu souhaites que ta macro s'exécute uniquement sur les onglets sélectionnés.
Pour cela tu peux utiliser une procédure VBA qui boucle sur les onglets sélectionnés uniquement
Exemple de boucle:
Sub Traitement()
Dim F As Worksheet
For Each F In ActiveWindow.SelectedSheets
test F
Next F
End Sub
Ta procédure test est appelée dans la boucle et passe en paramètre la variable F qui représente l'onglet sélectionné en cours.
Dans ta procédure TEST il faut alors réceptionner la variable F et remplacer ActiveSheeet par F
exemple:
Sub test(F As Worksheet)
Dim derlig As Long
Application.ScreenUpdating = False
With F 'agit sur la feuille active
If F.Name <> "Exemple" Then 'si le nom de la feuille est différent de Exemple
derlig = .Range("D" & Rows.Count).End(xlUp).Row 'dernière ligne utilisée de la colonne D
Etc...
Bien cordialement,
Bonjour tout le monde,
Un essai....les onglets sont selectionnés manuellement avant d'exécuter la macro...
Sub test()
Dim derlig As Long
Dim sh As Worksheet
Application.ScreenUpdating = False
For Each sh In ActiveWindow.SelectedSheets
If sh.Name <> "Exemple" Then 'si le nom de la feuille selectionnée est différent de Exemple
sh.activate
derlig = sh.Range("D" & Rows.Count).End(xlUp).Row 'dernière ligne utilisée de la colonne D
sh.Columns("B:B").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove 'insert une colonne à gauche de la colonne B
sh.Columns("C:C").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove 'insert une colonne à gauche de la colonne C
sh.Range("B2") = "Série H": sh.Range("B2").Interior.ColorIndex = 6 'titre et couleur colonne B
sh.Range("C2") = "Série A": sh.Range("C2").Interior.ColorIndex = 6 'titre et couleur colonne C
sh.Range("B3").FormulaR1C1 = "=COUNTIF(R3C[3]:RC[4],RC[3])" 'ta formule en B3
sh.Range("B3:B" & derlig).FillDown 'on tire la formule jusqu'à la dernière ligne
sh.Range("C3").FormulaR1C1 = "=COUNTIF(R3C[2]:RC[3],RC[3])" 'ta formule en C3
sh.Range("C3:C" & derlig).FillDown 'on tire la formule jusqu'à la dernière ligne
sh.Columns("B:C").HorizontalAlignment = xlCenter 'centrer horizontalement sur colonnes B et C
End If 'fin de la condition
Next sh
End Sub
EDIT: Oups! En fait c'est la même réponse que GNIN,
Cordialement,
Re,
La réponse que je t'avais apportée (après moult tentatives,
https://forum.excel-pratique.com/viewtopic.php?p=852845#p852845
Un essai à partir de ma dernière proposition....
- Sélectionnes tes onglets
- CTRL + e pour exécuter la macro...
Cordialement,
Hello à tous ! J'espere que vous vous portez bien
Merci pour vos retours !
xorsankukai, je souhaitais éviter de te sursolliciter ahah ! Je voulais ajouter un élément par rapport au post précédent.
En tout cas tu es toujours aussi réactif !
Peux-tu réaliser la même chose sur les onglets sélectionnés avant d'utiliser la macro avec le code suivant :
" Option Explicit
"
Je te remercie par avance !
Laplacea
Re,
Ton fichier en retour.....à tester (j'ai fait la modif.sur les 3 macros).....
Il suffisait de remplacer
With ActiveSheet
End With
par
For Each sh In ActiveWindow.SelectedSheets
sh.activate
'le code
next sh
Et rajouter
sh
devant les
.cells
Option Explicit
Sub Macro1()
'
Dim nbserie&, i&, j&, dl&, ng&
Dim sh As Worksheet
nbserie = 3 ' nbseries à créer, progression linéaire
For Each sh In ActiveWindow.SelectedSheets
sh.Activate
dl = sh.Cells(Rows.Count, 2).End(xlUp).Row 'dl= dernière ligne utilisée en colonne 2 (colonne B)
For j = 1 To nbserie ' titre colonne en ligne 2
sh.Cells(2, 6 + j * 2) = "Serie"
sh.Cells(2, 5 + j * 2) = j + 0.5
Next j
For i = 3 To dl 'on parcourt toutes les lignes
If sh.Cells(i, 2) = "" Then Exit For 'on quitte la boucle si journée=""
ng = sh.Cells(i, 4) + sh.Cells(i, 5) 'ng nombres de goals =somme colonne D+colonne E pour la ligne i
sh.Cells(i, 6) = ng 'mettre nombre de goals en colonne F
For j = 1 To nbserie ' nbseries à créer
If ng > j + 0.5 Then 'test si nombre de goals supérieur à la valeur pivot pour la série j ( donc 1.5 pour série 1, 2.5 pour série 2, ....)
If sh.Cells(i - 1, 3) = sh.Cells(i, 3) Then 'equipe sur la ligne = equipe sur la ligne précédente
sh.Cells(i, 6 + j * 2) = sh.Cells(i - 1, 6 + j * 2) + 1 'incremente compteur de la série
Else
sh.Cells(i, 6 + j * 2) = 1 'initialise compteur à 1
End If
sh.Cells(i, 5 + j * 2) = "Oui" 'score pivot dépassé
Else
sh.Cells(i, 6 + j * 2) = 0 'initialise compteur à 0
sh.Cells(i, 5 + j * 2) = "Non" 'score pivot pas dépassé
End If
Next j 'série suivante
Next i 'ligne suivante
Next sh
End Sub
Cordialement,
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
Bonjour à tous
proposition similaire :
En reprenant mon post d'hier, en ajoutant les feuilles sélectionnées,
Public Sub XXXX()
Dim oSh As Worksheet
For Each oSh In ActiveWindow.SelectedSheets
Test oSh
Next oSh
End Sub
NB : dans la procédure test, si tu as pris le temps de regarder (!), les "." étaient ajoutés pour être sur le bon onglet.
Bouben