IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[VB] Classer par plage des adresses IP via une macro VB V2 [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 54
    Par défaut [VB] Classer par plage des adresses IP via une macro VB V2
    Bonjour,

    Je reviens avec ce sujet car j'ai une autre contrainte. Voici ce que j'ai :

    Adr IP
    192.246.213.1
    205.10.253.45
    192.246.210.104
    25.140.69.1
    192.246.62.18

    En gros ce que je veux obtenir c'est ce résultat là :

    192.246.xxx.xxx
    205.10.253.45
    25.140.69.1

    Je m'explique. Je veux rassembler les adresses IP qui ont leurs deux premiers groupes de chiffres (ex : "192.246") et laisser les autres adresses IP qui n'ont pas de doublons tels qu'elles sont.
    J'ai essayé quelque chose de très flou qui n'a évidemment pas fonctionné vu mon niveau de connaissance dans ce domaine. Ce que j'ai fais c'est que je parcours 1 à 1 les cellules de mon tableau et je compare avec la case d'après et si elles sont équivalentes je remplace par "le_debut_de_l'adresse.xxx.xxx" .
    Pouvez-vous m'aiguiller ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par sticks_678 Voir le message
    Bonjour,

    Comme ça par exemple ?

    Pièce jointe 232585

    Pour obtenir l'équivalent VBA, tapez d'abord une formule et modifiez là en enregistrant une macro. Pour ne garder qu'une seule valeur, regardez l'utilisation des variables Dictionnaires ou filtrez sans doublon sur cette nouvelle colonne.

    Cordialement.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 54
    Par défaut Classer par plage des adresses IP via une macro VB V2
    Merci pour ta réponse.
    Cependant il faut que cela fonctionne pour n'importe quel adresse IP qui se ressemble à partir des deux premiers.
    Je te fourni mon tableau si cela peut t'apporter un peu plus de précision.
    Je vais quand même tester ta méthode en essayant de l'appliquer à mon besoin.
    Nom : TAB_IP.png
Affichages : 574
Taille : 31,1 Ko

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par sticks_678 Voir le message
    Cependant il faut que cela fonctionne pour n'importe quel adresse IP qui se ressemble à partir des deux premiers.
    J'ai du mal à te suivre.

    La méthode donnée est là pour te donner le principe. Si tu développes une macro (je réaliserais plutôt une fonction dans ton cas), tu peux facilement régler tes X cas avec un select case.

    Cordialement.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 54
    Par défaut Classer par plage des adresses IP via une macro VB V2
    Les adresses IP que tu vois là peuvent être différente tous les jours je ne peux donc pas faire un select case car je ne suis pas censé connaître les adresses IP à l'avance. Enfaite toute les semaines j'ai un fichier contenant des adresses IP que je doit traiter comme tel pour réaliser des plages.

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Ces adresses comportent toujours 4 "groupes" séparés par un "."
    1) les trier
    2) éclater la colonne A par rapport au "." en ignorant les 2 derniers groupes (outil convertir)
    3) lire mes interventions de ce jour ou d'hier. L'une d'entre elles est le principe du reste de ton problème.
    Reviens avec le code essayé sur ces bases simples

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par sticks_678 Voir le message
    Les adresses IP que tu vois là peuvent être différente tous les jours je ne peux donc pas faire un select case car je ne suis pas censé connaître les adresses IP à l'avance. Enfaite toute les semaines j'ai un fichier contenant des adresses IP que je doit traiter comme tel pour réaliser des plages.
    Une solution équivalente à celle de Jacques :

    Il faut spliter les adresses et vérifier que les indices 0 et 1 de ta variable ont 3 caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    Function SelectionAdresseIP(ByVal AdresseIp As String) As String
     
    Dim MaVariableSplit As Variant
     
        MaVariableSplit = Split(AdresseIp, ".")
        If UBound(MaVariableSplit) > 1 Then
           If Len(MaVariableSplit(0)) = 3 And Len(MaVariableSplit(1)) = 3 Then
              SelectionAdresseIP = MaVariableSplit(0) & "." & MaVariableSplit(1) & ".XXX.XXX"
           Else
              SelectionAdresseIP = AdresseIp
           End If
        End If
     
    End Function

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 54
    Par défaut Classer par plage des adresses IP via une macro VB V2
    Merci pour vos réponses, je reviendrais vers vous si il y a un soucis.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par sticks_678 Voir le message
    Merci pour vos réponses, je reviendrais vers vous si il y a un soucis.
    Ajouter Application.volatile à la fonction par précaution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Function SelectionAdresseIP(ByVal AdresseIp As String) As String
     
    Dim MaVariableSplit As Variant
     
        Application.Volatile
     
        MaVariableSplit = Split(AdresseIp, ".")
        If UBound(MaVariableSplit) > 1 Then
           If Len(MaVariableSplit(0)) = 3 And Len(MaVariableSplit(1)) = 3 Then
              SelectionAdresseIP = MaVariableSplit(0) & "." & MaVariableSplit(1) & ".XXX.XXX"
           Else
              SelectionAdresseIP = AdresseIp
           End If
        End If
     
    End Function
    Dernière modification par Invité ; 09/01/2017 à 15h12. Motif: Désabonnement à cette discussion

  10. #10
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    Quelques suggestions brutes de décoffrage:

    1. Sous Excel (Anglais)

    Adr IP =LEFT(A2,FIND(".",A2,5)-1) =IF(COUNTIF($B$2:$B$6,B2)>1, "xxx", RIGHT(A2,FIND(".",A2,5)-1))
    192.246.213.1 192.246 xxx
    205.10.253.45 205.10 253.45
    192.246.210.104 192.246 xxx
    25.140.69.1 25.140 0.69.1
    192.246.62.18 192.246 xxx

    2. Sous VBA
    - Passer par un dictionnaire, en utilisant la fonction split sur l'adresse IP pour garder les 2 premiers champs en clé, les autres en valeurs, à remplacer par 'xxxx.....' si la clé existe déjà
    Voir exemple similaire sous http://www.developpez.net/forums/d16...oupes-valeurs/

  11. #11
    Membre émérite
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Par défaut
    Une possibilité en passant par un dictionnaire...mais on peut faire autrement et sûrement plus simple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Sub Adresse_IP()
    Dim Pl As Range, Dico As Object, i As Long
    Dim T_IP(), T_keys, T_Items
     
    Set Pl = Range("A2:A" & Range("A2").End(xlDown).Row)
    Set Dico = CreateObject("scripting.dictionary")
     
    ReDim T_IP(1 To Pl.Rows.Count)
     
    For Each c In Pl
      i = i + 1: T_IP(i) = c.Value
    Next c
     
    For i = LBound(T_IP) To UBound(T_IP)
      temp = Replace(Split(Replace(T_IP(i), ".", "#", , 1), ".", 2)(0), "#", ".")
      Dico.Item(temp) = Dico.Item(temp) + 1
    Next i
     
    T_keys = Dico.keys: T_Items = Dico.items
     
    For i = LBound(T_keys) To UBound(T_keys)
      If T_Items(i) > 1 Then
        T_keys(i) = T_keys(i) & ".xxx.xxx"
      Else
        T_keys(i) = T_IP(Application.WorksheetFunction.Match(T_keys(i) & "*", T_IP, 0))
      End If
    Next i
     
    [C2].Resize(UBound(T_keys) + 1, 1) = Application.Transpose(T_keys)
     
    End Sub
    A+

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 54
    Par défaut Classer par plage des adresses IP via une macro VB V2
    Bonjour,

    J'ai essayé avec l'idée du dictionnaire, je suis à 95% satisfait du résultat. Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    Dim Long_TAB_ADR_IP As Long
    Dim Key As String
    Dim Value As String
    Dim Step_int As String
    Dim c As Long
    Dim MonDico As New Scripting.Dictionary
     
    Long_TAB_ADR_IP = WorksheetFunction.CountA(Columns(9)) - 2
     
    For c = 8 To Long_TAB_ADR_IP + 7
            Key = Left(Cells(c, 9), InStr(Cells(c, 9), ".") - 1) & "."
            Step_int = Mid(Cells(c, 9), InStr(Cells(c, 9), ".") + 1)
            Step_int = Left(Step_int, InStr(Step_int, ".") - 1)
            Key = Key & Step_int 'Recupération de la partie gauche c'est à dire les deux premiers groupes de chiffres
     
            Value = Mid(Cells(c, 9), InStr(Cells(c, 9), ".") + 1) ' Récupération des deux derniers groupes de chiffres
            Value = Mid(Value, InStr(Value, "."))
     
            If Not MonDico.Exists(Key) Then
                MonDico.Add Key, Key & Value
                Cells(c, 9) = MonDico(Key)
            Else
            Value = Key & ".xxx.xxx"
            Cells(c, 9) = Value
            End If      
    Next
    Voici le résultat : A gauche la colonne de départ ; A droite la colonne après le traitement

    Nom : TAB_IP.png
