[VBA - Excel] Élaboration d'une macro

Bonjour.

Bon, concernant la colonne Etat et Datacenter, c'est fait. J'ai réussi

Pour réussir à faire la colonne Etat, j'ai trafiqué un peu les colonnes en mettant toutes les colonnes qu'on modifie les uns à côté des autres.

Quand les colonnes sont éparpillées, je n'y arrive pas.

Je ne dois pas très bien comprendre le fonctionnement du tableau sûrement ...

Voici le code complet :

Sub MiseAJour()
    Dim d As Object, Tablo(), pmc, mach, ln%, i%, k%
    Set d = CreateObject("Scripting.Dictionary")
    d.CompareMode = vbTextCompare
    On Error GoTo noclasseur
    With Workbooks("WBX - extraction pure.xlsx").Worksheets(1)
        On Error GoTo 0
        ln = .Cells(.Rows.Count, 10).End(xlUp).Row
        If .Cells(ln, 10) Like "Sum*" Then ln = ln - 1
        For i = 2 To ln
            mach = Trim(.Cells(i, 10)): k = InStr(1, mach, "(")
            If k > 0 Then mach = Trim(Left(mach, k - 1))
            pmc = .Cells(i, 9) & ";" _
            & .Cells(i, 19) & ";" & .Cells(i, 20) & ";" & .Cells(i, 21) & ";" _
            & .Cells(i, 23) & ";" & .Cells(i, 24)
            d(mach) = pmc
        Next i
    End With
    With ThisWorkbook.Worksheets("Inventaire 060616")
        ln = .Cells(.Rows.Count, 3).End(xlUp).Row
        ReDim Tablo(3 To ln, 5)
        For i = 3 To ln
            mach = .Cells(i, 3)
            If d.exists(mach) Then
                pmc = Split(d(mach), ";")
                For k = 0 To 0
                    Tablo(i, k) = CStr(pmc(k))
                Next k
                For k = 1 To 3
                    Tablo(i, k) = CDec(pmc(k))
                Next k
                For k = 4 To 5
                    Tablo(i, k) = CStr(pmc(k))
                Next k
                d.Remove (mach)
            End If
        Next i
        Application.ScreenUpdating = False
        With .Range("H3:M" & ln)
            .Value = Tablo
            .Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
        End With
        If d.Count > 0 Then
            ln = .Cells(.Rows.Count, 3).End(xlUp).Row
            ReDim Tablo(1 To d.Count, 5): i = 0
            For Each mach In d.keys
                i = i + 1: pmc = Split(d(mach), ";")
                .Cells(ln + i, 3) = mach
                For k = 0 To 0
                    Tablo(i, k) = CStr(pmc(k))
                Next k
                For k = 1 To 3
                    Tablo(i, k) = CDec(pmc(k))
                Next k
                For k = 4 To 5
                    Tablo(i, k) = CStr(pmc(k))
                Next k
            Next mach
            .Range("H" & ln + 1 & ":M" & ln + i).Value = Tablo
        End If
    End With
     iDerLig = Range("C" & Rows.Count).End(xlUp).Row
    For iLig = 3 To iDerLig
        If InStr(1, Range("C" & iLig).Value, "-REC-") > 0 Then
            Range("E" & iLig).Value = "Recette"
        ElseIf InStr(1, Range("C" & iLig).Value, "-PP-") > 0 Then
            Range("E" & iLig).Value = "Pré-Production"
        ElseIf InStr(1, Range("C" & iLig).Value, "-PRD-") > 0 Then
            Range("E" & iLig).Value = "Production"
        ElseIf InStr(1, Range("C" & iLig).Value, "-prd-") > 0 Then
            Range("E" & iLig).Value = "Production"
        End If
    Next iLig
    iDerLig1 = Range("M" & Rows.Count).End(xlUp).Row
    For iLig1 = 3 To iDerLig1
        If InStr(1, Range("M" & iLig1).Value, "-th3") > 0 Then
            Range("A" & iLig1).Value = "TH3"
        Else
            Range("A" & iLig1).Value = "PAR7"
        End If
    Next iLig1
    Cible = True
    iDerLig2 = Range("M" & Rows.Count).End(xlUp).Row
    For iLig2 = 3 To iDerLig2
        If InStr(Cible, Range("H" & iLig2).Value) > 0 Then
            Range("H" & iLig2).Value = "ON"
            Range("H" & iLig2).Interior.Color = RGB(146, 208, 80)
    Else
            Range("H" & iLig2).Value = "OFF"
            Range("H" & iLig2).Interior.ColorIndex = 3
        End If
    Next iLig2
    With Range("A:O")
    .HorizontalAlignment = xlHAlignCenter
    .VerticalAlignment = xlVAlignCenter
    End With
    Exit Sub
