Offset avec VBA

Je vous comprends peut être que je m'explique mal.

Le même fichier peut être utiliser pour le roulement que je veux , enfin je pense..

Alors si j'initialise le mois avec un roulement à 6, j'ai la feuille des quarts par équipe qui s'affiche avec un roulement à 6, si je mets le nom des agents pour les 6 équipes , pour générer le tableau de quart par agent ça envoie un bogue.

Pour les autres roulement avec 3, 4 équipes ça marche bien.

Je vais essayer de lire le code moi même peut être que je trouverai le bogue...

Je vois qu'on se comprends pas du tout!

C'est le même fichier , selon le roulement que je veux implémenter je l'adopte seulement. Demain matin je vous enverai les screenshot!

Je ne sais pas comment expliquer

Je vous ai compris...

ci-joint le fichier reel avec le bogue :

code erreur 9, ligne en jaune si je clique sur debogage :

Do While Teq(m + 1, 0) <> ""

Ci-joint le fichier en question.

Merci de me voir ou se situe le probleme s'il vous plait?

C'est pas de la gestion que tu fais ! C'est du patchwork !

Les gens que tu gères ne sont pas sur plusieurs régimes simultanément, à un moment donné ils n'en ont qu'un, et dans 10 ans on doit retrouver quel régime ils avaient 10 ans plus tôt !

Si tu fais des choses pour les effacer puis en faire d'autres, tu t'amuses !

Au passage, la logique de succession des position, ce n'est pas 1, 2, 3... c'est : 3, 2, 1, 0, -1, -2

C'est pas de la gestion que tu fais ! C'est du patchwork !

Les gens que tu gères ne sont pas sur plusieurs régimes simultanément, à un moment donné ils n'en ont qu'un, et dans 10 ans on doit retrouver quel régime ils avaient 10 ans plus tôt !

Si tu fais des choses pour les effacer puis en faire d'autres, tu t'amuses !

Au passage, la logique de succession des position, ce n'est pas 1, 2, 3... c'est : 3, 2, 1, 0, -1, -2

Je m'en excuse !

C'est juste que je suis sous pression actuellement !!!...

Je vous promets d'y mettre de l'ordre après la première implémentation...

S'il vous plait voudriez vous m'indiquer ou se trouve le problème et comment solutionner ?

Merci !

Ça attendra demain, quand j'aurais dormi (et il est 4h40 chez moi)...

Ça attendra demain, quand j'aurais dormi (et il est 4h40 chez moi)...

Bien reçu. Merci

Bonjour,

J'aimerais bien que tu cesses de toucher à la mise en forme (hauteur de ligne) d'une façon qui rend l'affichage défectueux... ! C'est très désagréable, ça me met de mauvaise humeur, et ça m'oblige à refaire la mise en forme car je ne travaille pas sur un fichier qui me heurte la vue !

C'est pas sorcier de ne rien toucher une fois réglé comme il convient.

Hello MFerrand,

je crois que notre ami stoure devrait d'abord apprendre un minimum de rigueur, cela me rappelle ceci https://forum.excel-pratique.com/viewtopic.php?f=2&t=104281 ... au fil des propositions les données changent parfois de place ou d'orthographe ...

bon on va y arriver

Salut Steelson !

Ça s'agite un peu dans tous les sens...

Stoure : tu aurais suivi mes premiers conseils en matière de recherche d'erreurs, tu aurais pu déceler une variable ayant une valeur anormale, et arriver très vite à la source du problème !

Au lieu de me les faire recalculer ! (car toi, tu n'avais qu'à les lire, moi, il a fallu que je les calcule... pour trouver sans lancer la macro ! )

Bonjour Mr MFerrand et Mr Steelson,

Je suis désolé des perturbations...

Il y'a l'âge qui joue , je suis beaucoup plus jeûne, et je suis nouveau avec les macros, base de données sous Excel..

Je demande votre tolérance et clemence en cas de faut pas... J'aime apprendre de vos expériences.

Par ailleurs mon service a plusieurs unité de roulement indépendante et chaque unité à ses spécificités, nombre d'équipe, nombre d'agent par équipe et d'autres choses privées à ajouter...

L'orthographe, c'est pas normal je sais mais je suis sur mon phone la plus part des post...

J'essayerai de faire mieux prochainement..

Merci !

Salut Steelson !

Ça s'agite un peu dans tous les sens...

