>> Home

Programmation Excel

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

Exemple 1 : compterTests Top
Sub compterTests()

'
' 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 + q pour l'exécuter
'
' 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

Exemple 2 : relanceCats Top
Sub auto_open()
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

Exemple 3 : TdB Top
Sub TdB()
'
' 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
Top

Exemple 4 : traiterCongésCollaborateurs Top

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
Top

Copyright © 1998-2012 www.Fabrice.info   >> Home