Changer de Feuilles avec une commande sur autre feuille
Bonjour,
J'ai fait deux macros en mettant deux boutons commandes sur la 1ière feuille et les exécutions à réaliser sur une autre feuille.
Mon 1ier souci :
Mon bouton commande (1ière feuille) doit faire une somme en utilisant les références relatives d'un tableau sur la 2ième Feuille.
La somme se fait sur la feuille des boutons commandes et passe ensuite sur la 2ième feuille
J'ai mis une boucle pour effacer le résultat afin de voir la somme quand on sélectionne de nouveau la commande.
Mon 2ième souci :
Mon bouton commande (1ière feuille) doit mettre en forme un tableau situé sur la 2ième feuille
La mise en forme du tableau se fait sur la 1ière feuille et ensuite je passe à la 2ième feuille.
En résumé, je n'arrive pas à trouver le moyen d'appuyer sur un bouton commande et aussitôt de passer à la 2ième feuille pour faire les actions.
Je reprécise que je suis très novice en VBA Excel.
Je joins mon fichier xlxm
Bonjour,
évite les select, et autre activate ... utilise par exemple une variable worksheet pour agir sur une feuille :
Sub Exemple
' déclare variable
dim sh1 as workSheet
dim sh2 as workSheet
'affecte une feuille à chacune de mes variables:
set sh1 = ThisWorkBook.sheets("Feuil1")
set sh2 = ThisWorkBook.sheets("Feuil2")
'pour agir sur la feuille 1
sh1.range("A1") = "J'ecris sur la feuille 1"
'pour agir sur la feuille 2 :
sh2.range("A1") = Sh1.range("A1") 'Je copie le contenu de la cellule A1 feuille 1 vers cellule A1 feuill2
msgbox sh2.range("A1") 'j'accéde au le contenu de la cellule A1 feuille 2
end subvoilà pour le principe ...
Bonjour pierre.jy
Merci de la réponse.
J'ai essayé votre solution mais je n'ai pas réussi à la faire fonctionner.
Je pense que je ne suis pas assez doué pour intégrer ou déclarer ces variables pour tout le classeur.
La solution que j'ai faite beug.
Je pense qu'il doit y avoir de bons manuels pas trop onéreux et efficace
Je rejoins mon fichier avec mon intégration des variable et sur les livres d'initiation en ma possession je ne trouve rien
Bonjour,
Ta première procédure modifiée, avec conseils (appliqués pour modifier).
Sub Tests_1_Tableau()
'
'Modifs conseillées : on ne sélectionne pas !
' ... on n'a pas besoin de se déplacer pour agir avec VBA (au contraire ça le ralentit)
'... par contre on active la feuille au moment opportun, soit après modification
'... puisqu'il s'agit de voir un résultat, avant de constater le retour au format Standard
' on déclare ses variables en tête de procédure
' on n'affecte pas une couleur 500 fois à la suite !!!
' si on veut éviter de se compliquer la vie avec les couleurs, on évite
' de suivre l'enregistreur et on affecte par les valeurs RGB
' si on attend 5 secondes, pas de boucle à faire ! on demande à VBA d'attendre
Dim Tps
With Worksheets("Tests 1").Range("B12").CurrentRegion
.Font.Color = RGB(0, 112, 192)
.NumberFormat = "#,##0.00"
.Worksheet.Activate
Tps = Now + TimeSerial(0, 0, 5)
Application.Wait Tps
.NumberFormat = "General"
End With
End SubCordialement.
NB- La variable Tps n'est plus typée : son contenu sera une valeur de type Date ou Double...
Pour la seconde, je me suis un peu perdu en conjectures... mais aux fins d'exercice voici une version à décortiquer :
Sub Tests_1_Somme()
Dim i%, nc%, nn%
With Worksheets("Tests 1").Range("B5")
nc = .CurrentRegion.Columns.Count
nn = .CurrentRegion.Rows.Count
With .End(xlDown)(2)
For i = 2 To nc
.Cells(1, i) = WorksheetFunction.Sum(.Offset(-nn, i - 1).Resize(nn))
Next i
.Font.Color = vbRed
.Value = "ATTENDRE"
.Worksheet.Activate
Application.Wait Now + TimeValue("00:00:05")
.Resize(, nc).ClearContents
End With
End With
End SubLes conseil sont les mêmes. En outre rappel que l'indentation consiste à mettre le code interne à la procédure en retrait d'une tabulation par rapport à la déclaration de proc. (ou à tout le moins, tout le code exécutable), de façon que seules apparaissent les étiquettes de branchement (éventuelles) sur le même alignement que la déclaration de proc., et à mettre en retrait d'une tabulation le code situé à l'intérieur d'un bloc d'instructions liées (With... End With, If... [Else]... End If, For... Next, Do... Loop, etc.)
Cordialement.
Bonjour et merci MFerrand
J'avais fait une réponse mais je vois qu'elle n'est pas passé.
J'avais fait quelques remarques:
Les 2 expressions de temps ont le même résultat.
Dans la procédure de la somme, l'expression vbRouge met le mot ATTENDRE en noir !!
Merci pour ces procédures.
Je pense que je dois faire un autre sujet pour savoir comment reconnaître s'il y a un commentaire dans une cellule
Bonjour,
Les 2 expressions de temps ont le même résultat.
Oui, en effet, puis qu'elles aboutissent à temporiser durant 5 secondes, délai que tu avais fixé mais que tu ne mesurais pas en temps.
La méthode Wait permet de fixer la date heure de reprise de l'exécution : Now renvoyant la date et l'heure à l'instant, on y ajoute 5 secondes pour la fixer. C'est la plus simple.
Une autre méthode serait d'utiliser Timer : fonction qui renvoie le temps système compté en secondes à partir de 0h00. Moins pratique dans ce cas, ex. : variable t = Timer +5 ; ensuite dans une boucle, toutes les 100, 500 ou 1000 itérations on teste si la valeur de Timer est supérieure à t, et si c'est le cas on sort de la boucle. Cela rejoint la méthode que tu avais tenté...
Dans la procédure de la somme, l'expression vbRouge met le mot ATTENDRE en noir !!Si vbRouge !
Chercher un commentaire, tout dépend de ce que tu veux faire exactement. Tu peux par exemple renvoyer le commentaire d'une cellule par la propriété Comment (de l'objet Range), pour rendre cet objet visible ou modifier le texte... A mettre sous gestion d'erreur pour le cas où le commentaire est absent...
Bonjour MFerrand
Autant pour moi pour l'expression vbRed. j'ai retranscrit VbRouge en pensant à la couleur du mot à afficher.
Pour le commentaire, je cherche à savoir si dans 1 colonne avec plusieurs cellules (B1 à B10) il y a un commentaire de documenté dans chaque cellule.
Tu te lances dans un domaine où les difficultés abondent vite
Pour tester, si des commentaires, il te faut les détecter et extraire leur texte, mais si on a une méthode pour définir le texte d'un commentaire, pas de méthode pour y accéder directement. Il faut passer par la forme qui contient ce texte (objet Shape dont les caractéristiques font appel à une multitude d'objets distincts...
Sois patient ! et bon courage !
Voilà un bout de code que tu peux tester et ensuite décortiquer...
Sub Test()
Dim c As Range, cmt$, n%
On Error GoTo nocomment
For Each c In ActiveSheet.Range("B1:B10").SpecialCells(xlCellTypeComments)
cmt = c.Comment.Shape.TextFrame.Characters.Text
n = n + 1
MsgBox "Commentaire n° " & n & " :" & Chr(10) & cmt
Next c
Exit Sub
nocomment:
MsgBox "Pas de commentaire !"
End SubCordialement.
Bonjour et MFerrand et merci de la réponse.
Effectivement la procédure fonctionne bien,
J'arrive à comprendre certains trucs mais dans la boucle for Each, il y a des expressions pas facile à gérer.
Je pensais que l'expression "OnError Goto ..." était placée après.
Mon problème est que j'ai fait du QBasc il y a beaucoup d'année et que j'ai du mal à trouver des manuscrits expliquant les bonnes bases du VBA Excel.
J'ai toujours tendance a faire des boucles avec If qui me paraissait simple en Qbasic alors que Each me parait plus compliqué à gérer.
Ce n'est que mon avis à ce stade d'initiation.
Encore merci de votre aide
Bonjour,
Je pensais que l'expression "OnError Goto ..." était placée après.
La mise mise en place d'une gestion d'erreur doit être placée avant la ligne sur laquelle on escompte une possibilité d'erreur pour jouer son rôle.
A la ligne suivante, si aucune cellule ne comporte de commentaire, il y aura une erreur...
La boucle For Each... est destinée à parcourir les membres d'une collection. Une collection est toujours une collection d'objets. Elle utilise donc une variable objet qui à chaque itération de la boucle représentera un des membres de la collection.
Ici on parcourt les membres d'une plage, soit des cellules (qui sont aussi des objets Range) mais on restreint la collection parcourue aux cellules contenant des commentaires.
A chaque itération, on peut donc extraire le texte du commentaire de la cellule, puisque si on s'y arrête c'est qu'elle en contient un.
Cordialement.
Bonjour Mr MFerrand,
Merci de vos explications, j'avance comme je peux avec mes livres mais je suis vite limité dès que je veux améliorer leurs applications tel que trier toutes les lignes d'un tableau de plusieurs colonne par rapport à une colonne. Quand on le fait par Enregistrer Macro, on a plein de codes mais il n'est pas facile de les interpréter.
Ah ! Le tri avec l'enregistreur de macro ! Particulièrement à éviter. L'enregistreur ne connait que la méthode Worksheet.Sort, plus complexe avec tous les paramètres par défaut dont le fameux xlPinYin qui n'a d'effet comme méthode de tri que pour les langues chinoises...
La méthode Range.Sort est beaucoup plus simple à écrire et à comprendre...
With ActiveSheet
n = .Cells(.Rows.Count, 1).End(xlUp).Row
.Range("A2:J" & n).Sort key1:=.Range("B2"), order1:=xlAscending, Header:=xlNo
End WithVoilà pour trier une plage de 10 colonnes, dont on détermine l'extension en lignes, sur la colonne B.
Le tri proprement dit occupe une ligne.
Cordialement.
Re, Merci,
Avec l'enregistreur, j'avais fait un tri sur une 1iere colonne et une 2ième.
Il m'a mis plein de code et pour comprendre, j'ai mis plein de ' devant plusieurs lignes et la macro fonctionne encore. Par contre, je n'arrive pas à comprendre comment il fait pour trier par une 1iere et 2ieme colonne après avoir mis mes '
' Macro3 Macro
'Range("D8:F19").Select
'ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
'ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("E8:E19") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
'ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("F8:F19") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Feuil1").Sort
.SetRange Range("D8:F19")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Je ne comprends pas comment la macro fait pour savoir qu'elle doit trier en 1ier en colonne E puis en F.
C'est un mystère pour moi
Je vois que mes commentaires sont lus...
Tu n'hésites pas à conserver SortMethod (inutile, sauf pour le chinois), Orientation (utile si tu tries par colonnes, assez rare !), et à éliminer la définition des champs de tri, mais éliminant aussi leur suppression préalable à leur redéfinition, ils demeurent actifs... ce, en privilégiant une méthode (qui à certes son intérêt dans certains cas, mais quasiment jamais dans les cas courants)...
Ferme ton classeur, rouvre-le, et regarde ce que fera ta macro !
Re,
J'ai enregistré puis fermé le fichier.
J'ai ouvert de nouveau le fichier et la macro fonctionne.
Elle trie sur la 1ière colonne puis la 2ième
Curieux ! Dans ton code invalidé c'était E et F, donc les 2e et 3e !
Re,
je me suis mal expliqué.
A l'ouverture, il trie en 1ière colonne de tri (qui est bien la E) et en 2iéme colonne de tri (qui est bien la colonne F)
Autant pour moi.
J'ai fermé et ouvert plusieurs fois le fichier et il fait bien le tri comme demandé !!!