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 :

Du premier au dernier ..


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 67
    Par défaut Du premier au dernier ..
    Bjr,
    Voici mon probleme

    J'ai ecrit ce code ( et ca fonctionne )

    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
    Sub Macro1()
    zz = Timer
    Range("Q2").Select
    Do
    temp = ActiveCell.Value
    fm = Left(temp, 1)
    With ActiveWorkbook.Worksheets(1).Columns("J:J").Cells
       Set c = .Find(what:=temp, LookIn:=xlValues _
           , LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
           MatchCase:=False)
           If Not c Is Nothing Then
                   Select Case fm
            Case 6
            ActiveCell.Offset(0, -9).Value = "interne M"
            Case Else
            ActiveCell.Offset(0, -9).Value = "interne F"
            End Select
        Else
        ActiveCell.Offset(0, -9).Value = "externe"
        End If
     
    End With
    ActiveCell.Offset(1, 0).Activate
     
    Loop Until IsEmpty(ActiveCell)
    zz1 = Timer
    zz1 = zz1 - zz
    MsgBox (zz1)
    End Sub
    Je lis la valeur des cellules de la colonne Q ( à partir de Q2) et je recherche s'il y a une occurence dans la colonne J
    Si oui, en fonction du premier caractere de la cellule active ( colonne Q) j'ecris interne F ou interne M,
    Si non , j'ecris externe
    et je boucle tant que que je ne suis pas au bout de la colonne Q

    Concretement, c'est un fichier de com telephoniques et je regarde si mon VPN est rentable ( pourcentage de communications internes fixes ou mobiles par rapport au pourcentage de communications externes)

    Alors mon probleme c'est le temps de traitement

    j'en suis à 81 secondes pour 1000 lignes

    Sachant que mon fichier mensuel excede les 40 000 lignes, je vous raconte pas le temps....

    D'où ma nouvelle approche

    1) trier la colonne Q
    2) rechercher dans la colonne J les occurences et comme avant ecrire le resultat

    mon probleme , c'est que une fois que j'ai trié la colonne Q, je ne vois pas comment aller du premier au dernier element identique de cette colonne Q....

  2. #2
    Membre chevronné
    Inscrit en
    Octobre 2008
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Octobre 2008
    Messages : 273
    Par défaut
    Bonjour,

    Tu peux faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while cells(i, 1).value = cells(i+1, 1).value
    à adapter bien sûr

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut yalefe et le forum
    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
    Sub Macro1()
    zz = Timer
    For X = Range("Q" & Rows.Count).End(xlUp).Row To 2 Step -1
        If Range("Q" & X) <> Range("Q" & X) Then
            With ActiveWorkbook.Worksheets(1).Columns("J:J").Cells
               Set c = .Find(what:=Range("Q" & X), LookIn:=xlValues, _ 
                       LookAt:=xlPart, earchOrder:=xlByRows, _
                       SearchDirection:=xlNext, MatchCase:=False)
               If c Is Nothing Then
                  Range("H" & X) = "externe"
               else
                  if Left(Range("Q" & X),  1) = 6 then
                     Range("H" & X) = "interne M"
                  Else
                     Range("H" & X) = "interne F"
                  end if
               End If
            End With
        End If
    Next X
    zz1 = Timer
    zz1 = zz1 - zz
    MsgBox (zz1)
    End Sub
    J'ai juste modifié en direct, donc il faut vérifier

    Tu peux ajouter Application.ScreenUpdating = false au début de ta macro et True à la fin, mais comme, pour moi, toute instruction du niveau Application entraîne une gestion d'erreur, je ne l'ai pas fait.

    Si tu ne travailles plus avec des select/activecell, tu verras que tes macros s'accélèrent notablement.

    Ton idée de Timer est bonne, mais... ça suppose que tu n'as pas beaucoup d'autres logiciels en route : par défaut, il me semble que c'est 80%/20% en faveur de l'application active, par rapport aux tâches de fond, mais ça peut faire jusqu'à 16 secondes de différence.

    A+

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 67
    Par défaut
    merci a vous deux

    je regarde çà cet après-midi

    Le timer c'était juste pour avoir une idée du temps d'execution

    J'ai lancé la macro sur les 41 000 lignes

    Quand j'ai vu qu'il fallait presque une heure de traitement , ca m'a fait peur

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/02/2007, 19h20
  2. Le premier et dernier jour du mois dernier
    Par Tartenpion dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/10/2006, 20h59
  3. [Dates] Premier et dernier jour du mois
    Par Jarodd dans le forum Langage
    Réponses: 6
    Dernier message: 04/08/2006, 11h52
  4. Enlever la premiere et derniere ligne
    Par Slein dans le forum Linux
    Réponses: 2
    Dernier message: 28/07/2006, 13h30
  5. premier et dernier jour du mois
    Par oneill701 dans le forum Bases de données
    Réponses: 9
    Dernier message: 21/06/2006, 12h05

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