noclasseur:
    MsgBox "Classeur d'extraction non trouvé." & Chr(10) & "Vérifier.", vbCritical, "Erreur"
End Sub

Bref, par contre, maintenant, il faut que je fasse la colonne Service Rendu.

Pour la colonne Service Rendu :

  • Dans mon fichier d'extraction, la colonne est AM (celulle 39). Son nom est Remarque RED.
  • Dans mon fichier original, la colonne est D (cellule 4). Son nom est Service Rendu.
  • Ce sont des chaînes de caractères pour les 2 colonnes.

Est-ce possible d'avoir un peu d'aide ? J'aimerai bien garder ma colonne au même endroit cette fois ...

Mais ça, je ne sais vraiment pas comment faire

PS : Voici le fichier original en pièce jointe.

Bonjour.

Je suis toujours bloqué concernant la colonne Service Rendu.

Je me permet donc une petite relance. Pouvez-vous m'aider s'il vous plait ?

Merci et bonne soirée

Bonjour,

A essayer :

Sub MiseAJour()
    Dim d As Object, Tablo(), pmc, mach, ln%, i%, k%
    Set d = CreateObject("Scripting.Dictionary")
    d.CompareMode = vbTextCompare
    On Error GoTo noclasseur
    With Workbooks("WBX - extraction pure.xlsx").Worksheets(1)
        On Error GoTo 0
        ln = .Cells(.Rows.Count, 10).End(xlUp).Row
        If .Cells(ln, 10) Like "Sum*" Then ln = ln - 1
        For i = 2 To ln
            mach = Trim(.Cells(i, 10)): k = InStr(1, mach, "(")
            If k > 0 Then mach = Trim(Left(mach, k - 1))
            pmc = .Cells(i, 19) & ";" & .Cells(i, 20) & ";" & .Cells(i, 21) & ";" _
             & .Cells(i, 23) & ";" & .Cells(i, 24)
            d(mach) = pmc
        Next i
    End With
    'Workbooks("WBX - extraction pure.xlsx").Close False
    With ThisWorkbook.Worksheets("Inventaire 060616")
        ln = .Cells(.Rows.Count, 3).End(xlUp).Row
        ReDim Tablo(3 To ln, 6)
        For i = 3 To ln
            mach = .Cells(i, 3)
            If d.exists(mach) Then
                pmc = Split(d(mach), ";")
                For k = 0 To 2
                    Tablo(i, k) = CDec(pmc(k))
                Next k
                For k = 3 To 4
                    Tablo(i, k) = .Cells(i, k + 9)
                    Tablo(i, k + 2) = pmc(k)
                Next k
                d.Remove (mach)
            End If
        Next i
        Application.ScreenUpdating = False
        With .Range("I3:O" & ln)
            .Value = Tablo
            .Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
        End With
    End With
    If d.Count > 0 Then
        With Workbooks("WBX - extraction pure.xlsx").Worksheets(1)
            ln = .Cells(.Rows.Count, 10).End(xlUp).Row
            For Each mach In d.keys
                For i = 2 To ln
                    If .Cells(i, 10) Like "*" & mach & "*" Then
                        pmc = .Cells(i, 7) & ";" & IIf(.Cells(i, 9) = "true", "ON", "OFF") & ";"
                        pmc = pmc & d(mach): d(mach) = pmc: Exit For
                    End If
                Next i
            Next mach
        End With
        With ThisWorkbook.Worksheets("Inventaire 060616")
            ln = .Cells(.Rows.Count, 3).End(xlUp).Row
            ReDim Tablo(1 To d.Count, 7): i = 0
            For Each mach In d.keys
                i = i + 1: pmc = Split(d(mach), ";")
                .Cells(ln + i, 3) = mach
                .Cells(ln + i, 1) = pmc(0)
                Tablo(i, 0) = pmc(1)
                For k = 2 To 4
                    Tablo(i, k - 1) = CDec(pmc(k))
                Next k
                For k = 5 To 6
                    Tablo(i, k + 1) = pmc(k)
                Next k
            Next mach
            .Range("H" & ln + 1 & ":O" & ln + i).Value = Tablo
        End If
    End With
    Workbooks("WBX - extraction pure.xlsx").Close False
    Exit Sub
noclasseur:
    MsgBox "Classeur d'extraction non trouvé." & Chr(10) & "Vérifier.", vbCritical, "Erreur"
End Sub

La première partie est inchangée, sauf qu'on ne ferme plus le classeur Extraction pure (ligne invalidée)

La seconde partie commence à : If d.Count > 0 Then

On retourne dans le classeur Extraction pure :

pour chaque élément dico (machine) on la recherche et on complète avec les données DataCenter et Etat qu'on ajoute devant les données antérieurement recueillies.

Chaque élément dico contient une chaîne concaténant les contenus destinées dans le classeur cible aux colonnes (dans cet ordre) :

A H I J K N O

L'affectation des ajouts se fait dans les mêmes conditions que précédemment mais : Tablo est redimensionné sur 8 colonnes (0 à 7) pour couvrir une plage H:O, la machine est affectée en J comme précédemment mais le DataCenter est affecté simultanément en A (élément 0 du tableau de données de l'élément dico) ; les élément 1 à 6 dudit tableau de données vont garnir le Tablo : 1 à 4 vers éléments colonne 0 à 3 du Tablo, 5 et 6 vers él. col. 6 et 7 du Tablo.

Cordialement.

Bonjour.

Merci beaucoup pour ce code.

Je vais colorer en jaune l'erreur :

Sub MiseAJour()
    Dim d As Object, Tablo(), pmc, mach, ln%, i%, k%
    Set d = CreateObject("Scripting.Dictionary")
    d.CompareMode = vbTextCompare
    On Error GoTo noclasseur
    With Workbooks("WBX - extraction pure.xlsx").Worksheets(1)
        On Error GoTo 0
        ln = .Cells(.Rows.Count, 10).End(xlUp).Row
        If .Cells(ln, 10) Like "Sum*" Then ln = ln - 1
        For i = 2 To ln
            mach = Trim(.Cells(i, 10)): k = InStr(1, mach, "(")
            If k > 0 Then mach = Trim(Left(mach, k - 1))
            pmc = .Cells(i, 19) & ";" & .Cells(i, 20) & ";" & .Cells(i, 21) & ";" _
             & .Cells(i, 23) & ";" & .Cells(i, 24)
            d(mach) = pmc
        Next i
    End With
    'Workbooks("WBX - extraction pure.xlsx").Close False
   With ThisWorkbook.Worksheets("Inventaire 060616")
        ln = .Cells(.Rows.Count, 3).End(xlUp).Row
        ReDim Tablo(3 To ln, 6)
        For i = 3 To ln
            mach = .Cells(i, 3)
            If d.exists(mach) Then
                pmc = Split(d(mach), ";")
                For k = 0 To 2
                    Tablo(i, k) = CDec(pmc(k))
                Next k
                For k = 3 To 4
                    Tablo(i, k) = .Cells(i, k + 9)
                    Tablo(i, k + 2) = pmc(k)
                Next k
                d.Remove (mach)
            End If
        Next i
        Application.ScreenUpdating = False
        With .Range("I3:O" & ln)
            .Value = Tablo
            .Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
        End With
    End With
    If d.Count > 0 Then
        With Workbooks("WBX - extraction pure.xlsx").Worksheets(1)
            ln = .Cells(.Rows.Count, 10).End(xlUp).Row
            For Each mach In d.keys
                For i = 2 To ln
                    If .Cells(i, 10) Like "*" & mach & "*" Then
                        pmc = .Cells(i, 7) & ";" & IIf(.Cells(i, 9) = "true", "ON", "OFF") & ";"
                        pmc = pmc & d(mach): d(mach) = pmc: Exit For
                    End If
                Next i
            Next mach
        End With
        With ThisWorkbook.Worksheets("Inventaire 060616")
            ln = .Cells(.Rows.Count, 3).End(xlUp).Row
            ReDim Tablo(1 To d.Count, 7): i = 0
            For Each mach In d.keys
                i = i + 1: pmc = Split(d(mach), ";")
                .Cells(ln + i, 3) = mach
                .Cells(ln + i, 1) = pmc(0)
                Tablo(i, 0) = pmc(1)
                For k = 2 To 4
                    Tablo(i, k - 1) = CDec(pmc(k))
                Next k
                For k = 5 To 6
                    Tablo(i, k + 1) = pmc(k)
                Next k
            Next mach
            .Range("H" & ln + 1 & ":O" & ln + i).Value = Tablo
        [color=#FFFF00]End If[/color]
    End With
    Workbooks("WBX - extraction pure.xlsx").Close False
    Exit Sub
noclasseur:
    MsgBox "Classeur d'extraction non trouvé." & Chr(10) & "Vérifier.", vbCritical, "Erreur"
End Sub

Sinon, si je comprend bien le code. La colonne Service Rendu ne se fait pas dans ce code ? Non ?

Merci

Cordialement.

Bonjour,

Comme je ne suis pas en mesure de tester le code que je te fournis, tu devrais pouvoir déboguer les erreurs simples comme celle-ci !

Quand VBA te met ce type d'erreur, il y a à peu près 1/3 de chances que son indication d e l'élément manquant soit exacte et 2/3 que ce soit un autre élément qui manque, ou bien qui est en trop, ou bien qui ne soit pas à sa place. Ce qui est sûr c'est que quelque chose ne va pas dans le cadrage des blocs d'instruction.

C'est là que l'indentation montre l'un de ses intérêts et pas le moindre ! Mon code étant parfaitement indenté, tu places ton regard sur le End If surligné et tu remontes à la verticale : s'agissant d'un bloc If... End If ton regard doit arriver sur un If à la verticale du End If sans rien rencontrer d'autre qu'éventuellement des ElseIf ou Else intermédiaires.

... Et tu arrives sur un... With ! Cela a pris 2 secondes et tu sais que ça ne va pas là ! Il te faut donc maintenant retrouver le End With correspondant à With. Justement sous ton End If de départ, il y a un End With sur l'alignement précédent : et là en laissant remonter ton regard de la même façon tu tombes direct sur le If de If d.Count > 0 Then ! Ce qui bien sûr ne convient pas non plus.

Donc en environ 5 secondes, tu as détecté qu'un bloc If semble se terminer par End With, et qu'un bloc With inclus dans le précédent semble se terminer par End If ! Probabilité : les deux fins de blocs ont été inversées.

Tu remplaces donc le End If déclencheur de l'erreur par End With, et le End With de la ligne suivante par End If. Tu prends encore quelques secondes pour vérifier que les blocs ont l'air conformes et tu retestes : si cette erreur ne se reproduit plus, c'est OK, sinon tu reprends l'examen un peu plus approfondi des blocs...

Cordialement.


edit : Jamais entendu parler de colonne Service rendu !?

Bonjour.

Si, j'avais bien parlé de la colonne Service Rendu dans mon poste du 9 janvier :

Kivabien a écrit :

Pour la colonne Service Rendu :

  • Dans mon fichier d'extraction, la colonne est AM (celulle 39). Son nom est Remarque RED.
  • Dans mon fichier original, la colonne est D (cellule 4). Son nom est Service Rendu.
  • Ce sont des chaînes de caractères pour les 2 colonnes.

Est-ce possible d'avoir un peu d'aide ? J'aimerai bien garder ma colonne au même endroit cette fois ...

Mais ça, je ne sais vraiment pas comment faire

Sinon, merci pour toute les explications. Le code fonctionne très bien. Merci

Cordialement.

Et ensuite ce sera quelle colonne ?

Ta méthode de travail est un peu trop hâchée à mon goût !

Tu devrais faire un point définitif. Définitif, cela veut dire que tout a été envisagé et qu'on n'y revient plus...

MFerrand a écrit :

Et ensuite ce sera quelle colonne ?

Ta méthode de travail est un peu trop hâchée à mon goût !

Tu devrais faire un point définitif. Définitif, cela veut dire que tout a été envisagé et qu'on n'y revient plus...

Je suis vraiment désolé.

Mais, pour le coup, c'est bien la dernière colonne car pour les autres colonnes, nous pouvons vraiment pas les faire du moins pas pour le moment.

Kivabien a écrit :
MFerrand a écrit :

Et ensuite ce sera quelle colonne ?

Ta méthode de travail est un peu trop hâchée à mon goût !

Tu devrais faire un point définitif. Définitif, cela veut dire que tout a été envisagé et qu'on n'y revient plus...

Je suis vraiment désolé.

Mais, pour le coup, c'est bien la dernière colonne car pour les autres colonnes, nous pouvons vraiment pas les faire du moins pas pour le moment.

Pour le code, j'ai remarqué que si un jour l'état de la machine change, la modification ne se fera pas ce qui est un peu problématique.

Enfin de compte, d'après ce que je vois, elle ajoute un simple ON/OFF pour les nouvelles machines ?

Donc, par exemple, si le mois prochain mon extraction dit que la machine "MAC-TEMPLATE" est ON, elle ne le changera pas et restera en OFF ...

Sinon, je peux faire un récapitulatif de ce qu'il reste à faire pour éviter la perte de temps et qu'on clôture définitivement cette demande ?

Pour le code, j'ai remarqué que si un jour l'état de la machine change, la modification ne se fera pas ce qui est un peu problématique.

Enfin de compte, d'après ce que je vois, elle ajoute un simple ON/OFF pour les nouvelles machines ?

Donc, par exemple, si le mois prochain mon extraction dit que la machine "MAC-TEMPLATE" est ON, elle ne le changera pas et restera en OFF ...

Cela, pose bien un problème d'analyse préalable. ! Tu dois avoir d'abord une idée claire des champs qui sont à mettre régulièrement à jour, et de ceux qui ne feront jamais l'objet d'une mise à jour.

Ensuite des champs invariants qui se correspondent, et qui doivent donc être récupérés lors d'ajouts.

A partir de là on peut définir une bonne fois le "véhicule de déménagement", si je puis me permettre l'analogie...

Cordialement.

Rechercher des sujets similaires à "vba elaboration macro"