Affichages : 521
Taille : 48,4 Ko

    Mon soucis c'est que si il existe plusieurs fois le premier doit aussi prendre cette valeur :
    Ex :
    192.255.23.4
    21.245.3.1
    192.255.235.61

    Résultat voulu :
    192.255.xxx.xxx
    21.245.3.1
    Si quelqu'un a une idée ?

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 54
    Par défaut Classer par plage des adresses IP via une macro VB V2
    Re,

    J'ai trouvé ma solution. Enfaite je refais un traitement une fois que j'ai réalisé mon Dictionnaire pour arrivé à mes fins.
    Je poste le traitement pour compléter mon message du dessus. Je vous remercie pour les réponses apportées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    For c = 8 To Long_TAB_ADR_IP + 7
     
        Recherche_ip_day = Left(Cells(c, 9), InStr(Cells(c, 9), ".") - 1) & "."
        test = Mid(Cells(c, 9), InStr(Cells(c, 9), ".") + 1)
        test = Left(test, InStr(test, ".") - 1)
        Recherche_ip_day = Recherche_ip_day & test
     
        For j = 8 To Long_TAB_ADR_IP + 7
            Recherche_ip_day2 = Left(Cells(j, 9), InStr(Cells(j, 9), ".") - 1) & "."
            test2 = Mid(Cells(j, 9), InStr(Cells(j, 9), ".") + 1)
            test2 = Left(test2, InStr(test2, ".") - 1)
            Recherche_ip_day2 = Recherche_ip_day2 & test2
     
            If j <> c Then
                If Recherche_ip_day = Recherche_ip_day2 Then
                    Cells(c, 9) = Recherche_ip_day2 & ".xxx.xxx"
                End If
            End If
        Next
    Next

  14. #14
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour !

    Démonstration en une passe logique à partir de la colonne I ligne 8,
    résultat dans la colonne K, la colonne J devant être vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Demo()
            Const DL = "."
              Dim V, S$(), P$
        With CreateObject("Scripting.Dictionary")
            For Each V In Range("I8", [I8].End(xlDown)).Value
                S = Split(V, DL)
                P = S(0) & DL & S(1)
                If .Exists(P) Then .Item(P) = P & ".xxx.xxx" Else .Item(P) = V
            Next
                [K8].CurrentRegion.Clear
                [K8].Resize(.Count).Value = Application.Transpose(.Items)
                .RemoveAll
        End With
    End Sub
    _________________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

    _________________________________________________________________________________________________________
    Je suis Paris, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  15. #15
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    P'tite démonstration remplaçant directement les données d'origine à partir de la cellule I8

    avec le B-A-BA d'Excel, la fonction EQUIV (Match en VBA) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Demo2()
            Const DL = "."
              Dim KS$(), RS$(), V, S$(), P$, W, L&
        With Range("I8", [I8].End(xlDown)).Rows
                ReDim KS(1 To .Count), RS(1 To .Count, 0)
            For Each V In .Value
                S = Split(V, DL)
                P = S(0) & DL & S(1)
                W = Application.Match(P, KS, 0)
                If IsError(W) Then L = L + 1: KS(L) = P: RS(L, 0) = V Else RS(W, 0) = P & ".xxx.xxx"
            Next
                .Value = RS
        End With
    End Sub
    _________________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé … (Sinon ne pas s'étonner d'être en black list la prochaine fois !)

  16. #16
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 54
    Par défaut Classer par plage des adresses IP via une macro VB V2
    Merci pour ta solutions qui est 100 fois plus rapide et plus optimisé que la mienne.

  17. #17
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Merci de lire le message en dessous de mes codes !

    Le est situé en bas à droite de chaque post, c'est un usage du forum …

  18. #18
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Merci !

    Attention avec la fonction EQUIV (Match en VBA) car tout dépend déjà du nombre de lignes à traiter car
    plus il est important plus cette fonction est chronophage comparativement à l'utilisation de l'objet Dictionary

    Toutefois sans utiliser cet objet le B-A-BA d'Excel est suffisamment rapide pour peu de se creuser les méninges !
    Il suffit de trier la plage au préalable puis d'alimenter une variable tableau par le contenu de la plage triée
    et enfin d'effectuer un traitement par comparaison au sein de la variable tableau …

  19. #19
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Marc_L
    Attention avec la fonction EQUIV (Match en VBA) car tout dépend déjà du nombre de lignes à traiter car
    plus il est important plus cette fonction est chronophage comparativement à l'utilisation de l'objet Dictionary …

    A expliquer aux habitants d'une rade (ils semblent avoir besoin d'en prendre conscience).

  20. #20
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Salut Jacques !

    Par hasard dans le Var ?! C'est pour cela je ne suis pas intervenu dans la discussion en question
    et comme tu as pourtant clairement exposé la problématique …

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2010] [VB] Classer par plage des adresses IP via une macro VB
    Par sticks_678 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 02/01/2017, 08h57
  2. Réponses: 0
    Dernier message: 28/05/2009, 12h52
  3. Réponses: 15
    Dernier message: 01/10/2008, 00h36
  4. Réponses: 45
    Dernier message: 14/02/2008, 16h41
  5. Réponses: 4
    Dernier message: 29/11/2007, 00h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo