[VBA - Excel] Élaboration d'une macro

Ni plus, ni moins ! C'est de ton côté que ce n'est pas clair !

Sur ce fichier, je veux prendre mes 2 colonnes ESX et Liste Datastore

NON ! Parce que :

C'est pour cela que je dis que ça ressemble fortement à la mise à jour des valeurs de la vCPU/Ram/Stockage.

Cela ressemble parce que au lieu de mettre à jour 3 colonnes, on va mettre à jour 5 colonnes !

Car, les machines ne sont pas dans le même ordre dans les 2 fichiers.

N'est-ce point le cas lors des mises à jour ? Donc rien de changé !

J'aimerais donc que cela m'insère automatiquement mon ESX et ma Liste Datastore à la bonne ligne dans mon fichier "WBX-CTR-ANX-2-Périmètre-v6 20161013"

La mise à jour de 3 colonnes insère les mises à jour à la bonne ligne. Pourquoi ne serait-ce plus le cas lors de mises à jour de 5 colonnes ?

Ou la mise à jour fonctionne, et dans ce cas elle fonctionnera aussi bien pour 3, 5 ou 20 colonnes ! Ou elle ne fonctionne pas et ne fonctionne alors pas pour aucune colonne !

D'accord.

Et, comment on fait pour qu'elle fasse la mise à jour des 5 colonnes ?

On est obligé de changer un peu le code pour l'adapter ?

Certes !

On fait pareil sur le principe, et on s'adapte selon les positions des 5 colonnes !

Bonjour,

J'ai essayé de le faire mais ça ne marche pas ...

Voici mon code adapté pour faire la mise à jour des 2 colonnes ESX et Liste Datastore :

Sub Test()
    Dim d As Object, Tablo(), TabSupp(), 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, 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, 2)
        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) = CLng(pmc(k))
                Next k
                d.Remove (mach)
            End If
        Next i
        Application.ScreenUpdating = False
        With .Range("N3:O" & ln)
            .Value = Tablo
            .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
        End With
        ln = .Cells(.Rows.Count, 3).End(xlUp).Row
        If d.Count > 0 Then
            ReDim Tablo(1 To d.Count, 2): i = 0
            For Each mach In d.keys
                i = i + 1: pmc = Split(d(mach), ";")
                .Cells(ln + i, 3) = mach
                For k = 0 To 2
                    Tablo(i, k) = CLng(pmc(k))
                Next k
            Next mach
            .Range("N" & ln + 1 & ":O" & ln + i).Value = Tablo
        End If
    End With
    Exit Sub
noclasseur:
    MsgBox "Classeur d'extraction non trouvé." & Chr(10) & "Vérifier.", vbCritical, "Erreur"
End Sub

Donc, j'ai essayé de changer CLng en CStr mais ça ne marche pas non plus. Rien à faire

Pas encore compris qu'on ne fait pas 2 colonnes !

On fait 5, ou bien alors si 2 c'est qu'on abandonne les 3 précédentes !

Si, j'ai bien compris.

Mais, j'y arrive vraiment pas, j'en suis désolé.

Je veux modifier les colonnes I à K et N à O.

Mais entre K et N, je ne veux pas y toucher. C'est problématique avec le code actuel non ?

Car, par exemple pour les codes suivants :

 With .Range("N3:O" & ln)

Et

.Range("N" & ln + 1 & ":O" & ln + i).Value = Tablo 

Je ne vois pas du tout, comment on peut modifier pour que ça prenne en compte mes 5 colonnes ...

On avance pas trop, je suis désolé. Je suis nul

Donc : I J K + N O, ça pour la cible.

Quelles colonnes correspondantes pour la source ?

Et type de données des 2 nouvelles colonnes ?

(Les 3 précédentes étaient numériques.)

Bonjour,

MFerrand a écrit :

Quelles colonnes correspondantes pour la source ?

Pour la source, c'est les colonnes S à U pour les numériques et W à X pour les chaînes de caractères.

