| > Bottom | >> Home | ||
|
Cette page contient des exemples de programmation Visual Basic pour Excel (macro). Ce code est mis en ligne dans la seul but de montrer du code source qui fonctionne et peut donc servir d'exemple au niveau syntaxe. exemple 1 exemple 2 exemple 3 exemple 4
' ' compterTests Macro ' Macro enregistrée le 12/02/2004 par Fabrice Levasseur ' ' Contraintes macro 'compterTests' (nombre de tests à partir des copies de DTV) ' ----------------------------------------------------------------------------- ' ' 1) pour chaque onglet, le nombre de tests est calculé sur exécution de la macro 'compterTests' ' cette exécution n'est pas automatique : il faut taper le raccourci ' ' 2) le résultat de cette macro est toujours mis dans la cellule D2 (si cette cellule contient une autre info, il y aura écrasement !) ' ' 3) la colonne B de chaque onglet est INTÉGRALEMENT dédiée à la macro ' => si une valeur numérique non barrée est rajoutée dans cette colonne, cela impactera le résultat de la macro ' ' Parcours de la colonne des tests (B) : de 1 à ligneCMax ligneNbTestsMax = 5000 ' Numero de la colonne à parcourir (colonne des tests : B) colonneTests = 2 ' Compteur de numero de tests valides (numerique et non barré) compteurTest = 0 'Boucle sur la colonne colonneTests For ligneC = 1 To ligneNbTestsMax Step 1 ' On recupere la valeur de la cellule (ligneC,colonneTests) Cells(ligneC, colonneTests).Select valeurC = ActiveCell.Value ' Test valeur numerique If ((valeurC <> "") And (IsNumeric(valeurC))) Then ' Valeur numerique => test si barrée ou non If (Selection.Font.Strikethrough = True) Then ' Valeur numerique barree => on colorie le fond seulement With Selection.Interior .ColorIndex = 15 .Pattern = xlSolid End With Else ' Valeur numerique NON barree => on incremente le compteur de tests compteurTest = compteurTest + 1 Selection.Interior.ColorIndex = xlNone End If End If Next ligneC ' on ecrit le resultat dans la cellule D2 dédiée Range("D2").Select ActiveCell.Value = compteurTest End Sub
creerListeDestinataires End Sub Sub creerListeDestinataires() ' ' creerListeMails ' Macro enregistrée le 05/12/2003 par Fabrice LEVASSEUR ' ' Récupération du nombre de Collaborateurs (NbC) NbC = Range("H1").Value ' Boucle sur les NbC For compteurC = 1 To NbC Step 1 ' Collaborateur à ignorer ? If Cells(compteurC + 1, 4).Value = True Then Cells(compteurC + 1, 6).Select ActiveCell.Value = "IGNORE" Else ' Construction du fichier à contrôler numSemaine = Range("J8").Value Cells(compteurC + 1, 2).Select matriculeC = ActiveCell.Value complementSemaine = "" If numSemaine < 10 Then complementSemaine = "0" End If Set wb = ActiveWorkbook ActivePath = Left(wb.FullName, Len(wb.FullName) - Len(ActiveWorkbook.Name)) cheminFichier = ActivePath & "S" & complementSemaine & numSemaine & "\*_" & matriculeC & ".xls" Cells(compteurC + 1, 6).Select If Dir(cheminFichier) = "" Then ActiveCell.Value = "CATS ABSENT !" Else ActiveCell.Value = "CATS présent" End If End If Next compteurC ' On range le curseur (gênant lorsque liste collaborateurs longue) 'Range("J1").Select End Sub Sub envoyerMail() ' Création de la liste des detinataires dest = "" ' Récupération du nombre de Collaborateurs (NbC) NbC = Range("H1").Value ' Boucle sur les NbC For compteurC = 1 To NbC Step 1 ' CATS absent ? Cells(compteurC + 1, 6).Select resultatControle = ActiveCell.Value If resultatControle = "CATS ABSENT !" Then Cells(compteurC + 1, 3).Select mailC = ActiveCell.Value If dest <> "" Then dest = dest & " ; " End If dest = dest & mailC End If Next compteurC ' Envoi du mail If dest <> "" Then ' Recuperation du type de messagerie ' L7 = 1 (Outlook Express) ou 2 (Outlook 2000) typeclient = Range("L7").Value If (typeclient = 1) Then 'Outlook Express sujet = Range("L2").Value Texte = Range("L5").Value Shell "C:\Program Files\Outlook Express\msimn.exe " & "/mailurl:mailto:" & dest & "?subject=" & sujet & "&Body=" & Texte 'pas de confirmation car envoi manuel Else ' Outlook 2000 Set ol = CreateObject("outlook.application") Set mail = ol.createitem(olmailitem) mail.to = dest mail.Subject = Range("L2").Value mail.body = Range("L5").Value mail.send 'confirmation car envoyé automatiquement MsgBox ("Relance envoyée à : " & dest) End If Else MsgBox ("Tous les CATS sont présents : relance non effectuée") End If End Sub
' ' TdB ' Macro enregistrée le 04/03/2002 par Fabrice LEVASSEUR ' ' Réduction de l'application Application.WindowState = xlMinimized ' ActiveWindow.WindowState = xlMinimized Sheets("Calculs intermédiaires").Visible = True Sheets("Calculs intermédiaires").Select Columns("D:K").Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone Selection.Borders(xlEdgeLeft).LineStyle = xlNone Selection.Borders(xlEdgeTop).LineStyle = xlNone Selection.Borders(xlEdgeBottom).LineStyle = xlNone Selection.Borders(xlEdgeRight).LineStyle = xlNone Selection.Borders(xlInsideVertical).LineStyle = xlNone Selection.Borders(xlInsideHorizontal).LineStyle = xlNone ' Création des tableaux croisés dynamiques ' => but = initialiser les index Indicateurs qui pointent vers ces tableaux croisés dynamiques ' ------------ Activités ActiveSheet.PivotTables("TMP").PivotSelect "", xlDataAndLabel Selection.ClearContents ActiveSheet.PivotTableWizard SourceType:=xlDatabase, SourceData:= _ "Saisies!C1", TableDestination:="R1C10", TableName:="TMP" ActiveSheet.PivotTables("TMP").DisplayNullString = False ActiveSheet.PivotTables("TMP").AddFields RowFields:="Activité" ActiveSheet.PivotTables("TMP").PivotFields("Activité").Orientation = _ xlDataField ' ------------ Unité d'Oeuvre ActiveSheet.PivotTables("TMP2").PivotSelect "", xlDataAndLabel Selection.ClearContents ActiveSheet.PivotTableWizard SourceType:=xlDatabase, SourceData:= _ "Saisies!C2", TableDestination:="R1C6", TableName:="TMP2" ActiveSheet.PivotTables("TMP2").DisplayNullString = False ActiveSheet.PivotTables("TMP2").AddFields RowFields:="Unité d'Oeuvre" ActiveSheet.PivotTables("TMP2").PivotFields("Unité d'Oeuvre").Orientation = _ xlDataField ' ------------ Ressources ActiveSheet.PivotTables("TMP3").PivotSelect "", xlDataAndLabel Selection.ClearContents ActiveSheet.PivotTableWizard SourceType:=xlDatabase, SourceData:= _ "Saisies!C3", TableDestination:="R1C14", TableName:="TMP3" ActiveSheet.PivotTables("TMP3").DisplayNullString = False ActiveSheet.PivotTables("TMP3").AddFields RowFields:="ID Ressource" ActiveSheet.PivotTables("TMP3").PivotFields("ID Ressource").Orientation = _ xlDataField ' Récupération du nombre d'Activités Range("H2").Select NbAC = "=COUNTIF('Calculs intermédiaires'!C[2],"">a"")-3+COUNTIF('Calculs intermédiaires'!C[2],"">0"")" ActiveCell.Value = NbAC NbAC = Range("H2").Value ' Récupération du nombre d'Unité d'Oeuvre Range("D2").Select NbUO = "=COUNTIF('Calculs intermédiaires'!C[2],"">a"")-3+COUNTIF('Calculs intermédiaires'!C[2],"">0"")" ActiveCell.Value = NbUO NbUO = Range("D2").Value ' Récupération du nombre de Ressources Range("L2").Select NbRS = "=COUNTIF('Calculs intermédiaires'!C[2],"">a"")-3+COUNTIF('Calculs intermédiaires'!C[2],"">0"")" ActiveCell.Value = NbRS NbRS = Range("L2").Value '################################################################################### ' Création d'un tableau d'Activités temporaire pour la fonction BDMIN ' structuré de double-lignes dont chacune comporte une première ligne égale au Titre (Activités) ' et la seconde au nom de l'activité. Ainsi de suite jusqu'à la dernière activité. ' Exemple : ' Activités ' ACT1 ' Activités ' ACT2 ' Activités ' ACT3 ' etc. ' Suppression du tableau précédent Columns("I:I").Select Selection.ClearContents C = 9 ' indice de colonne ("I") L = 2 ' indice de ligne Sheets("Saisies").Select Titre = Range("A1").Value ' Titre de la colonne "Activités" Sheets("Calculs intermédiaires").Select ' Boucle de création du tableau pour BDMIN For CAC = 1 To NbAC Step 1 ' Titre Cells(L, C).Select ActiveCell.Value = Titre ' Nom activité L = L + 1 Cells(CAC + 2, C + 1).Select ' Tableau croisé : ligne décalée de +2 et colonne "Z" NomAC = ActiveCell.Value Cells(L, C).Select ActiveCell.Value = NomAC L = L + 1 Next CAC '################################################################################### ' Création d'un tableau d'Unité d'Oeuvre temporaire pour la fonction BDMIN ' structuré de double-lignes dont chacune comporte une première ligne égale au Titre (Activités) ' et la seconde au nom de l'activité. Ainsi de suite jusqu'à la dernière activité. ' Exemple : ' Unité d'Oeuvre ' UO1 ' Unité d'Oeuvre ' UO2 ' Unité d'Oeuvre ' UO3 ' etc. ' Suppression du tableau précédent Columns("E:E").Select Selection.ClearContents C = 5 ' indice de colonne ("E") L = 2 ' indice de ligne Sheets("Saisies").Select Titre = Range("B1").Value ' Titre de la colonne "Unité d'Oeuvre" Sheets("Calculs intermédiaires").Select ' Boucle de création du tableau pour BDMIN For CUO = 1 To NbUO Step 1 ' Titre Cells(L, C).Select ActiveCell.Value = Titre ' Nom activité L = L + 1 Cells(CUO + 2, C + 1).Select ' Tableau croisé : ligne décalée de +2 et colonne "V" NomUO = ActiveCell.Value Cells(L, C).Select ActiveCell.Value = NomUO L = L + 1 Next CUO '################################################################################### ' Création d'un tableau des Ressources temporaire pour la fonction BDMAX ' structuré de double-lignes dont chacune comporte une première ligne égale au Titre (ID Ressource) ' et la seconde au nom de la ressource. Ainsi de suite jusqu'à la dernière ressource. ' Exemple : ' ID Ressource ' RS1 ' ID Ressource ' RS2 ' ID Ressource ' RS3 ' etc. ' Suppression du tableau précédent Columns("M:M").Select Selection.ClearContents C = 13 ' indice de colonne ("M") L = 2 ' indice de ligne Sheets("Saisies").Select Titre = Range("C1").Value ' Titre de la colonne "ID Ressource" Sheets("Calculs intermédiaires").Select ' Boucle de création du tableau pour BDMAX For CRS = 1 To NbRS Step 1 ' Titre Cells(L, C).Select ActiveCell.Value = Titre ' Nom ressource L = L + 1 Cells(CRS + 2, C + 1).Select ' Tableau croisé : ligne décalée de +2 et colonne +1 NomRS = ActiveCell.Value Cells(L, C).Select ActiveCell.Value = NomRS L = L + 1 Next CRS '################################################################################### ' Finalisation : fermeture barre d'outil Tableau croisé dynamique et ' placement des cellules pré-sélectionné Application.CommandBars("PivotTable").Visible = False Application.CutCopyMode = False Range("A1").Select ActiveWindow.SelectedSheets.Visible = False '################################################################################### ' Calcul du suivi mensuel général ' ' Visibilité Sheets("Suivi mensuel INTERMEDIAIRE").Visible = True Sheets("Calculs quant-m INTERMEDIAIRES").Visible = True ' Effacement des données précédentes : DESACTIVEES car étendue calculs paramétrée ' Sheets("Suivi mensuel INTERMEDIAIRE").Select ' Range("C2:IV203").Select ' Selection.ClearContents ' Recuperation de la zone de la feuille "Suivi mensuel INTERMEDIAIRE" à balayer Sheets("Calculs quant-m INTERMEDIAIRES").Select ' Récupération du nombre de ligne à balayer NbL = Range("G2").Value ' Récupération de l'intervalle des mois à traiter finMois = Range("G3").Value debutMois = Range("F3").Value C = 2 ' indice de la première colonne -1 ("B") L = 1 ' indice de la première ligne (contient le mois) ' Boucle générale par MOIS For CC = debutMois To finMois Step 1 ' Mois Sheets("Suivi mensuel INTERMEDIAIRE").Select Cells(1, C + CC).Select ' Cellule contenant le mois calculé pour tous les couples Mois = ActiveCell.Value ' Positionnement de valeurs dans Calculs quant-m INTERMEDIAIRES pour calcul Sheets("Calculs quant-m INTERMEDIAIRES").Select Cells(1, 2).Select ' Cellule B1 à initialiser avec le mois en cours ActiveCell.Value = Mois For CL = 1 To NbL Step 1 ' Récupération de l'UOE_TYPE actuel Sheets("Suivi mensuel INTERMEDIAIRE").Select Cells(L + CL, 1).Select NomUOType = ActiveCell.Value ' Récupération de la ressource_type actuel Cells(L + CL, 2).Select NomRSType = ActiveCell.Value ' Positionnement de valeurs dans Calculs quant-m INTERMEDIAIRES pour calcul (suite) Sheets("Calculs quant-m INTERMEDIAIRES").Select Cells(7, 8).Select ' Cellule H7 à initialiser avec le nom de la ressource ActiveCell.Value = NomUOType Cells(8, 8).Select ' Cellule H8 à initialiser avec le nom de la ressource ActiveCell.Value = NomRSType ' Somme mensuelle travaillee Cells(18, 8).Select ' Cellule H18 contient le nb de jour First+Last SommeTRA = ActiveCell.Value ' Semaines intermédiaires Cells(22, 2).Select ' Cellule B22 contient le numéro de la première semaine intermédiaire S1 = ActiveCell.Value Cells(23, 2).Select ' Cellule B23 contient le numéro de la dernière semaine intermédiaire S2 = ActiveCell.Value 'Boucle de calcul du travail pendant la période intermédiaire For CS = S1 To S2 Step 1 ' Positionnement de valeurs dans Calculs quant-m INTERMEDIAIRES pour calcul (suite ... !) Cells(23, 8).Select ' Cellule H23 à initialiser avec le numero de semaine ActiveCell.Value = CS ' Ajout de la valeur dans SommeTRA Cells(24, 8).Select ' Cellule H24 contient le nb de jour travaillé dans la semaine intermédiaire CS SommeTRA = SommeTRA + ActiveCell.Value Next CS ' La somme a été faite par UOE/Ressource => division par le nombre d'activités communes au couple UOE/Ress Cells(27, 8).Select ' Cellule H27 contient la valeur cherchée diviseur = ActiveCell.Value SommeTRA = SommeTRA / diviseur ' SommeTRA contient le nombre de jours travaillés 'Initialisation du tableau mensuel avec ce resultat Sheets("Suivi mensuel INTERMEDIAIRE").Select Cells(L + CL, C + CC).Select ActiveCell.Value = SommeTRA Next CL Next CC '################################################################################### ' Calcul du suivi mensuel pour les RESSOURCES ' ' Visibilité Sheets("Calculs quant-m INTERMEDIAIRES").Visible = True ' Effacement des données précédentes : DESACTIVEES car étendue calculs paramétrée ' Sheets("Ressources mensuel (J)").Select ' Range("C3:IV203").Select ' Selection.ClearContents ' Récupération de valeurs pour traitement ' NbRS=nombre de ressources : déjà calculé ci-dessus ' Récupération de l'intervalle des mois à traiter Sheets("Calculs quant-m INTERMEDIAIRES").Select finMois = Range("G3").Value debutMois = Range("F3").Value ' Le nombre de lignes à parcourir est NbRS*2 (RAF + CONSO) NbL = NbRS * 2 CRS = 3 ' Compteur de ligne ressource C = 2 ' indice de la première colonne -1 ("B") L = 2 ' indice de la première ligne -1 ' Boucle générale par MOIS For CC = debutMois To finMois Step 1 ' Mois Sheets("Ressources mensuel (J)").Select Cells(1, C + CC).Select ' Cellule contenant le mois calculé pour tous les couples Mois = ActiveCell.Value ' Positionnement de valeurs dans Calculs quant-m INTERMEDIAIRES pour calcul Sheets("Calculs quant-m INTERMEDIAIRES").Select Cells(1, 2).Select ' Cellule B1 à initialiser avec le mois en cours ActiveCell.Value = Mois ' Boucle interne par ligne TypeDonnee = "CONSO" CRS = 3 ' Compteur de ligne ressource For CL = 1 To NbL Step 1 ' Récupération de la ressource actuelle Sheets("Ressources mensuel (J)").Select Cells(CRS, 1).Select ' Cellule contenant le nom de la ressource NomRes = ActiveCell.Value ' changement du type : RAF, CONSO, RAF, etc. If TypeDonnee = "CONSO" Then TypeDonnee = "RAF" Else TypeDonnee = "CONSO" CRS = CRS + 2 End If ' Positionnement de valeurs dans Calculs quant-m INTERMEDIAIRES pour calcul (suite) Sheets("Calculs quant-m INTERMEDIAIRES").Select Cells(7, 9).Select ' Cellule I7 à initialiser avec le nom de la ressource ActiveCell.Value = NomRes Cells(8, 9).Select ' Cellule I8 à initialiser avec le type de valeur (CONSO ou RAF) ActiveCell.Value = TypeDonnee ' Somme mensuelle travaillee Cells(18, 9).Select ' Cellule I18 contient le nb de jour First+Last SommeTRA = ActiveCell.Value ' Semaines intermédiaires Cells(22, 2).Select ' Cellule B22 contient le numéro de la première semaine intermédiaire S1 = ActiveCell.Value Cells(23, 2).Select ' Cellule B23 contient le numéro de la dernière semaine intermédiaire S2 = ActiveCell.Value 'Boucle de calcul du travail pendant la période intermédiaire For CS = S1 To S2 Step 1 ' Positionnement de valeurs dans Calculs quant-m INTERMEDIAIRES pour calcul (suite ... !) Cells(23, 9).Select ' Cellule I23 à initialiser avec le numero de semaine ActiveCell.Value = CS ' Ajout de la valeur dans SommeTRA Cells(24, 9).Select ' Cellule I24 contient le nb de jour travaillé dans la semaine intermédiaire CS SommeTRA = SommeTRA + ActiveCell.Value Next CS ' SommeTRA contient le nombre de jours travaillés 'Initialisation du tableau mensuel avec ce resultat Sheets("Ressources mensuel (J)").Select Cells(L + CL, C + CC).Select ActiveCell.Value = SommeTRA Next CL Next CC '################################################################################### ' Calcul du UO mensuel (J) ' ' Effacement des données précédentes : DESACTIVEES car étendue calculs paramétrée ' Sheets("UO mensuel (J)").Select ' Range("C3:IV203").Select ' Selection.ClearContents ' Récupération de valeurs pour traitement ' NbRS=nombre de ressources : déjà calculé ci-dessus ' Récupération de l'intervalle des mois à traiter Sheets("Calculs quant-m INTERMEDIAIRES").Select finMois = Range("G3").Value debutMois = Range("F3").Value ' Le nombre de lignes à parcourir est NbRS*2 (RAF + CONSO) NbL = NbUO * 2 CRS = 3 ' Compteur de ligne UOE C = 2 ' indice de la première colonne -1 ("B") L = 2 ' indice de la première ligne -1 ' Boucle générale par MOIS For CC = debutMois To finMois Step 1 ' Mois Sheets("UO mensuel (J)").Select Cells(1, C + CC).Select ' Cellule contenant le mois calculé pour tous les couples Mois = ActiveCell.Value ' Positionnement de valeurs dans Calculs quant-m INTERMEDIAIRES pour calcul Sheets("Calculs quant-m INTERMEDIAIRES").Select Cells(27, 4).Select ' Cellule D27 à initialiser avec le mois en cours ActiveCell.Value = Mois ' Boucle interne par ligne TypeDonnee = "CONSO" CRS = 3 ' Compteur de ligne ressource For CL = 1 To NbL Step 1 ' Récupération de l'UOE actuel Sheets("UO mensuel (J)").Select Cells(CRS, 1).Select ' Cellule contenant le nom de l'UOE NomUOE = ActiveCell.Value ' changement du type : RAF, CONSO, RAF, etc. If TypeDonnee = "CONSO" Then TypeDonnee = "RAF" Else TypeDonnee = "CONSO" CRS = CRS + 2 End If ' Positionnement de valeurs dans Calculs quant-m INTERMEDIAIRES pour calcul (suite) Sheets("Calculs quant-m INTERMEDIAIRES").Select Cells(28, 4).Select ' Cellule D28 à initialiser avec le nom de l'UOE ActiveCell.Value = NomUOE Cells(29, 4).Select ' Cellule D29 à initialiser avec le type de valeur (CONSO ou RAF) ActiveCell.Value = TypeDonnee ' Somme mensuelle travaillee Cells(30, 4).Select ' Cellule D30 contient le résultat Resultat = ActiveCell.Value 'Initialisation du tableau mensuel avec ce resultat Sheets("UO mensuel (J)").Select Cells(L + CL, C + CC).Select ActiveCell.Value = Resultat Next CL Next CC '################################################################################### ' Calcul du UO mensuel (E) ' ' Effacement des données précédentes : DESACTIVEES car étendue calculs paramétrée ' Sheets("UO mensuel (E)").Select ' Range("C3:IV203").Select ' Selection.ClearContents ' Récupération de valeurs pour traitement ' NbRS=nombre de ressources : déjà calculé ci-dessus ' Récupération de l'intervalle des mois à traiter Sheets("Calculs quant-m INTERMEDIAIRES").Select finMois = Range("G3").Value debutMois = Range("F3").Value ' Le nombre de lignes à parcourir est NbRS*2 (RAF + CONSO) NbL = NbUO * 2 CRS = 3 ' Compteur de ligne UOE C = 2 ' indice de la première colonne -1 ("B") L = 2 ' indice de la première ligne -1 ' Boucle générale par MOIS For CC = debutMois To finMois Step 1 ' Mois Sheets("UO mensuel (E)").Select Cells(1, C + CC).Select ' Cellule contenant le mois calculé pour tous les couples Mois = ActiveCell.Value ' Positionnement de valeurs dans Calculs quant-m INTERMEDIAIRES pour calcul Sheets("Calculs quant-m INTERMEDIAIRES").Select Cells(32, 4).Select ' Cellule D32 à initialiser avec le mois en cours ActiveCell.Value = Mois ' Boucle interne par ligne TypeDonnee = "CONSO" CRS = 3 ' Compteur de ligne ressource For CL = 1 To NbL Step 1 ' Récupération de l'UOE actuel Sheets("UO mensuel (E)").Select Cells(CRS, 1).Select ' Cellule contenant le nom de l'UOE NomUOE = ActiveCell.Value ' changement du type : RAF, CONSO, RAF, etc. If TypeDonnee = "CONSO" Then TypeDonnee = "RAF" Else TypeDonnee = "CONSO" CRS = CRS + 2 End If ' Positionnement de valeurs dans Calculs quant-m INTERMEDIAIRES pour calcul (suite) Sheets("Calculs quant-m INTERMEDIAIRES").Select Cells(33, 4).Select ' Cellule D33 à initialiser avec le nom de l'UOE ActiveCell.Value = NomUOE Cells(34, 4).Select ' Cellule D34 à initialiser avec le type de valeur (CONSO ou RAF) ActiveCell.Value = TypeDonnee ' Somme mensuelle travaillee Cells(35, 4).Select ' Cellule D35 contient le résultat Resultat = ActiveCell.Value 'Initialisation du tableau mensuel avec ce resultat Sheets("UO mensuel (E)").Select Cells(L + CL, C + CC).Select ActiveCell.Value = Resultat Next CL Next CC '################################################################################### ' Calcul du Suivi mensuel INTERMEDIAIRE (E) ' ' Effacement des données précédentes : DESACTIVEES car étendue calculs paramétrée Sheets("Suivi mensuel INTERMEDIAIRE (E)").Visible = True ' Sheets("Suivi mensuel INTERMEDIAIRE (E)").Select ' Range("C2:IV203").Select ' Selection.ClearContents ' Recuperation de la zone de la feuille "Suivi mensuel INTERMEDIAIRE" à balayer Sheets("Calculs quant-m INTERMEDIAIRES").Select ' Récupération du nombre de ligne à balayer NbL = Range("G2").Value ' Récupération de l'intervalle des mois à traiter finMois = Range("G3").Value debutMois = Range("F3").Value C = 2 ' indice de la première colonne -1 ("B") L = 1 ' indice de la première ligne (contient le mois) ' Boucle générale par MOIS For CC = debutMois To finMois Step 1 For CL = 1 To NbL Step 1 ' Récupération de la valeur équivalente en Suivi mensuel INTERMEDIAIRE Sheets("Suivi mensuel INTERMEDIAIRE").Select Cells(L + CL, C + CC).Select valeurEquiv = ActiveCell.Value ' Récupération de la ressource_type actuel Sheets("Suivi mensuel INTERMEDIAIRE (E)").Select Cells(L + CL, 2).Select NomRSType = ActiveCell.Value ' Positionnement de valeurs dans Calculs quant-m INTERMEDIAIRES pour calcul (suite) Sheets("Calculs quant-m INTERMEDIAIRES").Select Cells(27, 6).Select ' Cellule F27 à initialiser avec la ressource_type ActiveCell.Value = NomRSType ' Resultat TMP Cells(28, 6).Select ' Cellule F28 contient le résultat temporaire ResultatTMP = ActiveCell.Value Resultat = ResultatTMP * valeurEquiv ' SommeTRA contient le nombre de jours travaillés 'Initialisation du tableau mensuel avec ce resultat Sheets("Suivi mensuel INTERMEDIAIRE (E)").Select Cells(L + CL, C + CC).Select ActiveCell.Value = Resultat Next CL Next CC ' Finalisation Sheets("Suivi mensuel INTERMEDIAIRE").Visible = False Sheets("Calculs quant-m INTERMEDIAIRES").Visible = False Sheets("Suivi mensuel INTERMEDIAIRE (E)").Visible = False ' Finalisation générale Sheets("Ind. ACT").Select Application.CutCopyMode = False Range("A1").Select Sheets("Ind. UO").Select Application.CutCopyMode = False Range("A1").Select Sheets("Saisies").Select Range("A1").Select ' Rétablissement à gauche des onglets ActiveWindow.ScrollWorkbookTabs Position:=xlFirst ' Rétablissement de l'application Application.WindowState = xlNormal ' ActiveWindow.WindowState = xlMaximized End Sub
Function DejaOuvert(CheminComplet$) As Boolean Dim Wbk As Workbook On Error Resume Next Set Wbk = Workbooks(Dir$(CheminComplet)) DejaOuvert = Err = 0 Err.Clear End Function Sub traiterCongésCollaborateurs() ' ' Macro principale de mise à jour du fichier plan de charge ' Nombre de collaborateurs max = 1000 (tabOnglets) ' Fichier cible : A2 est numérique sans décimale (n° de colonne/ligne TMP) ' A1 est date jj/mm/aaaa (implicite) '######################################################## ' Déclaration des variables '######################################################## Dim cheminFichier$, wbSource As Workbook, wbCible As Workbook, ongletDepart As Worksheet nombreConges = 0 Dim i As Integer Dim TopPos As Integer Dim PrintDlg As DialogSheet Dim Choix1, Choix2 Dim tabOnglets(1000) As String '######################################################## ' Sauvegarde du contexte '######################################################## Set wbSource = ActiveWorkbook Set ongletDepart = wbSource.ActiveSheet '######################################################## ' Controle preliminaire : nom de l'onglet courant '######################################################## If (Len(ongletDepart.Name) <> 3) Then MsgBox "ERREUR : l'onglet courant ne concerne pas un collaborateur, aucune action effectuée !" Exit Sub End If '######################################################## ' Boite de dialogue pour choix étendue action : coll. courant ou tous ? '######################################################## Application.ScreenUpdating = False ' Ajoute une feuille de dialogue temporaire Set PrintDlg = ActiveWorkbook.DialogSheets.Add ' Définition des boutons radio Choix1 = "du collaborateur " & ongletDepart.Name & " seulement" Choix2 = "de tous les collaborateurs" ArrChoix = Array("", Choix1, Choix2) TopPos = 40 For i = 1 To 2 PrintDlg.OptionButtons.Add 78, TopPos, 150, 16.5 PrintDlg.OptionButtons(i).Text = ArrChoix(i) TopPos = TopPos + 13 Next i PrintDlg.OptionButtons(1).Value = xlOn ' Positionne les boutons OK et Annuler PrintDlg.Buttons.Left = 240 ' Dimensionne la hauteur, la largeur et le titre de la bte de dialogue With PrintDlg.DialogFrame .Height = Application.Max _ (68, PrintDlg.DialogFrame.Top + TopPos - 34) .Width = 230 .Caption = "Choisissez une option : traiter les congés " End With ' Change l'ordre de tabulation des boutons OK et Annuler ' afin de donner le focus au premier bouton d'option PrintDlg.Buttons("Button 2").BringToFront PrintDlg.Buttons("Button 3").BringToFront Retour = PrintDlg.Show ' récupération du choix effectué If Retour = faux Then ' Bouton Annuler => on annule ! ' Supprime la feuille de dialogue temporaire (sans message d'avertissement) Application.DisplayAlerts = False PrintDlg.Delete Application.DisplayAlerts = True Exit Sub End If If PrintDlg.OptionButtons(1).Value = xlOn Then Choix = "unique" Else Choix = "tous" End If ' Supprime la feuille de dialogue temporaire (sans message d'avertissement) Application.DisplayAlerts = False PrintDlg.Delete Application.DisplayAlerts = True '######################################################## ' Recuperation des paramètres de l'onglet Admin '######################################################## Sheets("Admin").Select ' Récupération du chemin du fichier cible cheminFichier = Cells(1, 2).Value 'B1 ' Récupération du typage des congés validés par l'Administration typeCongeRH = Cells(2, 2).Value 'B2 ' On se repositionne en cas de sortie brutale... wbSource.Sheets(ongletDepart.Name).Select '######################################################## ' Creation de la liste des collaborateurs à traiter '######################################################## nbOnglets = 0 If Choix = "unique" Then nbOnglets = 1 tabOnglets(0) = ongletDepart.Name Else nbOnglets = 0 For Each Sht In ActiveWorkbook.Worksheets '######################################################## ' Controle preliminaire : nom de l'onglet courant '######################################################## If (Len(Sht.Name) = 3) Then tabOnglets(nbOnglets) = Sht.Name nbOnglets = nbOnglets + 1 End If Next Sht End If '######################################################## ' Ouverture du fichier cible en écriture et récupération colonne collaborateur '######################################################## 'Existe t'il ? If Dir(cheminFichier) = "" Then MsgBox "ERREUR : le fichier " & cheminFichier & " est introuvable!" Exit Sub End If ' Protection fichier déjà ouvert If DejaOuvert(cheminFichier) Then MsgBox ("Avertissement : le " & cheminFichier & " est déjà ouvert : mise à jour non effectuée") Exit Sub End If 'Ouverture autorisée... Workbooks.Open cheminFichier Set wbCible = Workbooks(Dir$(cheminFichier)) '-------------------------------------------------------- ' Action validée : les sorties doivent être maîtrisées ' => compte-rendu '-------------------------------------------------------- CR = "Compte-rendu" & Chr(13) '######################################################## ' Boucle par collaborateur à traiter '######################################################## For i = 0 To (nbOnglets - 1) Step 1 ' Initialisation de nombre de congés traités nombreConges = 0 plurielConges = "" ' On se positionne sue l'onglet cible wbCible.Activate wbCible.Sheets("Plan de charge").Select ' Récupération colonne collaborateur ' Il faut passer par une cellule temporaire... colonneCibleCollaborateur = "=MATCH(""" & tabOnglets(i) & """,2:2,0)" Range("B1").Value = colonneCibleCollaborateur colonneCibleCollaborateur = Range("B1").Value Range("B1").Value = "" If IsNumeric(colonneCibleCollaborateur) Then Else CR = CR & Chr(13) & tabOnglets(i) & " : ERREUR, le collaborateur n'a pas été trouvé dans " & cheminFichier & " => 0 congé traité" GoTo pasDeTraitement End If '######################################################## ' Introduction au traitement '######################################################## ' pour être valide, la ligne doit contenir les dates de début et de fin de congés ' pour assurer la compatibilité avec le fichier Plan de Charge, les dates doivent être des jours ouvrés continuerTraitement = "oui" colonneSourceCongeCourantDebut = 1 'Colonne A par défaut colonneSourceCongeCourantFin = 2 'Colonne B par défaut ligneSourceCongeCourant = 11 'Ligne 11 par défaut ' Initialisation traitement wbSource.Activate wbSource.Sheets(tabOnglets(i)).Select dateDebut = Cells(ligneSourceCongeCourant, colonneSourceCongeCourantDebut).Value dateFin = Cells(ligneSourceCongeCourant, colonneSourceCongeCourantFin).Value If dateDebut = "" And dateFin = "" Then continuerTraitement = "non" End If '######################################################## ' Boucle '######################################################## Do While continuerTraitement = "oui" '######################################################## ' Contrôle des donnees pour valider le traitement '######################################################## ligneATraiter = "oui" ' Controle sur les dates du fichier source If dateDebut = "" Or dateFin = "" Then CR = CR & Chr(13) & tabOnglets(i) & " : Avertissement, la ligne de congés n°" & ligneSourceCongeCourant & " contient une date vide => ligne non traitée" ligneATraiter = "non" Else If dateDebut > dateFin Then CR = CR & Chr(13) & tabOnglets(i) & " : Avertissement, la ligne de congés n°" & ligneSourceCongeCourant & " contient des dates inversées => ligne non traitée" ligneATraiter = "non" End If End If ' Controle sur les dates du fichier cible ' On travaille sur le fichier cible wbCible.Activate wbCible.Sheets("Plan de charge").Select ' Recherche de la ligne de début de congés ' Il faut passer par 1 cellule temporaire à deux reprises... Range("A1").Value = dateDebut ligneCibleDebutConges = "=MATCH(A1" & ",B:B,0)" Range("A2").Value = ligneCibleDebutConges ligneCibleDebutConges = Range("A2").Value Range("A1").Value = "Colorisation de la sélection" Range("A2").Value = "" If IsNumeric(ligneCibleDebutConges) Then Else CR = CR & Chr(13) & tabOnglets(i) & " : ERREUR, la date de début " & dateDebut & " n'a pas été trouvée dans " & cheminFichier ligneATraiter = "non" End If ' Recherche de la ligne de fin de congés ' Il faut passer par 1 cellule temporaire à deux reprises... Range("A1").Value = dateFin ligneCibleFinConges = "=MATCH(A1" & ",B:B,0)" Range("A2").Value = ligneCibleFinConges ligneCibleFinConges = Range("A2").Value Range("A1").Value = "Colorisation de la sélection" Range("A2").Value = "" If IsNumeric(ligneCibleFinConges) Then Else CR = CR & Chr(13) & tabOnglets(i) & " : ERREUR, la date de fin " & dateFin & " n'a pas été trouvée dans " & cheminFichier ligneATraiter = "non" End If '######################################################## ' Traitement pur de la macro '######################################################## If ligneATraiter = "oui" Then nombreConges = nombreConges + 1 If nombreConges > 1 Then plurielConges = "s" End If ' Boucle sur le congé courant For compteurC = ligneCibleDebutConges To ligneCibleFinConges Step 1 If Cells(compteurC, colonneCibleCollaborateur).Value <> "Férié" Then Cells(compteurC, colonneCibleCollaborateur).Value = typeCongeRH End If Next compteurC End If '######################################################## ' D'autres congés pour ce collaborateur ? '######################################################## wbSource.Activate wbSource.Sheets(tabOnglets(i)).Select ligneSourceCongeCourant = ligneSourceCongeCourant + 1 dateDebut = Cells(ligneSourceCongeCourant, colonneSourceCongeCourantDebut).Value dateFin = Cells(ligneSourceCongeCourant, colonneSourceCongeCourantFin).Value If dateDebut = "" And dateFin = "" Then continuerTraitement = "non" End If Loop CR = CR & Chr(13) & tabOnglets(i) & " => " & nombreConges & " congé" & plurielConges & " traité" & plurielConges pasDeTraitement: Next i '######################################################## ' Sauvegarde et fermeture du fichier cible '######################################################## wbCible.Save wbCible.Close '######################################################## ' Restauration du contexte '######################################################## wbSource.Activate wbSource.Sheets(ongletDepart.Name).Select '######################################################## ' Compte-Rendu du traitement '######################################################## MsgBox (CR) End Sub
|
| Copyright © 1998-2026 www.Fabrice.info | > Top | >> Home | |