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 :

comparer 2 nombre pour insérer des lignes


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 57
    Points
    57
    Par défaut comparer 2 nombre pour insérer des lignes
    Bonjour,

    La colonne A contient des chiffre de 1 à 300 et tous les chiffres ne sont pas présents
    et je voudrais rajouter des lignes pour de nouveaux chiifres
    par exemple si je veux rajouter le chiffre 63 je crée une ligne qui vient juste après le chiffre 60 ( car le 61 et 62 ne sont pas présents) donc il faut que je trouve le chiffre juste apres ou avant le 63
    le code est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for i = 1 to 300 
    if cells(i,1).value > 63 then rows(i).insert
    mais le probleme c'est qu'il m'insert plein de ligne ce qui et normal vu que plein de nombre sont supérieurs à 63 , il faut donc trouver le chiffre juste apre ou avant et je ne sais pas comment faire.

    Merci de m'aider car il n'y a pas qu'une seule ligne à créer.

  2. #2
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Hello,

    Tu n'es pas loin de la solution, il faut juste lui dire de stopper après avoir trouvé le chiffre ou d'avoir inséré la ligne.

    Essaye comme ceci :
    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
    Sub test()
    Dim i As Integer, x As Integer
     
    x = 63
     
    For i = 1 To 300
        If Cells(i, 1) = x Then
            MsgBox x & " existe déjà"
            Exit Sub
        End If
        If Cells(i, 1) > x Then
            Rows(i).Insert
            Cells(i, 1) = x
            Exit For
        End If
    Next i
     
    End Sub

  3. #3
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonsoir,

    Il faut procéder autrement, pour gagner du temps dans la boucle...
    Même avec des milliers de lignes, on y parvient avec un maximum de 16 lectures, en agissant exactement de la même maniière qu'en cherchant dans un dictionnaire....

    1) on va au milieu
    si plus milieu plus grand, on va au milieu de la 1ère moitié
    si milieu plus petit, on va au milieu de la 2ème moitié
    2) et on recommence etc...
    16 lectures de cette sorte suffisent pour des milliers

    Edit :

    Preuve de ce raisonnement de milieux de moitiés :
    Ici on cherche tout et sur 100000

    (16 opérations suffisent pour 100000) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Command1_Click()
     toto = 100000
     avoirencore = toto
     nb = 0
     Do While avoirencore >= 2
       avoirencore = avoirencore / 2
       nb = nb + 1
     Loop
     MsgBox nb
    End Sub
    Exercez-vous à appliquer ...

  4. #4
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    je vais d'abord devoir aller acheter Excel 2007

    Merci pour l'astuce, je me la colle dans un coin

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    j'ai pas trop compris comment trouver 63 dans ta boucle, mais si je rajoute un 0 a toto, j'obtien nb = 19 et avec un 0 de plus, c'est 23. ce qui est peu, je te l'accorde, mais en contradiction avec ce que tu affirme.
    mais, je ne lance pas un concours hein , c'est pas de mon niveau ça
    Amicalement

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    B onsoir, alsimbad...

    Relis donc : 16 pour des milliers (en fait, même pour 100000).
    Citation Envoyé par ucfoutu Voir le message
    Même avec des milliers de lignes, on y parvient avec un maximum de 16 lectures,
    avec un zéro de plus, tu passes à des millions et avec 2 zéros de plus, à des dizaines de millions.... hein

    Dans tous les cas de figure, la différence entre les nombres maximum de lectures nécessaires est ..... sans commune mesure (23 lectures pour 10 millions ? ==>> de la rigolade par rapport à 10 millions de lectures "classiques" ...)

    Bonne nuit...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 57
    Points
    57
    Par défaut
    Bonsoir,

    j'ai pas trop bien compris vos histoires de lecture
    c'est pour gagner du temps lorsque que la macro tourne?
    quelqu'un peut il m'expliquer
    merci

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Votre code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i = 1 to 300 
    if cells(i,1).value > 63 then rows(i).insert
    fait que dès que la valeur de la cellule est > 63 vous ajoutez une ligne et vous affectez la valeur "63".

    En effet vous avez écrit :

    ( car le 61 et 62 ne sont pas présents)

    Vous, vous le savez peut-être !!!!

    Il faudrait peut-être écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i = 1 to 300 
    if cells(i,1).value > 63 then 
    
    if cells(i-1, 1) < 63
    rows(i).insert end if end if
    Ensuite vous pourrez étudier la solution de Ucfoutu pour optimiser.

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Citation Envoyé par moimemessssssssss Voir le message
    Bonsoir,

    j'ai pas trop bien compris vos histoires de lecture
    c'est pour gagner du temps lorsque que la macro tourne?
    quelqu'un peut il m'expliquer
    merci
    Je veux bien me lancer, c'est le même principe que la recherche dichotomique.
    ucfoutu est pourtant très clair mais il explique comme quelqu'un qui sait, pas comme quelqu'un qui sait faire savoir
    Sous ton contrôle, uc ?
    Tu dis donc (mes commentaires sont en bleu)

    1) on va au milieu de la plage (soit 100000 lignes /2 = ligne 50000)
    On lit la cellule

    si plus milieu plus grand, (si la cellule contient un nombre > 63 alors on est trop loin)
    on va au milieu de la 1ère moitié de la plage soit sur la ligne 25000) et on vérifie
    si plus milieu toujours plus grand, on va au milieu de la plage scrutée soit à la ligne 12500... etc

    si milieu plus petit, (on reprend à la ligne 50000) si la cellule contient un nombre < 63 alors la ligne 63 sera dans la seconde moitié de la plage, soit à plus de 50000
    on va au milieu de la 2ème moitié (au lieu d'aller à la ligne suivante, on reprend en allant à la moitié de la plage restante, soit ligne 75000)
    2) et on recommence etc... (dans un sens (+ moitié) ou dans l'autre (- moitié) de la plage précédente)

    Un exemple : 63 est à la ligne 76250
    Tu vas aller successivement sur les lignes
    50000
    75000
    87500
    81250
    78125
    76563
    etc.
    Bien sûr, c'est à adapter puisque les moitiés de ligne n'existent pas mais en prenant l'entier, tu sais toujours si la valeur lue sur la ligne est supérieure ou inférieure à la valeur comparée.
    Tu constates qu'au lieu de lire 76250 lignes, on n'en lira que... beaucoup moins

    Ai-je bien expliqué ?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 57
    Points
    57
    Par défaut
    Bonsoir à tous,

    merci pour vos réponses
    c'est bon je crois que maintenant j'ai compris.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Insérer des lignes copiées en nombre variable
    Par bomimi dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 25/01/2015, 11h03
  2. Réponses: 2
    Dernier message: 08/04/2010, 12h26
  3. [VBA-E] Problème pour insérer des lignes dans une feuille Excel
    Par skystef dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/04/2007, 14h13
  4. boucle pour insérer des enregistrements
    Par roots_man dans le forum ASP
    Réponses: 7
    Dernier message: 05/10/2004, 09h28
  5. Shell pour supprimer des lignes d'un fichier
    Par nelsa dans le forum Autres langages
    Réponses: 2
    Dernier message: 20/09/2004, 12h26

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