Stoure : tu aurais suivi mes premiers conseils en matière de recherche d'erreurs, tu aurais pu déceler une variable ayant une valeur anormale, et arriver très vite à la source du problème !

Au lieu de me les faire recalculer ! (car toi, tu n'avais qu'à les lire, moi, il a fallu que je les calcule... pour trouver sans lancer la macro ! )

Bonsoir le grand MFerrand,

Fichier bien reçu, j'ai ouvert et je vois que ça marche ..

J'ai exécuté..

Merci infiniment, je suis sauvé une fois de plus..

L'implémentation s'est bien déroulée et je finis demain. Il reste le seul tableau du roulement à 6 que je dois régler..

Je vous enverrai en inbox quelques exemplaires de Tableau de service, vous allez voir comment c'est difficile d' implémenter...

Merci et bonne nuit !!!!

Ok mais :

Par ailleurs mon service a plusieurs unité de roulement indépendante et chaque unité à ses spécificités, nombre d'équipe, nombre d'agent par équipe et d'autres choses privées à ajouter...

Ça implique que tu traites chacune à part ! Au niveau opérationnel, un classeur ne peut concerner qu'une seule de tes unités spécifiques, sans quoi tu vas au devant d'un beau mélange...

Cordialement.

J'ai honte de le reconnaître c'est ça que je fais.

Car c'est gérer en mono poste sans possibilité de réseau... Deux, chaque unique à ses équipes à part qui tournent selon ses spécificités sans aucune relation opérationnel avec l'autre...

Donc, je prend chaque unité individuellement ie son nombre d'équipe, ses 1 et quart du mois ensuite on mets les agents dans la feuille équipe puis je calcule les heures et générer le tableau de quart par agent..

Fatiguant mais aujourd'hui en tout cas ça a marché j'ai fait pour 6 unités sinon plus... Donc je gère le 6 et je suis pénard..

J'ai ajouté le logo de l'entreprise, revoir les antennes, mettre d'autres textes et mise en forme.. Et ça pour chaque unité (chaque équipe est spécificique)...

Fatiguant il faut reconnaître.. Ça m'a pris trois jours...

Merci car sans votre aide je ne pense pas que je pourrais même le faire..

Vous vous plaignez que y'a des nouveaux éléments ou des changements c'est lié aux unités et leurs contraintes qu'ils veulent forcément voir apparaître sur le tableau de quart...

Je vous ai trop emmerdé mais vous aurez mes copies en Mail privé (confidentiel) vous verrez pourquoi je m'embrouille souvent et je fais du "patchwork" même si je ne sais pas ce que "patchwork " veut dire..

En tout cas merci et bonne nuit !!!

Un petit boujour de ma part sur ce fil...

de même

avec le calcul (non optmisé)

Sub recalculer()

For ligne = 8 To Range("A" & Application.Rows.Count).End(xlUp).Row
    For colonne = 3 To 33
        If Cells(ligne, "A") = "Heures de nuit" And Cells(4, colonne) <> "" Then
            Cells(ligne, colonne) = nbHeures(Cells(ligne - 2, "A"), Cells(4, colonne) * 1, 2)
        ElseIf Cells(ligne, "A") = "Heures travaillées" And Cells(4, colonne) <> "" Then
            Cells(ligne, colonne) = nbHeures(Cells(ligne - 1, "A"), Cells(4, colonne) * 1, 1) + Cells(ligne + 1, colonne)
        End If
    Next
Next

End Sub
Function nbHeures(qui As String, quand As Double, code As Integer) As Variant
' code = 1 Jour, 2 Nuit

Dim l%, c%, i%, j%
nbHeures = 0

Dim durees(1 To 4, 1 To 2) As Variant
durees(1, 1) = 7 / 24
durees(2, 1) = 7 / 24
durees(3, 1) = 6 / 24
durees(4, 1) = 4 / 24
durees(1, 2) = 6 / 24
durees(2, 2) = 0 / 24
durees(3, 2) = 0 / 24
durees(4, 2) = 3 / 24
pas = Sheets("QUART PAR AGENT").Range("A1")

With Sheets("QUART PAR AGENT")
    ref = .Range("C3").Value ' date de début des quarts
    l = Int((quand - ref) / 7) * pas + 6 ' ligne de départ de la matrice = 6, pas de xx variable
    c = ((quand - ref) Mod 7) * 4 + 3 ' colonne de départ de la matrice = 3, pas de 4
    For i = l To l + pas - 4
        For j = c To c + 3 ' 4 horaires
            If .Cells(i, 2) = qui Then
                If .Cells(i, j) = "X" Then nbHeures = nbHeures + durees(j - c + 1, code)
            End If
        Next
    Next
End With

End Function

Salut mon grand Steelson,

Cette formule là c'est implémenté depuis la première fois que vous me l'avez fournis...

Quand je vous ai dit je vais utiliser votre fichier vous m'avez pas cru.

J'ai gardé ce modèle avec Mferrand car c'est le modèle actuelle dans mon service.

J'aime aussi les macros , donc je combine..

Surtout MFerrand n'a pas encore terminé et il n'aime pas le travail mal fait.. Donc il prend tout son temps..

D'ici qu'il finalise je pioche chez vous et j'implémente..

Je sais que c'est loin d'etre OK.

Mais je suis patient..

L'implémentation actuelle était urgente donc je l'ai fait avec les moyens de bord.

Mferrand est même fâché pour les modifs de débutant que j'ai apporté..

Je suis aussi désolé de l'interrompre à chaque fois que je fais de la bêtise pour qu'il me secourir

Merci et bonne journée..

Un petit boujour de ma part sur ce fil...

de même

avec le calcul (non optmisé)

Sub recalculer()

For ligne = 8 To Range("A" & Application.Rows.Count).End(xlUp).Row
    For colonne = 3 To 33
        If Cells(ligne, "A") = "Heures de nuit" And Cells(4, colonne) <> "" Then
            Cells(ligne, colonne) = nbHeures(Cells(ligne - 2, "A"), Cells(4, colonne) * 1, 2)
        ElseIf Cells(ligne, "A") = "Heures travaillées" And Cells(4, colonne) <> "" Then
            Cells(ligne, colonne) = nbHeures(Cells(ligne - 1, "A"), Cells(4, colonne) * 1, 1) + Cells(ligne + 1, colonne)
        End If
    Next
Next

End Sub
Function nbHeures(qui As String, quand As Double, code As Integer) As Variant
' code = 1 Jour, 2 Nuit

Dim l%, c%, i%, j%
nbHeures = 0

Dim durees(1 To 4, 1 To 2) As Variant
durees(1, 1) = 7 / 24
durees(2, 1) = 7 / 24
durees(3, 1) = 6 / 24
durees(4, 1) = 4 / 24
durees(1, 2) = 6 / 24
durees(2, 2) = 0 / 24
durees(3, 2) = 0 / 24
durees(4, 2) = 3 / 24
pas = Sheets("QUART PAR AGENT").Range("A1")

With Sheets("QUART PAR AGENT")
    ref = .Range("C3").Value ' date de début des quarts
    l = Int((quand - ref) / 7) * pas + 6 ' ligne de départ de la matrice = 6, pas de xx variable
    c = ((quand - ref) Mod 7) * 4 + 3 ' colonne de départ de la matrice = 3, pas de 4
    For i = l To l + pas - 4
        For j = c To c + 3 ' 4 horaires
            If .Cells(i, 2) = qui Then
                If .Cells(i, j) = "X" Then nbHeures = nbHeures + durees(j - c + 1, code)
            End If
        Next
    Next
End With

End Function

Ouf !

Je suis enfin libre donc j'ai vu que le code n'est pas le même que l'autre... Bon juste la première partie, je n'ai encore téléchargé mais on dirait que je suis libre de sommeprod avec cette bout de code..

J'avais aussi rendu les pas automatiques ie selon le nombre d'agent de la quart quart par agent...

Ce soir je vais voir un peu claire et améliorer mon code puis je vous dépose ce qui en sortirai ici...

De 3 à 33 doit aussi être revu, car des que le mois change, je ne pense c'est mis à jour..

Bon, laissez moi voir claire, puis je vous reviens..

Merci !

on dirait que je suis libre de sommeprod avec cette bout de code.

Oui, mais il faut que je prenne en compte les congés.

avec les congés

à vérifier

avec les congés

à vérifier

Bonjour le grand Steelson,

Merci pour la rise en compte des heures en macros..

Je suis sur une machine a clavier Anglophone, le mien est mort depuis un bon moment, donc clemence pour les erreurs de frappe et absence d'acents

Revenons a votre derniere upload ici :

1 . il n'y a pas les noms de agent1 a agent8 je ne vois pas pourquoi....

2. Les numeros de semaine que vous avez ajoute, c'est a base mensuelle ou annuelle ( par 40 comme 40 ieme semaine de l'annee)?

3. la feuille HEURES sera imprimes est il possible de juste enlever les heures comme pour l'ancienne feuille.

D'ici votre retour voici mes modules :

Je pense pas que Monsieur MFerrand va apprecier, il n'aime le bidouillage de code , j'espere qu'il n'en tiendra pas rigueur...

Module 1 et Module 2 viennent du grand MFerrand je n'ai pas toucher par peur de les abimer.

Module 3 pour le grand Steelson : voici ma derniere adaptation au moment de l'implementation :

J'ai juste nommee le 1er tableau de quart par agent qui est dynamique en fonction du nombre d'agents et des equipes

Num = Range("quart").Rows.Count + 4

Num2 = Range("quart").Rows.Count - 1

Function nbHeures(qui As Range, quand As Range, code As Integer) As Variant
' code = 1 Jour, 2 Nuit
Dim l%, c%, i%, j%
Dim Num As Integer
Dim Num2 As Integer
Dim durees(1 To 4, 1 To 2) As Variant
durees(1, 1) = 7 / 24
durees(2, 1) = 7 / 24
durees(3, 1) = 6 / 24
durees(4, 1) = 4 / 24
durees(1, 2) = 6 / 24
durees(2, 2) = 0 / 24
durees(3, 2) = 0 / 24
durees(4, 2) = 3 / 24
nbHeures = 0
Num = Range("quart").Rows.Count + 4
Num2 = Range("quart").Rows.Count - 1
With Sheets("QUART PAR AGENT")
    ref = .Range("C3").Value ' date de début des quarts
    l = Int((quand.Value - ref) / 7) * Num + 6 ' ligne de départ de la matrice = 6, pas de 13
    c = ((quand.Value - ref) Mod 7) * 4 + 3 ' colonne de départ de la matrice = 3, pas de 4
    For i = l To l + Num2 ' Num2 agents
        For j = c To c + 3 ' 4 horaires
            If .Cells(i, 2) = qui.Value Then
                If .Cells(i, j) = "X" Then nbHeures = nbHeures + durees(j - c + 1, code)
            End If
        Next
    Next
End With

End Function

Module 4 fournit par un autre expert d'ici, je n'ai pas garde son nom, c'est pour copier les noms des agents de la feuille QUART PAR AGENT vers la feuille HEURES avec declage, je prends juste le 1er tableau de la feuille QUART PAR AGENT pour cela

Public Sub copier()
ligc = 8
    For Each c In Range("agent")
        c.Copy Destination:=Worksheets("HEURES").Range("A" & ligc)
        ligc = ligc + 7
    Next c
Sheets("HEURES").Activate
End Sub

Module 5 : j'ai juste modifier le module4 pour pouvoir envoyer les noms des agents vers la feuille RECAP sans decalage

Public Sub CopierVersFeuilleHeures()
ligc = 6
    For Each c In Range("agent")
        c.Copy Destination:=Worksheets("RECAP").Range("A" & ligc)
        ligc = ligc + 1
    Next c
Sheets("RECAP").Activate
End Sub

En codage Excel :

  • --------Pour le calcul des heures vous avez gerer cela de l'autre cote en mixant la fonction du module 3 et la formule excel.
  • ---------Pour les RECAP des heures : Un autre expert d'ici m'a regle cela et il continue de me l'ameliorer, mais version implemente :
HTT
=DECALER(HEURES!$A$1;EQUIV($B4;HEURES!$A$1:$A$10000;0);30)

HNN

=DECALER(HEURES!$A$1;EQUIV($B4;HEURES!$A$1:$A$10000;0)+1;30)

JFHDJ

=DECALER(HEURES!$A$1;EQUIV($B4;HEURES!$A$1:$A$10000;0)+2;30)

JFHDN

=DECALER(HEURES!$A$1;EQUIV($B4;HEURES!$A$1:$A$10000;0)+3;30)

Il y'a trop d'informations confidentielles sur le fichier implemente que je vous enverai des que je recupere mes infos mais tout est la deja...

de part et d'autre sur ce forum.

Merci et A+

avec les congés

à vérifier

Apparemment ça marche mais demain je vais l'implementer.

Est il possible d'utiliser la feuille saisi du fichier quarts sur ce fichier à la place de menu principal pour le choix des roulements...

Rechercher des sujets similaires à "offset vba"