Microsoft 365 Souci VBA

aurelie53

XLDnaute Nouveau
Bonjour,
Dans le cadre de mon travail, je dois procéder à une écriture VBA pour mon tableau d'évènements variables, seulement je suis débutante.

Voici ce que j'ai écris : (ce code ce trouve sur les feuilles au nom de chaque salariés, salarié 1 = 1 etc.):
Option Explicit
Sub masque_1TP()
Dim f As Worksheet
For Each f In ThisWorkbook.Worksheets
If Sheets("1).Range("V5").Value = "TP" Then
Worksheets(f.Name).Columns("N:O").EntireColumn.Hidden = True
Worksheets(f.Name).Columns("P:Q").EntireColumn.Hidden = False
End If
Next f
End Sub
Sub masque_1TC()
Dim f As Worksheet
For Each f In ThisWorkbook.Worksheets
If Sheets("1).Range("V5").Value = "TC" Then
Worksheets(f.Name).Columns("P:Q").EntireColumn.Hidden = True
Worksheets(f.Name).Columns("N:O").EntireColumn.Hidden = False
End If
Next f
End Sub

Le souci est que dès que je clique sur le bouton TP pour un salarié, ça le valide pour tous, alors que certains devraient être TC.
Je pense que le souci vient de cette phrase : For Each f In ThisWorkbook.Worksheets. Il faudrait que je la remplace par : pour cette feuille dans ce classeur sauf que je ne sais pas comment le traduire en langage VBA.

Merci à ceux qui se pencheront sur mon problème.
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

J'en sais rien pour votre problème, les explications manquent de précision. TC ? TP ? où ? quand ? comment ? pourquoi ?

Par contre, dans une boucle for each comme For each f in ThisWorkbook.Worksheets, la variable objet f référence la feuille en cours il est donc inutile de faire ensuite Worksheets(f.Name).Columns..... f.Columns(.......) suffit.

Cordialement
Joignez un fichier avec votre macro et plus d'explication sur les comment et quand cacher et ou masquer les lignes.
 

STephane

XLDnaute Occasionnel
Bonjour

Pour faire référence à la feuille active, il faut utiliser le mot clé "activesheet".
VB:
Sub demo_activesheet()
with activesheet
If .Range("V5").Value = "TP" Then
.Columns("N:O").EntireColumn.Hidden = True
.Columns("P:Q").EntireColumn.Hidden = False
end if
end with
End Sub

autre exemple
Code:
Sub demo_2()
Dim f As Worksheet
For Each f In ThisWorkbook.Worksheets

'# la deuxième partie de l'instruction IF ci-dessous permet de ne pas intervenir sur la feuille active
If activesheet.Range("V5").Value = "TP" and f.name<>activesheet.name Then
Worksheets(f.Name).Columns("N:O").EntireColumn.Hidden = True
Worksheets(f.Name).Columns("P:Q").EntireColumn.Hidden = False
End If
Next f
End Sub
 

aurelie53

XLDnaute Nouveau
Merci beaucoup à vous deux de m'avoir répondu :
TP = temps partiel
TC = temps complet
Je ne peux pas partager le fichier car il y a des données personnelles ...

La première proposition de STephane fonctionne !

J'ai une dernière question concernant une dernière macro :
J'aimerais qu'elle mette un message d'avertissement quand A40 (la date du jour <> de samedi). Le problème avec la mienne est quelle tourne en boucle et ne s'arrête pas ! Avez-vous une suggestion ?


Sub Report_HS()
Dim f As Worksheet
For Each f In ThisWorkbook.Worksheets
If Range("A40") <> 6 Then
Do
If MsgBox("ATTENTION, reporterez-vous les heures sup au mois suivant ?", vbOuiNon, "Report_HS") = vbOui Then
Exit Do
End If
Loop While 1 = 1
MsgBox ";-P"
End If
Next f
End Sub

Merci d'avance pour votre aide.
 

eriiic

XLDnaute Barbatruc
Bonjour,

Si c'est le jour de la semaine qui t'intéresse, avec une vraie date en A40 ça sera plutôt :
VB:
If weekday(Range("A40", vbMonday) <> 6 Then

Code:
Loop While 1 = 1
Tu peux mettre Loop tout court.
Dis moi quand 1 = 1 peut être faux ?
eric
 

aurelie53

XLDnaute Nouveau
Bonjour,
Il est faux quand mes jours de la semaine = 1, 2, 3, 4, 5 et 7 car je décompte les HS du mois le samedi.
J'aimerais que ça m'ouvre la fenêtre avec le message et une fois que j'ai dis ok, que cette fenêtre s'enlève.
Là ça tourne toujours en boucle avec cette proposition.
 

aurelie53

XLDnaute Nouveau
Excusez-moi, je n'avais pas tout compris de la phrase (je suis débutante en VBA). Finalement j'ai écris :
Option Explicit
Private Sub Workbook_Open()
Dim f As Worksheet
For Each f In ThisWorkbook.Worksheets
Next f
If Range("A40") <> 6 Then
Do
If MsgBox("ATTENTION, reportez les heures sup au mois suivant") Then
Exit Do
End If
Loop While 1 = 1
MsgBox ";-P"
End If
End Sub

Cela fonctionne mais il me reste juste un problème : En fait, je viens de me rendre compte que la dernière ligne n'est pas forcément la 40ème car c'est un calendrier automatique en fonction du mois et de l'année. Du coup il faudrait que je lui fasse comprendre : si la dernière ligne <> 6, alors message "attention report des HS au mois suivant" et sinon aucun message.

Merci
Aurélie
 

eriiic

XLDnaute Barbatruc
Ce n'est pas parce qu'un code fonctionne (ou semble fonctionner) qu'il est propre et cohérent.
Je peux t'en écrire un de 1000 lignes qui fonctionne mais seulement une seule sera utile.

Prend conscience de ce que tu écris :
VB:
Loop While 1 = 1
boucle tant que 1=1 ! Et même en insistant dessus, rien ne te choque.
Autant écrire Loop court court qui fera la même chose.

D'autre part
Code:
If MsgBox("ATTENTION, reportez les heures sup au mois suivant") Then
Il n'y a qu'un bouton Ok, le résultat ne peut donc être que True. On passe donc toujours au Exit Do et jamais tu ne passeras par l'horrible Loop While 1=1
Encore une autre raison pour dire que cette boucle Do est totalement inutile.

Je t'encourage à rechercher sur le net quelques tuto sur le débogage en VBA.
Au minimum pour apprendre à exécuter pas à pas des lignes de code et à lire la valeur d'une variable ou d'une expression, pour t'aider comprendre ce que tu écris.
Du plus tu veux programmer sans avoir les bases, c'est mettre la charrue avant les boeufs.
Ce n'est pas un forum qui t'enseignera le B.A.BA. Il faut commence par les cours d'initiation au vba que tu trouves facilement.

Ceci dit :
Code:
    If Cells(Rows.Count, 1).End(xlUp).Value <> 6 Then
        MsgBox ("ATTENTION, reportez les heures sup au mois suivant")
    End If
Sert-toi de la touche F1 pour lire l'aide sur les méthodes ou propriétés que tu ne connais pas.
Bien que j'ai de sérieux doutes sur ce que contient la colonne A. Vraiment des nombres de 1 à 7 (?) ou une date. Mais comme tu n'as pas répondu à cette question...
eric
 

aurelie53

XLDnaute Nouveau
Je n'ai pas tellement le temps pour le moment de revoir les bases de VBA (je ne suis qu'étudiante en alternance à 39H officiellement, mais bien plus officieusement s'en parler de mon programme de deux ans vu en 13 semaines).

Ce document fait partie d'un de mes projets. J'ai réussi seule à créer un fichier Excel complexe avec d'autres VBA qui fonctionnent, pour faciliter le travail de mes collègues alors que je n'y connaissais strictement rien (sachant que cela ne fait que 6 semaines que je suis à mon poste). Et encore ça ce n'est rien, il fallu que je trouve le moyen de faire le lien entre mon tableau d'éléments variables et mon logiciel comptable. De plus, je suis pressée par le temps évidemment.

Alors franchement je vous trouve un peu dur ^^
Oui désolé ça ne m'a pas fait tilte mais encore une fois je débute, il est évident que pour mon écrit je vais approfondir mon apprentissage en la matière.

Pour que mon tableau soit automatique en fonction des dates, j'ai bien une colonne allant de 1 à 7, et celle d'à côté reprends les dates (6 = samedi, 7 = dimanche etc. …). La VBA que je cherche démarre bien avec la colonne A.

Je vous remercie quand même de m'avoir répondu, cela fonctionne très bien, et de m'avoir apporté vos conseils.

Aurélie
 

xUpsilon

XLDnaute Accro
Bonjour,

Simple indication au passage pour que tu comprennes ta faute :
Le "Loop While" est ta condition de test : en gros, tu effectues plusieurs boucles de ce qu'il y a dans ton Do ... While, en testant à chaque fois la condition que tu as placé après le Loop While ___.
En fait, par traduction littéralement, tu "Boucles Tant que ___". Sauf que ici ta condition c'est est-ce que 1 est égal à 1 ?
La réponse, je pense que tu en conviendras, est OUI.
Du coup il boucle et continue tant que 1 = 1. Sauf que depuis la nuit des temps et pour jusqu'encore un sacré bout de temps à mon avis, 1 sera toujours égal à 1.
Bref, tout ça pour dire que ce que tu dois placer après Loop While c'est une condition d'arret, et que 1 = 1 bah c'est toujours vrai, donc la boucle risque pas de s'arreter de sitot.

Bonne continuation
 

aurelie53

XLDnaute Nouveau
Merci pour l'info.
Je confirme que je n'avais pas compris l'intérêt du loop while ^^
En fait je pensais que pour faire un MsgBox, il fallait forcément une réponse pour que la fenêtre se ferme, mais non !
Du coup, comme me l'a conseillé Eriiiic, je l'ai enlevé, c'est mieux.
Bonne journée à vous.
 

Discussions similaires

Réponses
12
Affichages
242
Réponses
6
Affichages
227

Statistiques des forums

Discussions
312 103
Messages
2 085 319
Membres
102 862
dernier inscrit
Emma35400