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 :

modifier un nombre sur une plage


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
    Octobre 2002
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 160
    Par défaut modifier un nombre sur une plage
    Bonjour à tous et toutes,

    J'ai eu un soucis d'exportation avec labview et les rapports automatiques.
    Le logiciel a exporté les données, mais les nombres au dessus de 1 (et inférieur à 1), il a supprimé la virgule et mis tous bout à bout.
    Par exemple -1,206055 s'est transformée en -1 206 055.
    Je dois donc remplacer toutes mes valeurs (tableau de 50000 valeur reparties aléatoirement dans ma colonne).
    Je ne vois pas trop ce que je peux appliquer, car la division par une puissance de 10 serait pas forcement bonne (ça dépend de la précision de mon essai, ici 10^-6, mais parfois 10^-5 etc).
    Il faut donc que je remplace textuellement la valeur en remettant la virgule au bonne endroit.
    Heureusement aucune de mes valeurs n'atteint 10 ou -10.
    Les valeurs en dessous -1 et au dessus de 1 sont resté normales.

    Avez vous des idées ?

    J'ai ajouté en pièce jointe, un fichier très réduit mais présentant l'erreur.
    J'ai juste mis le corps d'une macro pour lire ma colonne.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,

    Tu as enregistré ton fichier au format xlsx. Avec cette extension il n'y a pas de macro. (choisir xlsm)

    Peux tu la coller dans un post

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 160
    Par défaut
    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
    Sub reecriture()
     
    Dim FL1 As Worksheet, NoCol As Integer
    Dim NoLig As Long, Var As Variant
        Set FL1 = Worksheets("Relevé")
        NoCol = 2 'lecture de la colonne 1
        For NoLig = 1 To Split(FL1.UsedRange.Address, "$")(4)
            Var = FL1.Cells(NoLig, NoCol)
            Case Var > 1
     
            FL1.Cells(NoLig, NoCol) = Var
     
     
        Next
        Set FL1 = Nothing
     
    End Sub

  4. #4
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Tu peux essayer comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test()
    Dim Plage As Range, Cel As Range
        With Worksheets("Relevé")
            Set Plage = .Range("A1").CurrentRegion
            Set Plage = Plage.Offset(1, 0).Resize(Plage.Rows.Count - 1, Plage.Columns.Count)
            For Each Cel In Plage
                If Abs(Cel) >= 10 Then Cel = Cel / 10 ^ (Len(Abs(Cel)) - 1)
            Next Cel
        End With
    End Sub
    Cordialement.

  5. #5
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Ci dessous un code qui recompose tes montants.
    Par prudence, ils vont se mettre en colonne E

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim i As Long
     
    For i = 2 To Range("B" & Rows.Count).End(xlUp).Row
        If InStr(CStr(Range("B" & i).Value), Application.DecimalSeparator) = 0 Then
            Range("E" & i).Value = Left(Range("B" & i).Value, 2) & Application.DecimalSeparator & Mid(Range("B" & i).Value, 3)
        End If
    Next i

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 160
    Par défaut
    Bonjour à tous,
    J'ai essayé ta solution Fontaine, ca a écrit le même nombre dans la case E.
    J'essaye ta solution gFZT82 qui semble bien fonctionner.

    Par contre, mon relevé ne fait pas 50000 mais 500 000 ligne. Du coup, enfin si je sais le code que tu as mis, il charge en mémoire les 500 000 ligne dans set plage ?

  7. #7
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Pour définir la plage à traiter, le code utilise la propriété CurrentRegion qui représente la zone en cours.
    Cette zone est limitée par toute combinaison de lignes et de colonnes vides.
    Donc, la question qui se pose est de savoir de combien de lignes et de colonnes se compose cette zone dans ton document.
    Tel qu’il est conçu, le programme va balayer toutes les cellules de cette zone, ce qui risque de prendre un temps non négligeable.
    Il y a plusieurs solutions pour optimiser le traitement.
    La première, c’est de cibler la zone à traiter (si seulement 2 colonnes sont concernées, il est inutile d’en balayer 20, idem pour les lignes).
    Ensuite, on peut transiter par un tableau pour accélérer le traitement.
    Enfin, on peut gagner du temps sur les calculs et le rafraichissement d’écran.

    Cordialement.

Discussions similaires

  1. Requête sur une plage de date
    Par altecad dans le forum Requêtes
    Réponses: 1
    Dernier message: 23/05/2007, 15h11
  2. [Formule]recup de données sur une plage
    Par b.amine dans le forum Excel
    Réponses: 4
    Dernier message: 26/04/2007, 08h58
  3. [PEAR] Ping sur une plage réseau
    Par patine31 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 26/02/2007, 12h08
  4. Modifier un commentaire sur une table ?
    Par schniouf dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 15/02/2007, 14h20
  5. [Tableaux] Modifier un tableau sur une page en PHP
    Par leclone dans le forum Langage
    Réponses: 12
    Dernier message: 02/01/2007, 14h06

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