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 :

selectionner un range dans une feuille


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 257
    Par défaut selectionner un range dans une feuille
    Bonjour a tous,

    j'ai une feuille excel contenant contenant un tableau avec plusieurs colonnes. Ayant besoin de recuperer quelques colonnes seulement de mon tableau pour les ecrire dans un fichier texte, j'ai nomme mon range (table_trenv2)

    je souhaiterai uniquement pouvoir recuperer la colonne PARENV jusqu'a la colonne CIBLE UNIQUE sans tenir compte des autres colonnes.

    Voici ma macro qui fonctionne assez bien (ecrit dans un fichier texte le contenu de mes colonnes PARENV a CIBLE UNIQUE). le probleme ici est que ma macro ajoute tout de meme le reste de mes colonnes alors que je crois preciser que je ne veux que ce qui est dans mon range table_trenv2.

    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 Load_Trenv()
    config = vbYesNo + vbQuestion + vbDefaultButton2
            If MsgBox("Vous êtes sur le point de générer un fichier ASCII et écraser celui déjà existant." & vbCrLf & _
            "Désirez vous poursuivre ?", config) <> vbNo Then
    Dim i, j, DernièreLigne, DernièreColonne, f As Worksheet
    Set f = ActiveSheet
        derniereligne = f.Range("table_trenv2").SpecialCells(xlCellTypeLastCell).Row
        DerniereColonne = f.Range("table_trenv2").SpecialCells(xlCellTypeLastCell).Column
        Open "C:\Documents and Settings\z70914\Desktop\Loads\Trenv\Trenv.txt" For Output As #1
        For i = 1 To derniereligne
            For j = 1 To DerniereColonne
                Print #1, f.Range("table_trenv2").Cells(i, j).Formula + "{";
            Next j
            Print #1, f.Range("table_trenv2").Cells(i, j + 1).Value
        Next i
        Close #1
        Else
        Exit Sub
        End If
    End Sub
    Voici aussi une copie de mon fichier excel pour voir ce que je veux dire a propos de mes colonnes et aussi une copie de ce qui est generer dans le fichier texte.

    Je voudrais donc pouvoir recuperer dans mon fichier texte seulement les donnees incluses dans mes colonnes PARENV jusqu'a CIBLE UNIQUE seulement.

    Merci beaucoup pour votre aide d'avance.
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 126
    Billets dans le blog
    131
    Par défaut
    Bonsoir

    Tu as la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For j = 1 to DerniereColonne
    qui va de ... 1 à la dernière colonne, elle-même spécifiée comme étant la dernière de la plage table_trenv2. Cela ne te permet pas de borner convenablement ta boucle sur j.

    Utilise deux variables comme dans le code suivant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Dim PremiereColonne As Integer
    Dim DerniereColonne As Integer
     
    PremiereColonne = Range("PARENV").Column
    DerniereColonne = Range("CIBLE UNIQUE").Column
    ...
    ...
    For i = 1 To DerniereLigne
        For j = PremiereColonne To DerniereColonne
            ...
        Next j
    Next i
    Ok?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    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 : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

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

    quelques petites remarques :

    entre la déclaration des variables (qui sont toutes de type Variant puisque pas de type précisé) et l'utilisation de celles-ci dans le code, il y a un couac, DernièreLigne et DerniereLigne pour vba ce n'est pas la même chose donc il considère cela comme deux variables différentes.

    Vu que ton bouton de commande est sur la feuille à traîter, il n'est pas vraiment nécessaire de préciser ActiveSheet, par défaut c'est la feuille active qui sera traîtée, donc tu peux supprimer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim f As Worksheet
    Set f = ActiveSheet
    Lorsque tu n'obtiens pas le résultat souhaité, parsème ton code de MsgBox avec renvoie de la valeur des variables, tu verras directement où ça coince.
    Par exemple, sans rien changer dans ton code, insère ces deux MsgBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Set f = ActiveSheet
        derniereligne = f.Range("table_trenv2").SpecialCells(xlCellTypeLastCell).Row
        DerniereColonne = f.Range("table_trenv2").SpecialCells(xlCellTypeLastCell).Column
     
    MsgBox derniereligne
    MsgBox dernierecolonne
     
        Open "C:\Documents and Settings\z70914\Desktop\Loads\Trenv\Trenv.txt" For Output As #1
        For i = 1 To derniereligne
    Tu constateras que tes variables ne renvoient pas du tout les valeurs souhaitées et que donc il y a un blême avec les syntaxes

    Trêve de blabla essaye ceci
    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
    Sub Load_Trenv()
    Dim i As Integer, j As Byte, DerLig As Integer, DerCol As Byte
    config = vbYesNo + vbQuestion + vbDefaultButton2
     
    If MsgBox("Vous êtes sur le point de générer un fichier ASCII et écraser celui déjà existant." & vbCrLf & _
        "Désirez vous poursuivre ?", config) = vbNo Then Exit Sub
     
    DerLig = Cells(Rows.Count, 4).End(xlUp).Row
    DerCol = 12
     
    Open "C:\Documents and Settings\z70914\Desktop\Loads\Trenv\Trenv.txt" For Output As #1
     
    For i = 1 To DerLig
        For j = 1 To DerCol
            Print #1, Cells(i, j).Formula + "{";
        Next j
        Print #1, Cells(i, j + 1).Value '<-- je n'ai pas compris l'utilité de cette ligne ?
    Next i
     
    Close #1
    End Sub

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 126
    Billets dans le blog
    131
    Par défaut
    Salut Fred...

    Tant qu'à faire...

    Attention que la boucle sur J que tu donnes commence à 1 alors que, si j'ai bien compris, elle doit commencer à la colonne de la cellule PARENV...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    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 : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

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

    oups...je n'avais pas vu ta réponse, nos messages se sont croisés mais ta remarque est judicieuse .

    Petite précision supplémentaire, yfo nommer les entêtes de colonnes pour pouvoir utiliser ensuite Range("PARENV") et Range("CIBLE") ce qui permettrait comme tu le précises de mieux cibler, peu importe si des colonnes sont ajoutées ou supprimées.

    Ce qui donnerait
    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
    Sub Load_Trenv()
    Dim i As Integer, j As Byte
    Dim PremLig As Byte, DerLig As Integer
    Dim PremCol As Byte, DerCol As Byte
     
    config = vbYesNo + vbQuestion + vbDefaultButton2
     
    If MsgBox("Vous êtes sur le point de générer un fichier ASCII et écraser celui déjà existant." & vbCrLf & _
        "Désirez vous poursuivre ?", config) = vbNo Then Exit Sub
     
    PremLig = Range("PARENV").Row
    PremCol = Range("PARENV").Column
    DerLig = Cells(Rows.Count, PremCol).End(xlUp).Row
    DerCol = Range("CIBLE").Column
     
    Open "C:\Documents and Settings\z70914\Desktop\Loads\Trenv\Trenv.txt" For Output As #1
     
    For i = PremLig To DerLig
        For j = PremCol To DerCol
            Print #1, Cells(i, j).Formula + "{";
        Next j
        Print #1, Cells(i, j + 1).Value '<-- je n'ai pas compris l'utilité de cette ligne ?
    Next i
     
    Close #1
    End Sub
    Merci Pierre pour avoir rectifié le tir

  6. #6
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 257
    Par défaut
    Merci beaucoup a Pierre et Fring pour votre aide. J'ai donc utiliser le code que m'a proposé Fring et lorsque j'execute la macro, jai ce message d'erreur :
    Run-time error '1004':
    Method 'Range' of object '_Global' failed
    Quand je fais un debug, il me surligne en jaune cette ligne :

    PremLig = Range("PARENV").Row

    Merci encore une fois de votre aide.

    P.S : l'utilité de cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Print #1, Cells(i, j + 1).Value '<-- je n'ai pas compris l'utilité de cette ligne ?
    permet simplement de me mettre sur une ligne différente dans le fichier texte les données présentés dans ma feuille excel, car lorsque je ne la mets pas, il me met toutes les données de ma feuille excel sur la meme ligne dans mon fichier texte.

  7. #7
    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 : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Comme je l'ai précisé dans ma réponse, il faut au préalable nommer les deux cellules en en-tête de colonne PARENV et CIBLE

    Tu sélectionnes la cellule (en-tête de colonne) et dans la zone nom (en haut à gauche), à la place de la référence de la cellule (par exemple G7) tu introduits un nom

    PARENV pour la colonne PARENV
    CIBLE pour la colonne CIBLE UNIQUE

  8. #8
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 257
    Par défaut
    OK merci c'est bon pour l'erreur. Cependant, le resultat final n'est pas celui attendu. Dans mon fichier texte, j'ai des valeurs qui sont a l'exterieur de la zone specifiée. Voila le fichier texte pour voir le resultat.

    Il faudrait uniquement qu'il me renvoie les valeurs incluses entre PARENV et CIBLE UNIQUE seulement sans l'en tete de colonne. C'est a dire qu'il commencerait a PARENV1 jusqu'a PARENV27. Hors la, il m'affiche d'autres lignes et colonnes aussi.

    Merci
    Fichiers attachés Fichiers attachés

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 126
    Billets dans le blog
    131
    Par défaut
    En avançant en pas à pas dans le déroulement de la macro et en vérifiant les valeurs de tes variables, tu devrais être à même de trouver où se situe(nt) le(s) problème(s)...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 257
    Par défaut
    Salut,

    j'essaie vraiment mais je n'y arrive toujours pas..j'ai remarqué par ailleurs qu'en selectionnant seulement PARENV1 a PARENV27 et en nommant ceci PARENV par exemple comme Range, ca marches mieux et j'ai fais pareil pour CIBLE. J'ai selectionné uniquement de la ligne PARENV1 a PARENV27. Helas, ce qui ne marche pas c'est a l'affichage, le resultat n'est pas exactement ce que je recherche et apres plusieurs essai en modifiant les ranges et conditions, je n'y arrive touours pas.. Il m'affiche toujours des valeurs a l'exterieur de la zone specifiée.

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 126
    Billets dans le blog
    131
    Par défaut
    Le plus simple est que tu remettes le code que tu emploies, car après les modifs des uns et des autres, il est malaisé de savoir quel code tu utilises exactement.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 257
    Par défaut
    effectivement. Voici donc mon fichier excel et mon fichier texte généré qui semble tres bon mais ne l'est pas reellement car des que j'ajoute une valeur dans la colonne commentaire par exemple, il va l'afficher dans mon fichier texte alors qu'il ne devrait pas..Il doit uniquement afficher de PARENV1 a PARENV27, dela colonne PARENV a CIBLE UNIQUE

    Merci de votre aide..
    Fichiers attachés Fichiers attachés

  13. #13
    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 : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Pour ne pas imprimer les en-têtes de colonnes dans le fichier texte il suffit de décaler la première ligne d'une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PremLig = Range("PARENV").Row + 1
    Concernant les colonnes en trop, c'est cette ligne qui pose problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Print #1, Cells(i, j + 1).Value
    Modifie la par :

  14. #14
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 257
    Par défaut
    Merci Fring. La ca marches bien sauf que je devais faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PremLig = Range("PARENV").Row + 5
    pour qu'il commence seulement a PARENV1

    Merci a tous pour votre aide..

  15. #15
    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 : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    bin oui, cela dépend où se trouve la cellule nommée PARENV, chez moi elle se trouve en D5 et chez toi en D1

    Bonne continuation

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

Discussions similaires

  1. [XL-2010] macro pour ouvrir x fichier selectionner des col et les coller dans une feuille xl
    Par grainedechipie dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/02/2015, 09h46
  2. Réponses: 8
    Dernier message: 12/08/2009, 11h32
  3. [VBA-E]type de donnée range en vba utilisée dans une feuille
    Par Yoyo51 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/03/2006, 10h26
  4. [VB6] [Interface] Nbre de contrôles maxi dans une feuille
    Par Midou dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 13/10/2002, 16h09
  5. [VB6] [Excel] Insérer une image dans une feuille
    Par mathias dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 09/10/2002, 07h44

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