MFerrand a écrit :

Et type de données des 2 nouvelles colonnes ?

Ce sont des chaînes de caractères (string)

Voilà à tester :

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) = CLng(pmc(k))
                Next k
                For k = 3 To 4
                    Tablo(i, k) = .Cells(i, k + 9)
                    Tablo(i + 2, k) = pmc(k)
                Next k
                d.Remove (mach)
            End If
        Next i
        Application.ScreenUpdating = False
        With .Range("I3:O" & ln)
            .Value = Tablo
            .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
        End With
        If d.Count > 0 Then
            ReDim Tablo(1 To d.Count, 6): i = 0
            For Each mach In d.keys
                i = i + 1: pmc = Split(d(mach), ";")
                .Cells(ln + i, 3) = mach
                For k = 0 To 2
                    Tablo(i, k) = CLng(pmc(k))
                Next k
                For k = 3 To 4
                    Tablo(i + 2, k) = pmc(k)
                Next k
            Next mach
            .Range("I" & ln + 1 & ":O" & ln + i).Value = Tablo
        End If
    End With
    Exit Sub
noclasseur:
    MsgBox "Classeur d'extraction non trouvé." & Chr(10) & "Vérifier.", vbCritical, "Erreur"
End Sub

Si je n'ai rien loupé cela devrait être adapté...

Merci beaucoup pour le code.

Par contre, il m'affiche une erreur.

Cordialement.

C'est lui qui a raison de tout façon !

C'est :

    Tablo(i, k + 2) = pmc(k)

Attention, ça figure deux fois, corriger les deux !

J'espère que j'en ai pas inversé d'autres...

Non, toujours pas :/

Je vois ce que c'est ! Avant les 3 colonnes étaient vides, maintenant sur les 7 deux ne le sont pas...

            .Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete

Essaie comme ça, cela devrait passer !

Merci, ça marche

J'ai rajouté ma dernière condition :

- Ajouter le type de stockage en se basant sur le nom dans "Liste Datastore" :

Pour cela, il faut faire 2 nouvelles colonnes : LIVE et MASS. On peut le faire à la main. Pas besoin d'une macro pour ajouter les 2 nouvelles colonnes. Il faut une macro par contre pour les compléter.

Tout ce qui comporte « ms » dans le nom renseigner OK dans la colonne MASS et NOK dans le LIVE.

Et inversement tout ce qui ne comporte pas le mot « ms » mettre OK dans la colonne LIVE et NOK dans MASS.

Comme prévu, le code marche. Seul petit problème, il laisse un grand espace pour les machines supprimées.

Comment résoudre cela ?

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, 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) = CLng(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
        If d.Count > 0 Then
            ReDim Tablo(1 To d.Count, 6): i = 0
            For Each mach In d.keys
                i = i + 1: pmc = Split(d(mach), ";")
                .Cells(ln + i, 3) = mach
                For k = 0 To 2
                    Tablo(i, k) = CLng(pmc(k))
                Next k
                For k = 3 To 4
                    Tablo(i, k + 2) = pmc(k)
                Next k
            Next mach
            .Range("I" & ln + 1 & ":O" & ln + i).Value = Tablo
        End If
    End With
    iDerLig = Range("C" & Rows.Count).End(xlUp).Row
    For iLig = 1 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("O" & Rows.Count).End(xlUp).Row
    For iLig1 = 3 To iDerLig1
        If InStr(1, Range("O" & iLig1).Value, "-ms-") > 0 Then
            Range("P" & iLig1).Value = "OK"
        Else
            Range("P" & iLig1).Value = "NOK"
        End If
        If InStr(1, Range("O" & iLig1).Value, "-ms-") > 0 Then
            Range("Q" & iLig1).Value = "NOK"
        Else
            Range("Q" & iLig1).Value = "OK"
        End If
    Next iLig1
    With Range("A:Q")
    .HorizontalAlignment = xlHAlignCenter
    .VerticalAlignment = xlVAlignCenter
    End With
    Exit Sub
noclasseur:
    MsgBox "Classeur d'extraction non trouvé." & Chr(10) & "Vérifier.", vbCritical, "Erreur"
End Sub

Merci.

Arch ! Une ligne a sauté dans les manipulations (c'était un problème déjà réglé avant...) :

       End With
        If d.Count > 0 Then
            ln = .Cells(.Rows.Count, 3).End(xlUp).Row
            ReDim Tablo(1 To d.Count, 6): i = 0

Merci, c'est parfait

Tout marche pratiquement ...

Sauf pour 2 machines :

  • TPL-BACK situé à la ligne 6 après réalisation de la macro.
  • wbx-tpl-front situé à la ligne 117 après réalisation de la macro.

En effet, elles ont pour valeur 0 dans la colonne J (Ram) ce qui n'est pas le cas dans le fichier d'extraction. En effet, sa valeur devrait être 1.

Est-ce possible de régler ce problème ?

D'ailleurs, dans cette colonne, normalement, il ne peut pas y avoir de 0. Donc, si on interdit d'importer un 0, ça remettra peut être la bonne valeur ?

Par contre, j'ai du mal à comprendre pourquoi il me le fait seulement pour ces 2 machines.

C'est qu'en fait ce n'est pas 1, mais 0,5 ! Le format masquait les décimales...

Et :

Tablo(i, k) = CLng(pmc(k))

restitue des entiers !

Si l'on enlève la conversion, après test, les entiers ont l'air de demeurer des nombres mais les décimaux deviennent texte !

Donc :

Tablo(i, k) = CDec(pmc(k))

devrait restituer les bonnes valeurs.

A surveiller cependant que d'autres valeurs ne soient pas "allergiques" à cette modification !

Bonjour,

Désolé pour le retard, fête de Noël, oblige.

Merci. Tout est parfait, ça fonctionne bien.

J'ai regardé un peu concernant les lignes manquantes pour l'ajout des nouvelles machines.

Normalement, on peut remplir la case Etat(colonne H) et la case Datacenter(colonne A). Du moins, pour la case Etat, c'est sûr.

Pour les autres colonnes, il faudra le faire manuellement du moins pour le moment.

Pour la case Etat :

  • Dans mon fichier d'extraction, la colonne est I.
  • Dans mon fichier original, la colonne est H.
  • Ce sont des chaînes de caractères pour les 2 colonnes.
  • Par contre, le résultat est ON/OFF dans mon fichier original alors que le resultat est true/false dans mon fichier d'extration. Le but est pour true de mettre ON et pour false de mettre OFF.

Pour la case Datacenter :

Pour le moment, je dois encore vérifier si cela est vraiment possible ou non.

Donc concentrons nous d'abord sur la case Etat.

J'ai essayé de le faire en ajoutant 2 FOR et la cellule comme nous l'avons fait pour le ESX et la Liste Datastore mais impossible ça ne marche pas.

Je ne dois pas avoir bien compris le système des FOR

Peux-tu m'aider s'il te plait ?

Cordialement ?

Bonjour

Concernant la colonne Datacenter, j'ai bien la confirmation, c'est possible de la faire.

Pour cette colonne, je n'ai pas besoin d'aide. La colonne Liste Datacenter que nous avons importé sur mon fichier original m'aide à remplir cette colonne. En effet, les infos se trouvent sur le même classeur, c'est donc beaucoup plus simple.

Par contre, concernant la colonne Etat, je suis toujours en difficulté. Je n'y arrive vraiment pas.

Est-ce vraiment nécessaire que je mette mon code ici sachant qu'il est faux ?

J'aurais vraiment besoin d'aide

Merci.

Cordialement

Désolé ! Pas eu le loisir de revenir sur ce sujet... Mais ça viendra !

Rechercher des sujets similaires à "vba elaboration macro"