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 :

Problème pour trier des données


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 124
    Points : 70
    Points
    70
    Par défaut Problème pour trier des données
    Bonjour le forum,

    Voilà, j'ai un problème pour ordonner des données.
    Je m'explique: je copie des data d'un fichier texte (workbook TreatedFile dans le code) et les colle dans le classeur 2 de mon document excel (workbook WB dans le code).
    Je souhaite ensuite ordonner ces data par ordre (qui peut être alphabétique, mais le plus souvent, cet ordre est numérique). J'ai utilisé la fonction "Sort" dans mon code (ligne en rouge dans le code). Cependant, lorsque je lance le code, une erreur 1004 apparait sur la ligne où la fonction "Sort" apparait.


    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Option Explicit
    
    Sub IV_CEA()
    Dim WB As Workbook, TreatedFile As Workbook
    Dim runnumber As String, OpenFile As String, dl As String, dc As String, area As String, referencearea As String
    Dim sign As String, resign As String
    Dim chemin_fichier_traite As String, chemin_enregistrement As String, fichier_traite As String
    Dim i As Integer
    
    Application.ScreenUpdating = False
    
    Set WB = ThisWorkbook
    
    OpenFile = Application.GetOpenFilename(",*.txt", , "IV File Selection", , False) 
    If VarType(OpenFile) = vbBoolean Then Exit Sub
    
    Set TreatedFile = Application.Workbooks.Open(OpenFile, xlMSDOS)
        fichier_traite = TreatedFile.Name
        chemin_fichier_traite = TreatedFile.Path
        
    With TreatedFile
        dl = Worksheets(1).Range("A1000").End(xlUp).Row 'cherche le nombre de ligne
        dc = Worksheets(1).Range("Z1").End(xlToLeft).Column 'cherche le nombre de colonne
        
        Worksheets(1).Range(Cells(1, 1), Cells(CInt(dl), CInt(dc))).Copy WB.Worksheets(2).Cells(1, 1)
        
        i = 2
        For i = 2 To CInt(dl)
            If Cells(i, 3).Value = Empty Then
                Range(Cells(i, 4), Cells(i, CInt(dc))).Copy WB.Worksheets(2).Cells(i, 3)
            End If
        Next i
       .Close (False)
    End With
    
    With WB.Worksheets(2)
       
        runnumber = WB.Worksheets(2).Cells(2, 1).Value
        referencearea = WB.Worksheets(2).Cells(2, 3).Value
        area = WB.Worksheets(2).Cells(3, 3).Value
        Range(Cells(2, 2), Cells(CInt(dl), CInt(dc))).Sort Key1:=Cells(2, 2), Order1:=xlAscending, Header:=xlGuess
    
        .Range("K:L").Cut WB.Worksheets(2).Cells(1, 19)
        .Range("N:N").Cut WB.Worksheets(2).Cells(1, 21)
        .Range("A:A, C:G, J:L, N:N, P:Q").Delete
        .Rows(1).Font.Bold = True
        
    End With
    End Sub
    Quelqu'un a t-il une idée SVp ?

    J'en profite par la même occasion pour vous faire part des autres problèmes rencontrés:
    suite à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OpenFile = Application.GetOpenFilename(",*.txt", , "IV File Selection", , False)
    j'ai mis la ligne suivante afin de sortir de la macro si aucun fichier n'est sélectionné.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If VarType(OpenFile) = vbBoolean Then Exit Sub
    Il s'avère que si je ne sélectionne aucun fichier, un message d'erreur apparait!! J'avoue ne pas comprendre

    De plus, dans la boucle With où je travaille sur WB.Worksheets(2), bien que je précise au début de la boucle que je travaille dans le classeur 2, si je ne le répète pas à chaque "opération", le code "revient" dans le classeur 1 et fait planter la macro!! Encore une fois, si vous avez une idéé !!

    Je vous remercie d'avance de votre aide,

    Cordialement,
    johann

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 266
    Points : 348
    Points
    348
    Par défaut
    Re-,

    tout d'abord, il me semble que tu as clôturé ce Fil sans même lire la réponse que j'y apportais....

    Notamment au niveau des déclarations de variables (dl en String........ )

    Et de l'utilisation de l'instruction With......(avec les points devant Range et Cells)

    Corrige ces petits points, en premier lieu

  3. #3
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    les range et cells doivent être préfixés par la feuille y correspondant
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    With TreatedFile.Worksheets(1)
        dl = .Range("A1000").End(xlUp).Row 'cherche le nombre de ligne
        dc = .Range("Z1").End(xlToLeft).Column 'cherche le nombre de colonne
     
        .Range(.Cells(1, 1), .Cells(CInt(dl), CInt(dc))).Copy WB.Worksheets(2).Cells(1, 1)
     
        i = 2
        For i = 2 To CInt(dl)
            If .Cells(i, 3).Value = Empty Then
                .Range(.Cells(i, 4), .Cells(i, CInt(dc))).Copy WB.Worksheets(2).Cells(i, 3)
            End If
        Next i
    End With
    point 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim OpenFile As Variant
    If OpenFile = false Then Exit Sub

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 124
    Points : 70
    Points
    70
    Par défaut
    bonjour mercatog et mapeh,

    tout d'abord, merci de votre aide.

    mapeh, au risque de passer pour un ignorant, que veux-tu dire par "clôturé ce Fil", sans même regarder ta réponse. J'avoue ne pas comprendre et m'excuse sincèrement des erreurs de manip que j'ai pu commettre.

    Sincèrement merci pour les points devant les range et cells. La prochaine fois, j'éviterai; je pense maintenant bien comprendre pourquoi l'on doit mettre des points (pour bien faire référence "aux objets contenus dans la boucle with").

    mercaog, merci pour le point 2.

    Enfin, pour le dl, j'imagine que c'est un integer??

    Merci beaucoup ,
    johann

  5. #5
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    si on écrit il se réfère au range X de la feuille active
    si on écrit il se réfère au range X de la feuille N du classeur actif
    si on écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks(Z).sheets(N).range(X)
    tu devine

    maintenant au lieu d'écrire par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sheets(N).range(sheets(N).cells(x,y),sheets(N).cells(z,t))
    il est préférable (pour la lisibilité et la simplicité d'écriture du code) d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With sheets(N)
       .range(.cells(x,y),.cells(z,t))
    end with

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 266
    Points : 348
    Points
    348
    Par défaut
    Re-,

    dans le fil que tu as clotûré (c'est marqué [RESOLU]), je t'expliquai comment utiliser l'instruction "With ..."

    Et aussi, comment déclarer tes variables

    Persos, pour les colonnes, j'utilise Integer (qui va jusqu'à 16 384)

    Et pour les lignes, Long (plus de 2 milliards)

    comme tu ne sais pas combien de lignes tu peux avoir, mieux vaut prévoir au max.....

    Si tu déclares ces deux variables (dc as Integer, dl as Long), tu n'as plus besoin de rajouter CInt

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 124
    Points : 70
    Points
    70
    Par défaut
    merci de vos réponses respectives.

    Désolé pour le niveau des questions

    mapeh,
    je m'excuse pour la clôture de l'autre fil, mais comme j'ai vue que la cause de l'erreur était autre, je l'ai clôturé sans regardé, je l'avoue. Sincèrement désolé.

    Le code fonctionne maintenant à merveille.

    Encore merci,
    Johann

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

Discussions similaires

  1. Problème Macro pour trier des données
    Par lmb19 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/11/2010, 00h00
  2. [BO XIR2] Problème pour lier des données
    Par LaPanic dans le forum Deski
    Réponses: 3
    Dernier message: 10/02/2008, 17h04
  3. [Tableaux] Problème pour modifier des données
    Par Oli_Ifre dans le forum Langage
    Réponses: 8
    Dernier message: 11/04/2007, 15h33
  4. [LDAP] problème pour récupérer des données
    Par Bizoo dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 06/04/2007, 09h09
  5. Problème pour rentrer des données dans MySQL
    Par Sandara dans le forum Requêtes
    Réponses: 8
    Dernier message: 06/06/2006, 10h59

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