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 :

Débutant : diviser un tableau de valeur par 1000


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Par défaut Débutant : diviser un tableau de valeur par 1000
    Bonjour,

    Voilà j'ai un tableau de nombre assez conséquent et je voudrais diviser tous les nombres qu'il contient par 1000.
    Je sais diviser les cases une par une, mais mon objectif est de réduire au maximum le temps d'execution de la macro.

    N'hésitez pas à me demander des précisions.

    Merci

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

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Bonjour et

    Je ne vois pas d'autre solution que d'effectuer les opérations une à une mais concernant le temps d'exécution, il faudrait montrer le code que tu as fait pour voir si on peut l'optimiser.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    '    Dim i, j
    '    i = 2
    '    While ActiveSheet.Cells(i, 1) <> ""
    '        j = 2
    '        While ActiveSheet.Cells(1, j) <> ""
    '            ActiveSheet.Cells(i, j).Replace What:="á", Replacement:=""
    '            ActiveSheet.Cells(i, j) = ActiveSheet.Cells(i, j) / 1000
    '            j = j + 1
    '        Wend
    '        i = i + 1
    '    Wend
    oui bonne remarque

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

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Ci-dessous un bout de code (non testé), tu peux me dire si tu as une meilleure vitesse d'exécution ?
    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 test()
    Dim Cel As Range, DerL As Integer, DerC As Integer, Plage As Range
     
    DerL = Cells(Rows.Count, 2).End(xlUp).Row
    DerC = Cells(2, colums.Count).End(xlToLeft).Column
    Set Plage = Range(Cells(2, 2), Cells(DerL, DerC))
     
    Plage.Replace What:="á", Replacement:=""
     
    For Each Cel In Plage
        If Cel <> "" Then Cel.Value = Cel.Value / 1000
    Next
     
    End Sub

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Par défaut
    Il n aime pas trop cett ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DerC = Cells(2, colums.Count).End(xlToLeft).Column
    Au passage tu peux oublier l'histoire de remplacer le "à" j ai résolu ce problème

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

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    pfff il fait le difficile...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DerC = Cells(2, Columns.Count).End(xlToLeft).Column

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Par défaut
    lol désolé , j'avoue je fais le boulet mais je ne maitrise vraiment pas la syntaxe

    Le temps d execution est exactement le même, et j ai une petite erreur à la fin sur : Cel.Value = Cel.Value / 1000.

    Merci tout de même

  8. #8
    Membre éprouvé
    Inscrit en
    Mai 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 104
    Par défaut
    Bonjour,

    Autre technique "comme à la main" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub essai()
    Divise "A1:C65000", 1000, 10
    End Sub
     
    Sub Divise(MaPlage As String, MonDiviseur As Double, Optional Decalage As Integer = 1)
    If MonDiviseur = 0 Then Exit Sub
    With Range(MaPlage).Offset(0, Decalage)
        .FormulaR1C1 = "=RC[-" & Decalage & "]/" & MonDiviseur
        .Copy
        Range(MaPlage).PasteSpecial xlPasteValues
        .ClearContents
    End With
    End Sub
    Inconvénients : il faut des colonnes de manoeuvre, et ça met des 0 dans les cellule vides
    L'exemple ci dessus avec 3 * 65000 cellules remplies ~1s sur une machine "milieu de gamme".

    Attention pour les temps au reste de ton tableau : ce qui est long en général ce sont les recalculs ! Essaye aussi en ajoutant simplement un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Calculation = xlCalculationManual
    anvant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Calculation =xlCalculationAutomatic
    après
    (mais pas avec ma méthode) !

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Fring : ne pensez-vous pas que par sécurité il vaudrait mieux déclarer :

    J'avais commencé un test avec 47000 lignes et en mettant votre
    code, bien sûr, j'ai eu un dépassement de capacité.

    A toutes fins utiles

  10. #10
    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
    Par défaut
    Tu peux aussi créer un tableau de ta plage de cellules
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
    Dim Tablo As Variant
    Application.ScreenUpdating = False
    'Crée le tableau
        Tablo = Range(Cells(1, 1), Cells(Range("A65536").End(xlUp).Row, Range("IV1").End(xlToLeft).Column)).Value
        For i = 1 To Range("IV1").End(xlToLeft).Column
            For j = 1 To UBound(Tablo)
                Cells(j, i) = CSng(Tablo(j, i) / 1000)
            Next
        Next
    Application.ScreenUpdating = True
    End Sub
    Fonctionne ainsi si... tu as des en-têtes de colonnes...

    Citation Envoyé par sebest95
    Il n aime pas trop cett ligne :
    DerC = Cells(2, colums.Count).End(xlToLeft).Column
    "Il" a raison, moi non plus

    Edit
    Ok, je corrige aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim i as Integer, j as long
    (ici, i est le N° de colonne)

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

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Oui Jacques-Jean, bonne remarque, mais il faut avouer qu'il est rare de rencontrer un tableau de plus de 35000 lignes...
    De toute façon tu as raison, par sécurité il est préférable de déclarer As Long

    EDIT : je viens de faire un test avec la solution d'Ousk et la mienne, sur un tableau de 5000 lignes et 150 colonnes, j'obtiens le même temps d'exécution, une trentaine de secondes pour chaque procédure

  12. #12
    Membre éprouvé
    Inscrit en
    Mai 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 104
    Par défaut
    Salut,

    Citation Envoyé par fring Voir le message
    je viens de faire un test avec la solution d'Ousk et la mienne, sur un tableau de 5000 lignes et 150 colonnes, j'obtiens le même temps d'exécution, une trentaine de secondes pour chaque procédure
    Ah 150 colonnes je ne peux pas je suis en 2000, mais 120 colonnes x 10000 lignes ma méthode met 2 secondes, 120 colonnes x 65000 lignes elle met mémoire insuffisante, et puis Excel a explosé en vol !

  13. #13
    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
    Par défaut
    Avec 55000 lignes, effectivement, guère plus de 2 secondes.

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

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Avec 55000 lignes, effectivement, guère plus de 2 secondes.
    Bin... c'est LA solution alors.
    Je ne comprend pas pourquoi chez moi cette procédure prend 30 secondes, j'ai sans doute du louper quelque chose.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Par défaut
    Merci beaucoup de vos aides !!! Mais malheureusement après avoir essayé la méthode de ous, je ne gagne pas en temps de calcul .

    Par contre la méthode de Bevan me semle très interessante étant donné que j ai des colonnes de dispo.

    Mais un problème en amène un autre...
    Les nombres que je veux diviser sont sous cette forme : "28 016", l'espace est bien réel et n'est pas du à une mise en forme.
    J'arrive aussi à obtenir mes chiffres sous la forme "28á016" en fonction de comment j'importe le fichier. (dans le fichier original il y a ien un espace).

    Donc pour résumer il n'apprécie pas quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .FormulaR1C1 = "=RC[-" & Decalage & "]/" & MonDiviseur
    car il ne reconnait pas en tant que nombre ma variable.

    J'avais pensé inséré un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "=SUBSTITUE(C2;"á";"")/1000"
    dans la formule ci dessus, mais trop de " ne lui plaise pas apparement.

    Une idée, des questions, n'hésitez pas !

  16. #16
    Membre éprouvé
    Inscrit en
    Mai 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 104
    Par défaut
    Quand tu mets des " entre des "" il faut les doubler.

    Si tu veut mettre "Boujour !" au milieu d'in string ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dialogue = "Il salua : ""Bonjour !"", et s'assit"
    Pour une chaine vide ça fait donc 4 "

    MAIS
    Je crois qu'il vaudrait mieux nettoyer avant avec un bon coup de remplacement sur toute la plage (... en fait j'en suis sûr)

  17. #17
    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
    Par défaut
    sebest, comment as-tu supprimé tes "à" ?
    Pour tes espaces, tu sélectionnes ta/tes colonne(s) et tu fais remplacer " " par "" + Remplacer tout. Pour le faire par macro, enregistre en faisant
    Ensuite, vérifie que ta/tes colonne(s) sont bien au format nombre.
    Bon après-midi.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Par défaut
    @Bevan

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .FormulaR1C1 = "=SUBSTITUE(RC[-" & Decalage & "];""á"";"""")/" & MonDiviseur
    J'ai tenté ça pour remplacer mes à, mais apparement ça lui plait pas trop , il est impossible de procéder comem ça.

    @ouskel'n'or
    Pour le faire par macro, enregistre en faisant
    Qu'entends tu par là ? Oui tout est bien au format nombre, ça ne change rien hélas.

    Pour les à en gros

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim appExcel As Excel.Application   'Application Excel
    Dim wbExcel As Excel.Workbook       'Classeur Excel
    Set appExcel = CreateObject("Excel.Application")
     
    Workbooks.OpenText Filename:="C:\Users\gonnetse\Desktop\Mes Tuto\VB\Atterrissage\exp pelletier.txt"
     
    Set wbExcel = appExcel.ActiveWorkbook
    Là j ai pas de à, si je mets que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks.OpenText Filename:="C:\Users\gonnetse\Desktop\Mes Tuto\VB\Atterrissage\exp pelletier.txt"
    Alors j en ai... mais bon ça change rien vu que l espace ou le à c est le même problème ici.

  19. #19
    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
    Par défaut
    Pour remplacer les caractères "à" ou espace dans les deux colonnes A et E par exemple, tu peux faire ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Range("A:A,E:E").Replace What:=" ", Replacement:="", LookAt:=xlPart
        Range("A:A,E:E").Replace What:="à", Replacement:="", LookAt:=xlPart
    Pour les remplacer dans toute la feuille, tu peux faire ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Cells.Replace What:=" ", Replacement:="", LookAt:=xlPart
        Cells.Replace What:="à", Replacement:="", LookAt:=xlPart
    Mets bien le nom de la feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("feuil1").cells......
    A+

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Par défaut
    Merci à tous en utilisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Cells.Replace What:=" ", Replacement:="", LookAt:=xlPart
        Cells.Replace What:="à", Replacement:="", LookAt:=xlPart
    Ainsi que la procédure de Bevan j'ai grandement amélioré mon temps de calcul !!

    Merci beaucoup !!!!

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/01/2009, 12h32
  2. Réponses: 12
    Dernier message: 09/12/2007, 12h52
  3. Réponses: 2
    Dernier message: 03/10/2005, 22h16
  4. Débutant -> Valeur par defaut
    Par broke dans le forum Access
    Réponses: 6
    Dernier message: 22/09/2005, 23h23
  5. [Débutant(e)]valeur par défaut dans méthodes
    Par seiryujay dans le forum Langage
    Réponses: 3
    Dernier message: 13/07/2005, 12h02

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