Matrice de tri aléatoire

Quelques détails sur le processus afin de te repérer sur chaque phase.

1re phase - [InitTirage] - assurée par la procédure principale, qui fait donc la préparation : détermination du mois suivant de contrôle, récupération de l'année à incrémenter, demande de confirmation à l'utilisateur, ouverture base, défiltrage éventuel et tri (indication dans la procédure de ces différentes opérations).

2e phase - [ListerUtlr] - listage des utilisateurs. Consiste en un balayage de la base de la ligne 2 à fin, sur la colonne AX où l'on détecte le passage d'un utilisateur à l'autre. Un tableau ListeU (3 colonnes, autant de lignes que d'utilisateurs+1) est monté (identifiant, lignes début et fin de l'utilisateur dans la base.

[NB- tous les tableaux sont de base 0, les "colonnes" constituent la première dimension, les "lignes" la seconde (c'est pas l'usage, mais c'est pour rester dans le sens des tableaux Excel sur lesquels on travaille, les "lignes" sont variables et dans un tableau dynamique on ne peut faire varier que le 2e dimension en cours d'utilisation). Au demeurant, les tableaux n'ont pas d'orientation préfixée (on les représente comme on veut), c'est l'ordre des dimensions qui importe.]

En ce qui concerne les "lignes" (2e dimension), je n'utilise pas la "ligne" 0 pour les données, mais pour mémoriser des éléments utiles à conserver : ListeU(0,0) accueille le nombre d'utilisateurs identifiés, qui pourra ainsi être accessible par toute autre procédure qui en a besoin.

La procédure principale, avant de lancer la 3e phase, dimensionne le tableau (final) ListeDT(9 "colonnes" pour les données à recueillir par dossier+1 pour identifier l'utilisateur, 2 "lignes" par utilisateur(=2 dossiers)+1).

3e phase - Les phases 3 à 6 sont répétées en boucle pour chaque utilisateur. La phase 3 consiste à récupérer les indicatifs des dossiers traités par un utilisateur [ListerDTraitUtlr].

Elle recherche le nom de l'utilisateur dans chacun des 11 mois précédents et chaîne les indicatifs des dossiers correspondants dans une variable.

4e phase - [ListerDossUtlr] - Listage des dossiers de l'utilisateur figurant dans la base. Utilise le positionnement enregistré dans ListeU pour accéder directement à l'utilisateur. Les dossiers sont listés dans un tableau ListeDU où l'on enregistre également la ligne sur laquelle il figure dans la base.

5e phase - [EpurerDossUtlr] - Elimination du tableau dossiers, des dossiers contrôlés au cours des 11 mois précédents. On passe la liste de dossiers traités en revue (en partant de la fin ! ) en vérifiant si l'indicatif figure dans la chaîne de dossiers traités. Pour chaque dossier déjà traité, on l'élimine en remontant tous les suivants d'un cran et en supprimant une "ligne" du tableau.

Le nombre de dossiers de l'utilisateur sur lesquels tirer est consigné dans l'élément ListeDU(0,0).

6e phase - [TirageDossUtlr] - On en arrive au tirage par utilisateur ! Méthode utilisée, que j'appellerais "string", empruntée à Galopin (salut !), que j'ai conservée car elle s'avère très efficace dans de nombreux cas.

On dispose des dossiers listés dans un tableau dont on connait dont on connait le nombre et on va utiliser les indices "lignes" du tableau pour le tirage. On constitue une chaîne de caractères successifs qui vont remplacer ces indices pour le tirage. Les caractères sont pris dans la table Unicode (pour avoir une marge suffisante pour le nombre de caractères à utiliser) à partir du caractères 33 (les 31 premiers étant des caractères spéciaux et le 32 l'espace, qui pourraient donc poser problème).

Cette première chaîne étant constituée, on opère un tirage de tous ses éléments pour en constituer une seconde : cela revient à mélanger les dossiers à tirer.

On fait le tirage définitif : 2 caractères, sur la seconde chaîne. A partir des caractères, on retrouve les indices correspondans du tableau et à partir des indices on retrouve les dossiers (dont on transfère les indicatifs dans le tableau final (en y adjoignant l'identifiant utilisateur pour le premier dossier tiré, on ne le mentionne pas pour le second dossier (plus précisément on l'efface, pour avoir une correspondance avec la matrice où l'emplacement utilisateur est une cellule fusionnée).

Dans le tableau ListeU, on remplace la notation des lignes début et fin par les lignes occupées par les 2 dossiers tirés (dans l'ordre).

Il me semble que tu as réagi. Je vais donc aux nouvelles avant de terminer.

Les phases 3 à 6 ont été répétées pour chaque utilisateur. A partir de la 7e phase on reprend un traitement global.

7e phase - [DonnéesDT] - Elle consiste à compléter le tableau ListeDT en y ajoutant pour chaque dossier les éléments à répecuter dans le classeur de contrôle. On utilise une variable tableau des colonnes où se trouvent les éléments à recueillir, et on dispose de la ligne où se trouve chaque dossier tiré...

La proc. principale procède à la fermeture de la base à l'issue de cette phase, sans l'enregistrer (ce qui la maintient dans l'état qu'elle avait antérieurement).

8e phase - [PlanCtrlDU] - Elle consiste à servir la matrice à partir du tableau ListeDT. L'identifiant utilisateur et les indicatifs dossiers figurent dans l'ordre requis dans le tableau ListeDT. On complète en affectant le contrôle du premier dossier tiré au SU2 ou au SU1, alternativement (en vérifiant que l'utilisateur concerné n'est pas le SU2 lors d'une affectation de contrôle à ce dernier, si c'est le cas le SU1 y est substitué). L'équilibre entre les deux est conservé, selon les cas, il y aura égalité, ou +1 ou +2 pour le SU2 compte tenu du dossier en auto-contrôle.

9e phase - [InitClasseurCtrl] - Initialisation des classeurs de contrôle. Les classeurs sont ouverts tour à tour, et les données recueillies dans le tableau ListeDT y sont transférées. L'identification se fait sur la matrice (l'ordre est le même que dans le tableau, mais y figurent les contrôleurs qui ne sont pas dans le tableau). En 3 temps : -ouverture du SU1 : balayage toutes les 2 lignes (lignes contrôle externe), si SU1 les données sont affectées, fermeture classeur en fin ; -ouverture du SU2 : même opération sur les mêmes lignes ; -balayage autres lignes, toutes les 2 lignes (lignes Auto), ouverture classeur utilisateur, affectation des données. fermeture avant de passer à la ligne suivante.

Les variables sont réinitialisées par la procédure principale, l'opération est terminée.

Ouf ! Bye. Bonne journée.

Bonjour MFerrand,

Désolé de ne revenir vers toi que maintenant, mais j'ai dû m'absenter urgemment quelques jours et de manière imprévue (il y a des périodes comme ça )

Je suis maintenant de retour, et en train d'étudier ta solution à l'aide de tes explications détaillées.

Je reviens vers toi avec les premières questions.

Bonjour MFerrand,

J'ai implémenter ta solution dans l'environnement de travail, et WAOWWW ! Cela fonctionne Tip Top.

Comme tu me l'avais proposé, j'ai testé ta solution dans les fichiers utilisateurs sans mot de passe, cependant je suis obligé d'avoir cette protection.

J'ai donc créé une table qui répertorie les différents mot de passe en fonction des nom de fichiers tu la trouve ici

10mferrand.xlsm (22.27 Ko)

sous le premier onglet, le deuxième t'étant dévolu...

Je suppose que la variable va se retrouver dans cette partie de la macro InitClasseurCtrl,

For i = 2 To ListeU(0, 0) * 2 Step 2
            wbCtrl = .Cells(i, k - 2).Value & ".xlsm"
            Workbooks.Open ThisWorkbook.Path & "\" & wbCtrl
            Set wsCtrl = ActiveWorkbook.Worksheets(1)
            n = wsCtrl.Range("I" & wsCtrl.Rows.Count).End(xlUp).Row + 1
            For j = 1 To 9
                wsCtrl.Cells(n, j + 8).Value = ListeDT(j, i)
            Next j
            Workbooks(wbCtrl).Close True
        Next i

mais même si je sais l'exprimer en français: si la variable wbCtrl = AA_JMP_TYEHZ.xslm; Password = STMwNNjN je ne vois pas comment l'exprimer en VBA car le i 2 Step 2 se fait sur le tableau ListU et moi j'aimerai faire un i sur l'onglet "contrôle" du fichier que je t'ai annexé.

Tu avais laissé entendre que cela serait simple, mais nous n'avons certainement pas la même notion de la simplicité

A bientôt

Salut,

Cela devrait être dans ce coin en effet !

Si je lis bien le code que tu reproduis, la feuille à débloquer est affectée à une variable objet, ça simplifiera (le code seulement, l'action est la même).

C'est simple en ce sens qu'il faut juste récupérer le mot de passe dans une variable, ensuite Déprotéger, aucun problème. Par contre, reprotéger, il faut réactiver les paramètres de protection. Si là la feuille n'est pas protégée, il faut me communiquer ces paramètres.

Bonne soirée.

Salut,

Pour répondre à ta question, une fois le classeur ouvert avec la variable Password, il n'y a pas besoin de le reprotéger puisque cela se fait automatiquement à la fermeture du classeur.

En ce qui concerne le bout de code que j'ai mis dans mon dernier post, c'est une partie du tien où tu ouvres les différents fichiers d'utilisateurs l'un après l'autre en fonction de la valeur d'une cellule du tableau List(U). C'est donc dans cette partie que l'on devrait pouvoir intégrer la variable Password.

Deuxième question, j'ai regardé attentivement (et je me rencontre qu'il y a encore du boulot pour avoir cette maîtrise ) ta macro, et je voulais savoir (je l'avais laissé entendre dans la première donnée du problème) s'il était possible (facilement donc sans devoir réécrire toute la procédure) de changer la répartition des dossiers. Je m'explique, si je décide ultérieurement que ce n'est plus 2 dossiers à contrôler par mois, mais 3 dossiers sur la base de 1 contrôle SU1, 1 contrôle SU2 et 1 autocontrôle ou alors toujours 2 dossiers par mois, mais avec une proportion d'autocontrôle différents (par exemple sur ton tableau "Plan de contrôle mensuel des dossiers" dans les colonnes "Contrôleur" nos n'aurions plus la séquence SU1; Auto; Su2; Auto; Su1; Auto; Su2;... mais SU1; Auto; SU2; Auto; SU1; SU2; SU1; Auto (on remplace le 3ème "Auto" par un SuperUtilisateur SU1/SU2.

En d'autres termes, est-ce qu'il simple et concevable de pouvoir varier les paramètres de répartition.

Merci pour tes réponses.

On va d'abord s'occuper des mots de passe... Tu signalais que tu avais établis une table : s'il s'agit d'une table "classique", une colonne Nom utilisateur, une colonne Mot de passe, tu nommes la Table, tu me communiques le nom et je rajoute le bout de code pour l'ouverture...

Je regarderai ensuite comment on peut modifier, sans tout bouleverser, pour rendre le paramétrage variable. Tant qu'à le modifier, autant essayer de procéder selon des paramètres à la demande...

Cordialement.

Hello,

En ce qui concerne les mots de passe, sur le fichier "MFerrand" (je manquais de créativité ) il y a sur la Worksheet "Contrôle" dans la colonne "F" les noms de fichiers (qui correspondent à la fameuse valeur de la colonne "AX" que tu utilises dans ta procédure), et dans la colonne "G" le mot de passe correspondant et sur la Worksheet "Tri des dossiers" ton plan de contrôle que tu m'as fait.

Pour ce qui est du paramétrage, cela me semble assez fou que tu ne m'aies pas dit que cela n'est pas possible...

Merci d'avance

Ok ! J'avais loupé le chargement !

Mais il s'agit bien d'un mot de passe pour ôter la protection de la feuille ?

Et je vois que tu as mis des chemins de classeurs : le même, mais est-ce qu'ils peuvent être différents ?

Cordialement.

Non c'est le mot de passe pour ouvrir le classeur complet "chiffrage du classeur"

Bonjour,

Procédures modifiées :

  • ClasseurCtrl (fonction ajoutée)
  • InitClasseurCtrl (modifiée)

A tester. J'espère n'avoir pas fait d'erreur ,car pas possible tester.

Sur la feuille Contrôle, la plage des noms de Classeurs est nommée dynamiquement (s'adaptera aux extensions). Ne rien mettre en dessous, et aucune ligne vide.

Cordialement.

Bonjour,

Je regarde ça lundi à mon retour au travail car je ne peux pas tester cela depuis la maison. Merci beaucoup et bon week-end

Bonjour MFerrand.

Je te confirme que la modification que tu as apportée pour l'ouverture des fichiers protégés par un mot de passe fonctionne très bien . Je te remercie infiniment pour le travail que tu as accompli.

Bonne journée

Rechercher des sujets similaires à "matrice tri aleatoire"