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 :

Range limitée a la dernière valeur - Concaténation [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2014
    Messages : 24
    Par défaut Range limitée a la dernière valeur - Concaténation
    Bonjour

    Je n'arrive désespérément pas a obtenir la ligne de la dernière valeur d'une table, mais je comprends mal comment fonctionne "range.find"

    Je cherche a concaténer des tableaux de longueur variable (pour le moment tous avec 200 lignes de formule, mais les formules renvoient une valeur vide ("") quand il n'y a pour le moment plus de valeur a traiter.

    Je cherche donc a obtenir la première ligne ou la formule renvoie cette valeur vide, pour dimensionner ma range a copier-coller.

    Voici mon sub:


    "xRg" renvoyant la range contenant toutes les formules
    Et je cherche a passer a "xFinTab" qui me renverrais que les valeurs non vide

    Je copie un tableau de DH:DJ Vers A:C (avec une première ligne contenant le nom qui n'est pas a copier)

    Le soucis est ligne 11 qui ne fonctionne pas comme souhaité, je remplace ensuite xRg, par xFinTab, une fois que cela fonctionnera


    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
    Sub Synthese()
    'Concatenation des différents tableaux
    Dim xRg, xCopy, xFinTab As Range, sh As Worksheet, xDecal As Integer
     
     Sheets("Combo").Range("A2:X" & Rows.Count).EntireRow.Delete 'Cleaning
     
    For Each sh In Worksheets
       If sh.Name <> "Combo" And sh.Name <> "Index" Then
         With sh
           Set xRg = .Range("DH" & Rows.Count).End(xlUp) 'Paramétre original, renvoie la range avec toutes les valeurs, formules comprises)
           Set xFinTab = .Range("DH" & Rows.Count).End(xlUp).Find("", , xlValues, , , xlPrevious)
           If xRg.Row > 1 Then 'Row =1 => pas de valeur
             Set xCopy = Sheets("Combo").Range("DH" & Rows.Count).End(xlUp).Offset(1)
             .Range("DH2:DJ" & xRg .Row).Copy
             xCopy.Offset(xDecal, -111).PasteSpecial Paste:=xlPasteValues 'Offset pour décaler de DH a A (-111) , et de concaténer
             xDecal = xDecal + xRg .Row
           End If
         End With
       End If
    Next sh
     
    End Sub
    Merci de votre aide !

  2. #2
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Pour trouver la première ligne vide d'une colonne par exemple. Tu peux faire comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A"&rows.count).end(xlup).row +1

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Citation Envoyé par Kiouane Voir le message
    Pour trouver la première ligne vide d'une colonne par exemple. Tu peux faire comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A"&rows.count).end(xlup).row +1
    Ca ne va pas marcher, la ligne n'est pas vide, elle contient une formule qui renvoie vide, c'est différent.

    Le soucis est ligne 11 qui ne fonctionne pas comme souhaité
    Si j'ai bien compris, essaye de remplacer ta ligne 11 par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xFinTab = .Range("DH" & Rows.Count).End(xlUp).Find("", , xlValues, , , xlPrevious).address
    edit: et remplacer par

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2014
    Messages : 24
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    Ca ne va pas marcher, la ligne n'est pas vide, elle contient une formule qui renvoie vide, c'est différent.
    Exactement, c'est pour cela que j'ai bien insisté sur "valeur" et "formules".
    Si il n'y avais pas ce soucis de formule qui sont comptabilisé dans le ".End(xlUp)" , le code fonctionne bien.


    J'ai testé la solution, le .adresse renvoie une erreur de type.

    Et le .range sur Xfintab est une méthode qui échoue si on enlève le .adresse

    "XfinTab" doit être direct la range souhaitée (range des valeurs non vide), et ensuite avec . row on mesure son nombre de lignes de façon a adapter le collage.




    Mon soucis c'est que le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Find("", , xlValues, , , xlPrevious)
    ne viens pas ajuster la taille de ma range.
    Je pense que c'est du au fait que je ne comprends pas comment ".find" s'applique



    Je remet le code propre (sans le xRg)
    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
     
    Sub Synthese()
    'Concatenation des différents tableaux
    Dim xCopy, xFinTab As Range, sh As Worksheet, xDecal As Integer
     
     Sheets("Combo").Range("A2:X" & Rows.Count).EntireRow.Delete 'Cleaning
     
    For Each sh In Worksheets
       If sh.Name <> "Combo" And sh.Name <> "Index" Then
         With sh
           Set xFinTab = .Range("DH" & Rows.Count).End(xlUp).Find("", , xlValues, , , xlPrevious)
           If xFinTab.Row > 1 Then 'Row =1 => pas de valeur
             Set xCopy = Sheets("Combo").Range("DH" & Rows.Count).End(xlUp).Offset(1)
             .Range("DH2:DJ" & xFinTab.Row).Copy
             xCopy.Offset(xDecal, -111).PasteSpecial Paste:=xlPasteValues 'Offset pour décaler de DH a A (-111) , et de concaténer
             xDecal = xDecal + xFinTab.Row
           End If
         End With
       End If
    Next sh
     
    End Sub
    Ce code fonctionne, mais me renvois un résultat plein de vides :-P

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2014
    Messages : 24
    Par défaut
    Après un peu de pause sur le sujet, je suis toujours bloqué, et je vais avoir un projet similaire qui va bloquer au même endroit.

    Comment donc sélectionner les cellules avec des formules renvoyant un résultat vide? Sachant que ces formules ne sont pas considéré comme vide par excel, vu qu'elle possèdent une formule.

    Merci !

  6. #6
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Je pense que tu peux sélectionner une cellule vide contenant une formule comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if cell.value ="" then cell.select

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2014
    Messages : 24
    Par défaut
    Merci, mais il faudrait l'intégrer au range.
    (et je maitrise pas trop la chose)

  8. #8
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Tu veux les sélectionner ou faire une manipulation précise?

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2014
    Messages : 24
    Par défaut
    Gérer l'ensemble de "sélection" en tant que range.

    Ca a l'avantage d'être une forme de sélection, sans que Excel ne sélectionne "physiquement" => pas d'affichage
    De surcroit c'est un objet plus manipulable par la suite qu'un select. (objet vs action)

    Le range peut retourner une taille, alors que c'est pas gagné avec un select.
    Mon range sert ici a définir la zone a copier, et a donner le nombre de lignes qui seront collées.


    L'inconvénient c'est que c'est un peu plus difficile a manipuler.

  10. #10
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    non ce n'est pas plus difficile, juste une question de logique …

    Pourtant rien qu'en consultant l'aide VBA et comme déjà indiqué certainement dans la FAQ ou un tutoriel de ce forum,
    voici un exemple via Find dans cette discussion !

    _________________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

    _________________________________________________________________________________________________________
    Je suis Paris, Charlie, Bruxelles, …

  11. #11
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132

  12. #12
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    Et .... ne pas oublier le specialcells qui permet de récupérer pas mal de choses en une passe:

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ' Récupère la région (Ctrl + *) à partir de la dernière cellule non vide
    Set Srcdata = WshSrc.Cells.SpecialCells(xlCellTypeLastCell).CurrentRegion
     
    ' Récupère les données visibles (après un filtre par exemple)
    Set Rngdata = Srcdata .SpecialCells(xlCellTypeVisible)
     
    Set Rngdata = Srcdata .SpecialCells(xlCellTypeConstants)  ' valeurs constantes (non vide)
    Set Rngdata = Srcdata  .SpecialCells(xlCellTypeFormulas)  ' formules
    Set Rngdata = Srcdata .SpecialCells(xlCellTypeBlanks)       ' cellules vides

  13. #13
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2014
    Messages : 24
    Par défaut
    Merci, mais comme déjà dit, cela ne fonctionne pas a causes des formules qui sont reconnues comme cellules remplies par excel.

    Voici un fichier avec la macro incriminée et le problème des cellules vides concaténées
    Edit :L'upload rate


    Revoici le code, avec qq corrections et plus de commentaires.

    Ce fois, on cherche a coller un tableau de 3 colonnes en E2:Gx vers A2:Cx

    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 Synthese()
    'Concatenation des différents tableaux
    Dim xRg, xCopy, xFinTab As Range, sh As Worksheet, xDecal As Integer
     
     Sheets("Combo").Range("A2:X" & Rows.Count).EntireRow.Delete 'Cleaning
     
    For Each sh In Worksheets
       If sh.Name <> "Combo" And sh.Name <> "Index" Then
         With sh
           Set xFinTab = .Range("E" & Rows.Count).End(xlUp).Find("", , xlValues) ' Première position de ligne avec valeur vide
           If xFinTab.Row > 1 Then 'Row =1 => pas de valeur  a copier => pas de copie
                Set xCopy = Sheets("Combo").Range("E" & Rows.Count).End(xlUp).Offset(1) 'offset de 1 pour ne pas coller sur la ligne 1
                .Range("E2:G" & xFinTab.Row).Copy
                xCopy.Offset(xDecal, -4).PasteSpecial Paste:=xlPasteValues 'Offset pour décaler de E a A (-4) , et de coller que les valeurs
                xDecal = xDecal + xFinTab.Row - 1 'début de position du prochain collage; -1 pour contrer l'offset
           End If
         End With
       End If
    Next sh
     
    End Sub

    J'ai testé avec de plus petit tableaux de données et le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     .Range("E" & Rows.Count).End(xlUp).Find("", , xlValues)
    Renvoie la même valeur que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("E" & Rows.Count).End(xlUp)
    Le .find étant totalement transparent

    Y'a quelque chose d'évident qui m'échappe, mais je n'arrive pas a le capter



    J'essaierais de re-uploader le fichier des que je peux, ca sera surement plus parlant pour tous.

  14. #14
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Pourtant le lien fourni dans mon précédent message fonctionne de mon côté même avec des cellules vides contenant des formules !

    Évidemment si tu n'as pas corrigé ton code …

  15. #15
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2014
    Messages : 24
    Par défaut
    Bon

    suite a acharnement j'ai réussit, j'ai fait de meilleure déclarations, reduit le nombre de ranges et j'ai viré les lookin/lookat qui en fait ne sert a rien. (désolé Marc, j'avais mal compris ton exemple, et n'aurais pas cru que cela fonctionnais avec les formules)

    Donc, le tout donne:

    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
    Sub Synthese()
    'Concatenation des différents tableaux
    Dim xCopy As Range, sh As Worksheet, xDecal, datend, xFinTab As Integer
     
    Sheets("Combo").Range("A2:X" & Rows.Count).EntireRow.Delete 'Cleaning
     
    For Each sh In Worksheets
       If sh.Name <> "Combo" And sh.Name <> "Index" Then
         With sh
            datend = sh.Range("DH65536").End(xlUp).Row
            xFinTab = sh.Range("DH2:DH" & datend).Cells.Find(What:="*", searchdirection:=xlPrevious).Row
            If xFinTab > 1 Then 'Row =1 => pas de valeur
             Set xCopy = Sheets("Combo").Range("DH" & Rows.Count).End(xlUp).Offset(1)
             .Range("DH2:DJ" & xFinTab).Copy
             xCopy.Offset(xDecal, -111).PasteSpecial Paste:=xlPasteValues 'Offset pour décaler de DH a A (-111) , et de concaténer
             xDecal = xDecal + xFinTab - 1
           End If
         End With
       End If
    Next sh
     
    End Sub
    Merci a tous

  16. #16
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut




    Si tu crois que ces paramètres de la méthode Range.Find ne servent à rien,
    c'est que tu n'as pas lu ou pas bien compris son aide VBA ! A lire d'urgence, notamment la partie Notes

    J'en ai déjà croisés quelques uns affirmant « cela fonctionnait bien avant tel quel » …

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

Discussions similaires

  1. [XL-2003] Etendre Range jusqu'à dernière valeur
    Par Jaymerry dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 31/12/2010, 14h46
  2. Liste sélectioner la dernière valeur ajoutée par un popup.
    Par guano dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/03/2006, 17h03
  3. Réponses: 7
    Dernier message: 06/03/2006, 12h19
  4. [Séquences] Pour récupérer la dernière valeur
    Par tnodev dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 24/05/2005, 11h35
  5. [IB] [trigger+generator] récup dernière valeur générée ?
    Par fred64 dans le forum Bases de données
    Réponses: 2
    Dernier message: 14/05/2004, 00h38

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