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 :

Macro suppression colonnes et texte [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Par défaut Macro suppression colonnes et texte
    Bonjour à tous,

    Dans le cadre de préparations de données avant analyses statistiques, je cherche à développer une macro qui:

    1)Compile plusieurs .csv en un seul (déjà trouvé)
    2)Supprime les 2 premières colonnes / ou ne conserve que la troisième.
    3)Supprime les lignes contenant des cellules avec du texte. (Si cette fonction générale est trop complexe, les lignes que je souhaite supprimer à cette étape sont remplies avec "Load" ou "(N)".)

    Les tableaux sur lesquels je travaille sont constitués de plusieurs milliers de lignes, et cette opération est à répéter 60x. Vous comprendrez bien que si je peux me réduire à "seulement" faire tourner cette macro 60x, ce sera pour moi un pas de géant! Bien que programmant un peu avec Matlab, je suis au niveau zéro de la programmation sur Excel..

    Voici ci dessous la macro que j'ai pu trouver pour réaliser la tâche n°1, quelqu'un aurait il une idée de comment la compléter pour réaliser les tâches 2) et 3)?

    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
    Sub Compilation()
    Dim Temp As String
    Dim Ligne As Long
    Temp = Dir(ActiveWorkbook.Path & "\*.csv")
    Application.DisplayAlerts = False
    Do While Temp <> ""
    If Temp <> "Recap.xls" Then
    Workbooks.Open ActiveWorkbook.Path & "\" & Temp
    Workbooks(Temp).Sheets(1).Range("A1").CurrentRegion.Copy
    Workbooks("Recap.xls").Sheets(1).Activate
    Ligne = Sheets(1).Range("A65536").End(xlUp).Row + 1
    Range("A" & CStr(Ligne)).Select
    ActiveSheet.Paste
    Workbooks(Temp).Close
    End If
    Temp = Dir
    Loop
    Range("A1").Select
    Application.DisplayAlerts = True
    End Sub
    Merci !

  2. #2
    Membre chevronné Avatar de pyloupylou
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 438
    Par défaut hello
    si j'ai bien compris, tu veux ouvrir chaque fichier et supprimer des colonnes et réenregistrer.
    en fait tu peux appliquer un principe
    tu ouvres ton fichier
    tu sélectionne la plage à sauvegarder
    tu copies la plage dans un tableau variant
    tu sélectionnes la totalité de ta feuille
    tu effaces
    puis tu recharges depuis ton tableau variant.
    tu sauvegardes et tu passes au suivant.

    un rien de suivi en débug pour la mise au point , et le tour est joué.

    c'est un peu bourrin mais en tous cas je pense que c'est le plus rapide

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Par défaut
    Bonjour pyloupylou et merci de t'intéresser à mon problème!

    La séquence que tu propose en copiant la zone d'intérêt (colonne 3) puis effacer le reste et coller cette zone d'intéret me semble une bonne solution cohérente pour effectuer l'étape 2.

    Par contre, comme mentionné dans mon premier message, je ne connais pas du tout le langage et la syntaxe des VBA sur Excel, qui plus est je ne suis pas informaticien de formation.

    Si cette séquence n'est pas trop longue, saurais-tu me la détailler? Il faut que je l'insère avant ou après le dernier ?

    Merci !

  4. #4
    Membre chevronné Avatar de pyloupylou
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 438
    Par défaut
    tes fichiers il sont en csv (séparateur .
    lorsque tu les ouvres, ils se mettent en colonnes

    t'as déjà le nombre de ligne
    trouve le nombre de colonne
    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
     
    'du style dans ta boucle
    'une fois que ton fichier est ouvert
    dim nbcol as integer
    dim tableau() 
    ...
     nbcol = Application.WorksheetFunction.CountA("1;1")
    tableau()=Range(Cells(1, x), Cells(ligne, nbcol))
    ' à partir d'ici tu suis en débug
    ' pour voir comment est ton tableau
    ' tu auras besoin peut être de le transposer
    ' Remarque : le X te permets de jouer sur le numéro de colonne à
    ' partir duquel tu veux récupérer tes données
    '
    '
    '
    conseils:
    recherche l'utilisation des tableaux, y a d'excellents tutos sur le site
    2eme conseil indente ton code en décalant dès que t'as une boucle ou un test sinon c'est vite illisible

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Par défaut
    Merci Pyloupylou pour les pistes, malheureusement je passe déjà (trop) de temps sur R et Matlab pour pouvoir me mettre sérieusement au VBA.

    Je pensais que ce serait des manips faciles étant donné que j'ai déjà la boucle de compilation et que que cela prendrait uniquement quelques lignes de code en plus.

    J'ai de nouveau réfléchi à mon problème problème, et plutôt que de créer 2 boucles supplémentaires pour la tâche 2 et 3, il y a surement une solution plus évidente : Au moment où je charge dans ma boucle le .csv à copier (compilation), il faudrait que je précise que je ne veux copier que la colonne 3 et les lignes 3 à n.

    Sur le code que j'ai fourni dans mon premier message, à quel endroit sont ces variables à renseigner? J'ai l'intuition que cela ne se joue qu'à un ou deux champs à changer, et que le but est proche!

  6. #6
    Membre chevronné Avatar de pyloupylou
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 438
    Par défaut
    hello

    quand tu dis que t'as pas le temps de te mettre au vba, je veux bien, mais il faut quand même chercher un peu....
    Ce n'est pas la peine de chercher à tout savoir, mais il faut simplement savoir ou chercher.... (seconde philosophique)

    voici ton code
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    ' force la déclaration des variables
    Option Explicit
     
     
    Sub Compilation()
    Dim Temp As String
     
    Dim Ligne As Long, nbcol As Integer, ligne_destin As Integer
     
    Temp = Dir(ActiveWorkbook.Path & "\*.csv")
    Application.DisplayAlerts = False
     
    ' ligne de destination dans récap
    ligne_destin = 0
    Do While Temp <> ""
        ' attention je suis en 2010 donc les noms de fichiers sont différents
        ' pour toi il faut que tu changes probablement en xls"
        If Temp <> "Recap.xlsm" Then
            ' le local true t'ouvres normalement ton fichier csv en répartissant selon les ;
            Workbooks.Open ActiveWorkbook.Path & "\" & Temp, local:=True
            ' du coup ta copie est inutile
    '        Workbooks(Temp).Sheets(1).Range("A1").CurrentRegion.Copy
            ' j'ai laissé ta sélection de ligne mais ai enlevé le +1
            Ligne = Sheets(1).Range("A65536").End(xlUp).Row
     
            ' on détecte le nombre de colonne
            nbcol = Application.WorksheetFunction.CountA(Range("1:1"))
     
            ' j'appelle la fonction qui va remplir récap
            Call recopie(Ligne, nbcol, ligne_destin + 1)
     
            ' on déplace la ligne de destination
            ligne_destin = Ligne
     
            'on ferme
            Workbooks(Temp).Close
        End If
        ' et on boucle
        Temp = Dir
    Loop
    Range("A1").Select
    Application.DisplayAlerts = True
    End Sub
    '
    ' fonction de recopie de plage
    ' paramètre  ligne max, colonne max et ou copier dans recap
    Function recopie(lig_max, col_max, ou_copier)
     
    'tableau variant
    Dim tableau()
    ' variable qui permet de définir à partir de quelle colonne
    ' on capture
    Dim a_partir_quelle_colonne As Integer
     
    'on copie à partir de la colonne 3
    a_partir_quelle_colonne = 3
     
    ' je charge le tableau à partir de la plage
    ' tu peux suivre en débug ( ajouter espion sur tableau et suivre F8
    tableau() = Range(Cells(1, a_partir_quelle_colonne), Cells(lig_max, col_max))
     
    ' on active récap
    Workbooks("Recap.xlsm").Sheets(1).Activate
    ' on sélectionne la plage de destination et on charge le contenu de tableau
    ' j'ai décomposé la destination range pour que tu comprennes bien comment on charge
    '
    Range( _
        Cells(ou_copier, _
              1), _
        Cells(ou_copier + lig_max - 1, _
              col_max - a_partir_quelle_colonne + 1) _
          ) = tableau()
    End Function
    '
    '
    '
    pour ton 3eme point je te laisse chercher
    piste
    à mon avis il faut travailler sur ton tableau en bouclant sur chaque poste
    style for x=1 to ubound(tableau,dimension explorée) pour savoir
    si tu dois prendre ou pas la ligne

    et encore une fois il y a plein de didacticiels ( courts qui t'explique comment faire avec les tableaux)

    Bon courage.

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

Discussions similaires

  1. [Toutes versions] Macro Suppression Colonnes
    Par pinjul dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/01/2013, 15h45
  2. Macro suppression colonnes qui bloque
    Par La Zélie dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/08/2009, 22h25
  3. [Tableaux] suppression colonne tableau 2 Dimensions
    Par flydragon dans le forum Langage
    Réponses: 21
    Dernier message: 27/04/2006, 11h28
  4. [EXCEL MACRO] Comment automatiser un texte?
    Par PAULOM dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/03/2006, 23h46
  5. [C#] GridView suppression colonne code behind
    Par damn dans le forum ASP.NET
    Réponses: 2
    Dernier message: 31/10/2005, 12h33

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