XL 2013 Besoin d'une Solution VBA

Brahim EL KASSRI

XLDnaute Nouveau
Je vais une analyse sur des tickets HD créés pour un client, et j’aurais besoin de votre aide SVP

L’extraction que j’effectue contient 3 données (incidents, tâches internes, et tâches externes), les différentes tâches sont forcément liées à leur incident partent.
Mon besoin consiste à faire un calcul pour savoir la différence entre la date de création de l’incident parent et la date de la première tâche créé sur cet incident, (à savoir qu’un incident parent peut avoir plusieurs tâches), du coup sur une extraction élargie, on peut avoir les incidents parents en doublons. C’est pour cela, d'ailleurs, j’ai besoin de savoir la date de la 1ère tâche créée pour cet incident parent pour effecteur le bon calcul des SLA. (Je vous joins le fichier data comme exemple)

Si possible d'avoir une solution VBA, car les lignes peuvent dépasser les 40000, cette VBA permettra si possible de faire sortir sur une nouvelle feuille (Résultat) les incidents parents (sans doublons) avec leur première tâche créée (ancienne date).

[On imagine 10 incidents parent en doublons avec 10 tâches différentes, je veux bien éliminer les incidents doublons et garder q'un seul avec la tâche qui lui a été attribué en prenant en compte la première création (ancienne date de tâche)

Merci pour votre aide, et j’espère avoir bien expliqué mon besoin.
 

Fichiers joints

job75

XLDnaute Barbatruc
Bonjour Brahim EL KASSRI, Pierre,

Je n'ai peut-être rien compris au problème.

Car pour moi il se résout très facilement avec de simples formules de recherche en B2: D3 de la feuille "Résultat".

Fichier joint.

A+
 

Fichiers joints

Brahim EL KASSRI

XLDnaute Nouveau
Merci Pierre et Job pour vos retours rapides.
je pense que je n'ai pas exprimer mon besoin clairement. Je vais essayer de faire autrement :
D'abord j'ai réduit le nombre de ligne (pour rendre la liste visible et plus simple)
On a une liste des incidents créés (Onglet "Incidents"), on a sur les deux autres onglets la liste des tâches créés (qui appartiennent aux incidents comme dossiers fils). il faut savoir qu'un seul incident peut avoir un ou plusieurs tâches.
Moi ce que je veux comme résultat :
- Regrouper toutes les tâches (internes et externes) sur la colonne A de l'onglet "Résultat" avec leurs Parent ID sur la colonne B, ces informations vont être récupérées depuis l'onglet "Tâches externes" Colonnes A et B, et depuis l'onglet "Tâches internes" Colonnes A et L.
Après ça, il y aura forcement des Parent ID de doublons qu'il faut éliminer. et c'est là le grand travail hhh. car moi je souhaite éliminer ces doublons en gardant le parent ID qui correspond à la première tâche créée, comme ça je fais le calcul de différence de dates sur la date de création de l'incident et la date de création de la première tâche, si non il se peut que la recherche me récupère la date de la 3ème tâche qui va me fausser mes résultats, et me donnera un retard de 2 jours par exemple alors que la première tâche a été créée après 15 min par exemple.
- je veux récupérer aussi la date de création du Parent ID (indiqué sur la colonne B) depuis la source qui est l'onglet "Incidents"
- je veux aussi exécuter une soustraction pour faire la différence entre Colonne C et Colonne D pour avoir un nombre d'heures comme durée d'escalade
et tout ça par VBA pour ne pas plenter le classeur (car il se peut qu'il y aura vers 40000 lignes)

J'espère que j'ai éclairci mon besoin cette fois ci

Sur le fichier ci joint je vous indique plus d'explications encore sur un exemple de Parent ID qui est en doublon avec de différentes tâches

Merci beaucoup
 

Fichiers joints

job75

XLDnaute Barbatruc
Bonjour Brahim EL KASSRI, Pierre, le forum,

La question des doublons se règle facilement.

Il suffit de trier les dates en ordre croissant :

- la feuille "Tâches externes" sur la colonne I

- la feuille "Tâches internes" sur la colonne H.

Les formules que j'ai données traiteront la 1ère ligne trouvée par les fonctions EQUIV et RECHERCHEV.

Ce que vous n'avez jamais dit clairement : quelles tâches voulez-vous lister en colonne A de la feuille "Résultat" ?

S'il s'agit d'entrées manuelles elles seront a priori peu nombreuses et mes formules devraient suffire.

Bonne journée.
 

Brahim EL KASSRI

XLDnaute Nouveau
Bonjour Job, et merci pour ton retour rapide

Sur la colonne A je veux lister toutes les tâches internes et externes
Question de Tri est une bonne idée, donc si on fait un tri croissant, nous pourrons supprimer les doublons et garder la date la plus ancienne.
et puis nous déplaçons tout sur la feuille résultat :
- Avoir toutes les tâches internes et externes sur la colonne A et leurs Parent ID sur la colonne B depuis les feuilles "tâches internes" et "tâches externes"
- Avoir la date de création de la task depuis les feuilles "tâches internes" et "tâches externes"
- Avoir la date de création du parent id depuis la feuille "incidents"
- Et enfin exécuter le calcul (= [Date de première création task] - [Date de création Parent ID]

Serait-il possible de faire tout ça avec du VBA, pour pouvoir l'exécuter à l'aide d'un Bouton ? question de ne pas planter le classeur car il y au moins 30000 lignes à traiter voir même 40000.

Merci énormément
 

job75

XLDnaute Barbatruc
Re,

Dans la feuille "Résultat" 2 cases d'option permettent de choisir le type de tâche à étudier, voici la macro :
Code:
Sub Taches()
Dim F As Worksheet, coltask%, coldat%, colparent%, tablo, resu(), d1 As Object, d2 As Object, i&, x$, n&, lig&
Set F = Sheets("Tâches " & IIf([G1] = 1, "externes", "internes"))
coltask = 3 - [G1] '2 et 1
coldat = 10 - [G1] '9 et 8
colparent = IIf([G1] = 1, 1, 12)
F.UsedRange.Sort F.Columns(coldat), xlAscending, Header:=xlYes 'tri sur les dates
tablo = F.UsedRange.Resize(, 12) 'matrice, plus rapide
ReDim resu(1 To UBound(tablo), 1 To 5)
Set d1 = CreateObject("Scripting.Dictionary")
Set d2 = CreateObject("Scripting.Dictionary")
'---colonnes 1 2 3 des résultats---
For i = 2 To UBound(tablo)
    x = CStr(tablo(i, coltask))
    If Not d1.exists(x) Then
        n = n + 1
        d1(x) = ""
        d2(CStr(tablo(i, colparent))) = n 'mémorise le numéro de ligne
        resu(n, 1) = x
        resu(n, 2) = tablo(i, colparent)
        resu(n, 3) = tablo(i, coldat)
    End If
Next
If d1.Count = 0 Then GoTo 1 'si le tableau est vide
'---colonnes 4 et 5 des résultats---
tablo = Sheets("Incidents").UsedRange.Resize(, 9) 'matrice, plus rapide
For i = 2 To UBound(tablo)
    x = CStr(tablo(i, 1))
    If d2.exists(x) Then
        lig = d2(x) 'n° de ligne mémorisé
        resu(lig, 4) = tablo(i, 9) '2ème date
        resu(lig, 5) = resu(lig, 3) - resu(lig, 4)
    End If
Next
'---restitution---
[A2].Resize(n, 5) = resu
1 Range("A" & n + 2 & ":E" & Rows.Count).ClearContents 'RAZ en dessous
End Sub
Fichier joint, comme on le verra des tâches n'ont pas de correspondance dans la feuille "Incidents".

La macro est rapide car on utilise des tableaux VBA et 2 Dictionary.

A+
 

Fichiers joints

Dernière édition:

Brahim EL KASSRI

XLDnaute Nouveau
Merci Job pour ta réactivité et ton aide,
Il semble que nous y arriverons hh.

En fait, est-il possible de garder un seul bouton qui va nous permettre de récupérer les deux types de tâches et les lister sur la colonne A de la feuille "Résultat" ?

D'autre part, je trouve toujours des doublons après avoir utiliser les boutons, ils récupèrent les tasks avec leurs parent ID, ça c'est bon, mais il me faut par la suite qu'il supprime les doublons qui existent sur la colonne B mais qu'il prend en compte la colonne C comme condition pour garder l'ancienne date (par exemple en utilisant le bouton externes, il récupère les numéros, et parmi les Parent ID on a le n° 160034 qui est en double, en supprimant le doublon il faut qu'il garde celui qui a la date sur la colonne C "01/01/2019 12:36:45" et non pas qui a la date "01/01/2019 12:37:26". et je sais pas aussi pourquoi il n'a pas pu récupérer la date de ce parent ID 160034 sur la colonne D ligne 21 !

Aussi je remarque qu'en faisant la récupération de l'un des tâches il y a toujours un n° qui manque, sur les "externes" il récupère 1808 alors sur la source on a 1809, et aussi sur les "internes" il récupère 468, alors qu'il y a 469, est ce normal ?

Désolé Job de t'avoir embêté. Merci Men
 

job75

XLDnaute Barbatruc
Il fallait écrire n+ 2 au lieu de n + 1 en dernière ligne de la macro, j'ai corrigé mon post #8.

Il me paraît stupide de traiter en même temps toutes les tâches, je ne m'en occuperai donc pas.
 

Brahim EL KASSRI

XLDnaute Nouveau
Qui peut m'aider SVP pour l'ajout d'un code qui permet la suppression des doublon selon la condition indiquée (garder l'ancienne date sur la colonne C) ?
 

job75

XLDnaute Barbatruc
Re,

Pour traiter le cas des Parent ID en doublon comme le n° 160034 voici la macro modifiée :
Code:
Sub Taches()
Dim F As Worksheet, coltask%, coldat%, colparent%, tablo, resu(), d1 As Object, d2 As Object, i&, x$, n&, y$, s, j&, lig&
Set F = Sheets("Tâches " & IIf([G1] = 1, "externes", "internes"))
coltask = 3 - [G1] '2 et 1
coldat = 10 - [G1] '9 et 8
colparent = IIf([G1] = 1, 1, 12)
F.UsedRange.Sort F.Columns(coldat), xlAscending, Header:=xlYes 'tri sur les dates
tablo = F.UsedRange.Resize(, 12) 'matrice, plus rapide
ReDim resu(1 To UBound(tablo), 1 To 5)
Set d1 = CreateObject("Scripting.Dictionary")
Set d2 = CreateObject("Scripting.Dictionary")
'---colonnes 1 2 3 des résultats---
For i = 2 To UBound(tablo)
    x = CStr(tablo(i, coltask))
    If Not d1.exists(x) Then
        n = n + 1
        d1(x) = ""
        y = CStr(tablo(i, colparent))
        d2(y) = d2(y) & Chr(1) & n 'mémorise tous les numéros de ligne
        resu(n, 1) = x
        resu(n, 2) = tablo(i, colparent)
        resu(n, 3) = tablo(i, coldat)
    End If
Next
If d1.Count = 0 Then GoTo 1 'si le tableau est vide
'---colonnes 4 et 5 des résultats---
tablo = Sheets("Incidents").UsedRange.Resize(, 9) 'matrice, plus rapide
For i = 2 To UBound(tablo)
    x = CStr(tablo(i, 1))
    If d2.exists(x) Then
        s = Split(d2(x), Chr(1))
        For j = 1 To UBound(s)
            lig = s(j) 'n° de ligne mémorisé
            resu(lig, 4) = tablo(i, 9) '2ème date
            resu(lig, 5) = resu(lig, 3) - resu(lig, 4)
        Next
        d2.Remove x
    End If
Next
'---restitution---
[A2].Resize(n, 5) = resu
1 Range("A" & n + 2 & ":E" & Rows.Count).ClearContents 'RAZ en dessous
End Sub
Pas très facile à comprendre, faut s'accrocher...

Fichier (2).

A+
 

Fichiers joints

Brahim EL KASSRI

XLDnaute Nouveau
Merci beaucoup Job, les dates remontent maintenant pour tous les doublons qui existent sur l'onglet incidents.
On garde cette forme (ton dernier fichier attaché) c'est nickel.
Maintenant, si on veut supprimer les doublons sur la colonne B (toute la ligne), mais éliminer le doublon qui a la date la plus récente sur la colonne C, c'est possible ? j'espère que c'est clair :p
 

job75

XLDnaute Barbatruc
Re,

Il est très facile d'éliminer les doublons en colonne B avec ce code :
Code:
'---élimination des doublons en colonne B---
With [A1].CurrentRegion
    .Sort [C1], xlAscending, Header:=xlYes 'tri croissant sur la colonne C
    .RemoveDuplicates 2, Header:=xlYes
    .Sort [A1], xlAscending, Header:=xlYes 'tri croissant sur la colonne A
End With
On Error Resume Next 'si aucune SpecialCell
[A:A].SpecialCells(xlCellTypeBlanks).EntireRow.Delete 'suppression des lignes vides
With ActiveSheet.UsedRange: End With 'actualise la barre de défilement verticale
Fichier (3).

A+
 

Fichiers joints

Dernière édition:

job75

XLDnaute Barbatruc
Dans mon post #16 [Edit : #15] précédent je viens d'ajouter la suppression des lignes vides, c'est mieux pour la barre de défilement verticale.
 
Dernière édition:

Discussions similaires


Haut Bas