Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1244 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Sélection de plusieurs cellules : de x à la dernière cellule non vide

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Sélection de plusieurs cellules : de x à la dernière cellule non vide

n°2204327
michele_
Posté le 27-09-2013 à 09:15:56  profilanswer
 

Bonjour,
 
Voilà, je débute dans le VBA et mon fichier est tellement lourd que je ne peux pas faire comme d'habitude.
 
Donc, voilà ce que je voudrais faire ...
Pour comprendre mieux, voici un bout de mon code :
 

Code :
  1. Range("C9" ).Select
  2. ActiveCell.FormulaR1C1 = _
  3.         "=IF(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))="""",""-"",IF(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))=1,IF(LOOKUP(2,'TCD retravaillé'!R[-4],'TCD retravaillé'!R4)=R4C,RC1&R5C&"" - ""&TEXT(R6C,""jj/mm/aa"" )&"" - ""&TEXT(R7C,""jj/mm/aa"" ),""-"" ),IF(AND(LOOKUP(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))+1,'TCD retravaillé'!R[-4],'TCD retravaillé'!R4)=R4C,LOOKUP(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))-1,'TCD retravaillé'!R[-4],'TCD retravaillé'!R4)<>R2C),RC1&R5C&"" - ""&TEXT(R6C,""jj/mm/aa"" )&"" - ""&TEXT(R7C,""jj/mm/aa"" ),""-"" )))"


 
Mais au lieu de sélectionner une seule cellule, je voudrais pouvoir sélectionner Range("C9:Cx" ).Select
x étant le numéro de la dernière ligne.
Sachant que pour trouver la dernière ligne j'utilise la colonne B
 
d'habitude, quand je veux mettre la même formule de cette façon, voilà ce que je faisais :
 

Code :
  1. Range("C9" ).Select
  2. ActiveCell.FormulaR1C1 = _
  3.         "=IF(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))="""",""-"",IF(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))=1,IF(LOOKUP(2,'TCD retravaillé'!R[-4],'TCD retravaillé'!R4)=R4C,RC1&R5C&"" - ""&TEXT(R6C,""jj/mm/aa"" )&"" - ""&TEXT(R7C,""jj/mm/aa"" ),""-"" ),IF(AND(LOOKUP(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))+1,'TCD retravaillé'!R[-4],'TCD retravaillé'!R4)=R4C,LOOKUP(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))-1,'TCD retravaillé'!R[-4],'TCD retravaillé'!R4)<>R2C),RC1&R5C&"" - ""&TEXT(R6C,""jj/mm/aa"" )&"" - ""&TEXT(R7C,""jj/mm/aa"" ),""-"" )))"
  4. Range("C9" ).Select
  5. Selection.Copy
  6. Range("B9" ).Select
  7. Selection.End(xlDown).Select
  8. ActiveCell.Offset(0, 1).Range("A1" ).Select
  9. Range(Selection, Selection.End(xlUp)).Select
  10. ActiveSheet.Paste


 
Sauf que j'ai tellement de lignes que ça plante  :(  
Donc, j'aimerais faire en sorte que tout soit porté sur le code, et non Excel ...
 
Merci de votre aide


Message édité par michele_ le 27-09-2013 à 20:07:31
mood
Publicité
Posté le 27-09-2013 à 09:15:56  profilanswer
 

n°2204399
Marc L
Posté le 27-09-2013 à 13:01:13  profilanswer
 

 
          Bonjour,
 
          pour le n° de la dernière ligne de la colonne B :   Cells(Rows.Count, 2).End(xlUp).Row
 

n°2204410
michele_
Posté le 27-09-2013 à 14:34:35  profilanswer
 

Merci
 
Mais comment je fais pour que je sélectionne toutes les cellules de C9 à Cx X étant la dernière ligne ?
D'ailleurs, je précise que quand je parle de dernière ligne, c'est à partir de la ligne 9 (les lignes précédentes ne sont pas forcément non vides)
 
Est ce que je peux faire un truc dans ce genre ?
 

Code :
  1. Dim x As Integer
  2. Range(R9C3:RxC3).Select
  3.    Where x = Cells(Rows.Count, 2).End(xlUp).Row
  4. Selection.FormulaR1C1 = _
  5.         "=IF(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))="""",""-"",IF(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))=1,IF(LOOKUP(2,'TCD retravaillé'!R[-4],'TCD retravaillé'!R4)=R4C,RC1&R5C&"" - ""&TEXT(R6C,""jj/mm/aa"" )&"" - ""&TEXT(R7C,""jj/mm/aa"" ),""-"" ),IF(AND(LOOKUP(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))+1,'TCD retravaillé'!R[-4],'TCD retravaillé'!R4)=R4C,LOOKUP(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))-1,'TCD retravaillé'!R[-4],'TCD retravaillé'!R4)<>R2C),RC1&R5C&"" - ""&TEXT(R6C,""jj/mm/aa"" )&"" - ""&TEXT(R7C,""jj/mm/aa"" ),""-"" )))"



Message édité par michele_ le 27-09-2013 à 20:08:53
n°2204416
Marc L
Posté le 27-09-2013 à 14:52:06  profilanswer
 

 
           Pas besoin de sélectionner, bien au contraire !
 
           Débutant en VBA, pas de problème …  Mais rien qu'en consultant l'aide de la méthode  Copy  !
 
           Range({plage source}).Copy [C9]
 
           La plage s'ajuste automatiquement par rapport à la source si une seule cellule est indiquée dans la destination …
 
           Pour une recopie incrémentée, voir aussi la méthode  AutoFill.
 
           Pour une meilleure lisibilité, merci d'utiliser la prochaine fois l'icône C dédiée au code …

Message cité 1 fois
Message édité par Marc L le 27-09-2013 à 14:58:17
n°2204438
michele_
Posté le 27-09-2013 à 17:22:15  profilanswer
 

Marc L a écrit :

 
           Pas besoin de sélectionner, bien au contraire !
 
           Débutant en VBA, pas de problème …  Mais rien qu'en consultant l'aide de la méthode  Copy  !
 
           Range({plage source}).Copy [C9]
 
           La plage s'ajuste automatiquement par rapport à la source si une seule cellule est indiquée dans la destination …
 
           Pour une recopie incrémentée, voir aussi la méthode  AutoFill.


Je vais creuser pour essayer de comprendre comment utiliser cela à l'avenir. Ca pourra surement remplacer la méthode que j'utilise actuellement pour copier.
Mais pour mon cas, je ne veux pas faire de copie mais je veux incrémenter en même temps une plage de cellules (dont je ne connais pas à l'avance la ligne de fin)
Je le fais actuellement en mettant Range("C9:C3000" ).select mais le nombre de ligne varie :( d'où ma demande  :D  
 
 

Marc L a écrit :

 
           Pour une meilleure lisibilité, merci d'utiliser la prochaine fois l'icône C dédiée au code …


De quel icône parles-tu ? car quand j ai créé mon post, j'ai mis en sous catégorie VBA ... ça me paraissait bien puisque mon problème c'est du VBA  :(  

n°2204441
Marc L
Posté le 27-09-2013 à 17:58:37  profilanswer
 

 
           L'icône C dans l'écran de saisie du message ‼  :sarcastic:  
 
           Cela ne remplace pas ta méthode vu que c'est la même méthode  Copy  ‼
           Suffit juste de consulter son aide afin de l'utiliser au mieux …
 
           Pour le calcul de la dernière ligne, tu l'as déjà dans mon premier message,
           faire juste attention au n° de la colonne, voir l'aide de  Cells  …*
 
           Et j'ai pourtant indiqué la recopie incrémentée dans mon précédent message …
 
           Et encore une fois la sélection est inutile, à part ralentir la procédure et faire clignoter l'écran !
 
           Donc pour moi tu as tout ce qu'il faut, suffit de lire un peu …
 
           __________________
            Lire, c'est s'investir …
 

n°2204442
michele_
Posté le 27-09-2013 à 18:21:48  profilanswer
 

Merci de tes commentaires pour me faire comprendre que je comprend rien ...
 
Si je savais, je ne viendrais pas poster ici pour qu'on m'aide.
 

Marc L a écrit :

 
           Donc pour moi tu as tout ce qu'il faut, suffit de lire un peu …
 
           __________________
            Lire, c'est s'investir …
 


Je te rassure, je sais lire ... mais quand on débute et que, comme seule réponse, on me donne un bout de code ... je ne sais pas trop quoi en faire :( et surtout, je ne sais  pas où l'intégrer dans mon code :(
 
Bref, si je reprend ta 1ère réponse qui me paraît répondre à mon besoin

Marc L a écrit :

 
           Bonjour,  
 
          pour le n° de la dernière ligne de la colonne B :   Cells(Rows.Count, 2).End(xlUp).Row …  
 


Où dois-je mettre cette partie du code ? pour arriver à ce que je souhaite faire ?
 
Est ce que le code que j'ai répondu (après ta 1ère réponse) peut fonctionner ou non ?
Je rappelle le code que je proposais qui intègre le code que tu m as proposé au départ :

Code :
  1. Dim x As Integer
  2. Range(R9C3:RxC3).Select
  3.    Where x = Cells(Rows.Count, 2).End(xlUp).Row
  4. Selection.FormulaR1C1 = _
  5.         "=IF(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))="""",""-"",IF(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))=1,IF(LOOKUP(2,'TCD retravaillé'!R[-4],'TCD retravaillé'!R4)=R4C,RC1&R5C&"" - ""&TEXT(R6C,""jj/mm/aa"" )&"" - ""&TEXT(R7C,""jj/mm/aa"" ),""-"" ),IF(AND(LOOKUP(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))+1,'TCD retravaillé'!R[-4],'TCD retravaillé'!R4)=R4C,LOOKUP(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))-1,'TCD retravaillé'!R[-4],'TCD retravaillé'!R4)<>R2C),RC1&R5C&"" - ""&TEXT(R6C,""jj/mm/aa"" )&"" - ""&TEXT(R7C,""jj/mm/aa"" ),""-"" )))"


Si il y a des erreurs, qu'est ce qui est faux ?
Mais si c'est archi faux, faut juste me le dire...
 
Les aides qu'il y a dans Excel ne m'aident pas :( et je n'ai pas de livre sur le VBA d'où ma présence
 
Sinon, c'est pas grave, j'abandonne et retourne à faire mes calculs manuellement dans Excel en scindant mes fichiers en 40 (car trop de lignes avec des formules trop compliquées, donc des plantages...)


Message édité par michele_ le 27-09-2013 à 20:10:01
n°2204451
Marc L
Posté le 27-09-2013 à 19:37:01  profilanswer
 


           Comme indiqué dans son aide, Cells fonctionne en ligne par colonne :  Cells(Ligne,Colonne)  (Ouah trop dur la lecture !)
 
           Donc pour obtenir le n° de la dernière ligne saisie d'une colonne :   Cells(Rows.Count, {numéro de colonne}).End(xlUp).Row
 
           Et on s'en sert là où on en a besoin !  Exemple avec ton x de départ :   Range("C9:C" &  Cells(Rows.Count, 3).End(xlUp).Row)
 
           Sauf qu'après tu parlais d'une colonne B ! …   Peu importe, c'est à toi d'adapter selon la colonne, est-ce si difficile ? …
 
           Ensuite concernant ton code, toujours en bleu, l'icône n'ayant toujours pas été utilisée (cf règles du forum), donc je zappe !
           Ceci dit, vu la taille, je suppose que c'est une formule de feuille de calcul,
           donc il faut être devant la feuille pour savoir si elle fonctionne ou pas ! …
 
           Et pour la recopie incrémentée, voir la méthode concernée citée par deux fois déjà …
           L'Enregistreur de macros est aussi une aide pour débuter.
           Une fois que son code fonctionne, il faut mieux le nettoyer en retirant
           tous ces affreux inutiles ralentisseurs  Select,  Selection  &  Activate
 

n°2204453
michele_
Posté le 27-09-2013 à 20:01:15  profilanswer
 

Merci ! :D  
 
Je sais enfin où je dois coller ton bout de code.
Je ne pensais pas que je pouvais mettre directement ton code comme ça.
 
Je pensais que j'étais obligée de mettre une variable en disant que ma variable correspondait à ton code.
 
Donc, pour résumer, mon code va être :

Code :
  1. Range("C9:C" &  Cells(Rows.Count, 2).End(xlUp).Row).Select 
  2. Selection.FormulaR1C1 = _ 
  3.         "=IF(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))="""",""-"",IF(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))=1,IF(LOOKUP(2,'TCD retravaillé'!R[-4],'TCD retravaillé'!R4)=R4C,RC1&R5C&"" - ""&TEXT(R6C,""jj/mm/aa"" )&"" - ""&TEXT(R7C,""jj/mm/aa"" ),""-"" ),IF(AND(LOOKUP(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))+1,'TCD retravaillé'!R[-4],'TCD retravaillé'!R4)=R4C,LOOKUP(INDEX(TCDretravaille,MATCH(RC2,'TCD retravaillé'!C1,0),MATCH(PB!R3C,'TCD retravaillé'!R4,0))-1,'TCD retravaillé'!R[-4],'TCD retravaillé'!R4)<>R2C),RC1&R5C&"" - ""&TEXT(R6C,""jj/mm/aa"" )&"" - ""&TEXT(R7C,""jj/mm/aa"" ),""-"" )))"


Au passage, j'avais bien compris ce que faisait et à quoi servait ton code ... j'arrivais pas à savoir comment l'intégrer dans le mien ...
 
Et désolée pour le code en bleu ... c'était juste pour que ce soit + lisible ... j'avais pas vu qu'on pouvait insérer un code  :o (j'ai corrigé mon erreur pour ce message)
Pour l'enregistreur de macro ... c'est ce que je fais toujours et après je modifie (en l'occurrence dans ce cas, il me sortait Range("C9:C3000" ).Select
Je te confirme que ma formule est bien une formule obtenue directement d'une formule Excel qui a été retranscrite par l'enregistrement. D'ailleurs, pour la formule on s'en fiche, car mon problème ne portait pas dessus, mais sur les 2 1ères lignes du code... J'aurais dû mettre une formule bateau et remplacer la mienne pour l'exemple.
La prochaine étape, pour moi, sera d'arriver à faire du code + propre ... en le nettoyant, comme tu dis. J'en suis à 100% consciente ... mais c'est pas pour tout de suite  :o  
Pour ce qui est de l'icône ... j'ai pas trouvé d'icône avec un C pour le coup, je dois être bigleuse ... je vais chercher pour corriger ...
PS : j'ai lu un bon nombre de posts avant de poster le mien, en particulier ceux qui sont épinglés ... mais j'ai surement pas dû tout voir :(

n°2204454
Marc L
Posté le 27-09-2013 à 21:28:49  profilanswer
 

 
           Oui effectivement dans ma version avant d'être logué j'ai une icône  C  pour le code  
           mais qui, après m'être identifié sur le forum, n'est plus un C mais une espèce de feuille enroulée
           avec le bas en vert, bref c'est la dernière à droite de la première ligne d'icônes
           et en y plaçant le curseur, Code apparaît dans l'Info-bulle …
 
           P'tite question :   la formule a t-elle forcément besoin d'être présente dans le code ?
           
           Car une fois la formule correcte dans la feuille de calcul, elle peut ensuite être déroulée via la méthode  AutoFill  …
 
 
           Leçon :  la plage J1:J20 de la feuille 1 doit être copiée dans la feuille 2 à partir de la cellule B1.
 
           Voici le code généré par l'Enregistreur de macros :

Code :
  1. Sub Macro1()
  2.     Sheets("Feuil1" ).Select
  3.     Range("J1:J20" ).Select
  4.     Selection.Copy
  5.     Sheets("Feuil2" ).Select
  6.     Range("B1" ).Select
  7.     ActiveSheet.Paste
  8.     Range("A1" ).Select
  9. End Sub


           On remarque qu'il enregistre toute manipulation, mais peut-on le lui reprocher,
           comment pourrait-il savoir à l'avance ce qui doit être fait ?! …
 
           Rien qu'en lisant l'aide de la méthode  Copy,  ce code peut être remplacé par une ligne unique !
 
           Feuil1.[J1:J20].Copy Feuil2.[B1]
 
           Comme quoi lire la documentation interne au VBA (ou même d'Excel) peut s'avérer payant !
 
           Mais cette méthode copie tout, le contenu, la mise en forme, etc ...   Plus la plage à copier est étendue plus la copie prendra du temps
           et quelque peu inutile si seules les valeurs doivent être recopiées …   Certes il y a la méthode  PasteSpecials  mais il y a plus efficace :
           la copie directe de Range à Range ou de variable tableau à Range et vice versa.
 
           Donc pour récupérer uniquement les valeurs, surtout quand la destination a déjà une mise en forme, ne pas utiliser la méthode  Copy  :
 
           Feuil2.[B1:B20].Value = Feuil1.[J1:J20].Value
 
           Pour conclure, travailler directement sur les objets est bien plus efficace et sûr …
  

mood
Publicité
Posté le 27-09-2013 à 21:28:49  profilanswer
 

n°2204459
michele_
Posté le 27-09-2013 à 22:04:47  profilanswer
 

Marc L a écrit :

 
           P'tite question :   la formule a t-elle forcément besoin d'être présente dans le code ?
  


Oui, j'ai volontairement mis la formule dans le code, car comme tu as pu le constater, la formule est relativement complexe.
Le truc, c'est que le fichier que j'essaie de construire a pour finalité de retraiter une grosse base de données ayant comme finalité de recetter le résultat d'une requête SQL (faite par l'équipe technique de ma DSI) et la comparer à ce qu'on attend (par le biais de report Business Object)
Ce que j'essaie de faire c'est de créer un fichier où n'importe quelle personne pourra coller dans un onglet la requête SQL (fichier à plat, donc) et la base de donnée provenant de BO.
Ensuite, il pourra cliquer sur les différents boutons de macro qui permettront de traiter chaque base de données pour les comparer entre elles.
Là où intervient ma formule XXL (et y en a une bonne dizaine avec la même complexité) c'est pour traiter la base de données BO pour lui appliquer un certain nombre de règles de gestion que nous voulons côté AMOA.
 
Perso, je peux me faire les formules à la main directement dans Excel ... mais pas mes collègues ... c'est pour ça que je voudrais que la formule soit dans le code pour être sûre que quand mes collègues utiliseront mon fichier pour faire la recette, ils seront sûrs que les formules seront les bonnes, et aux bons endroits (et moi aussi, je serai sûre qu'ils auront pas fait de boulettes au niveaux des formules :p )
 
Merci pour ces deux codes :
Feuil1.[J1:J20].Copy Feuil2.[B1]  
Feuil2.[B1:B20].Value = Feuil1.[J1:J20].Value

Je pense qu'ils me seront d'une grande utilité :D
Par contre, juste histoire d'être sûre ... Pour le 2ème code ... ça copie la valeur de la cellule (le résultat de la formule en dur) ou ça copie la formule ?

n°2204460
Marc L
Posté le 28-09-2013 à 00:20:58  profilanswer
 

 
           Non  .Value  est seulement la valeur ...
 
           Pour la formule ce sont les propriétés  .Formula,  .FormulaArray,  .FormulaLocal, etc …
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Sélection de plusieurs cellules : de x à la dernière cellule non vide

 

Sujets relatifs
VBA - couleur texte cellule en fonction du jourFusionner plusieurs fichiers XML avec la même structure
Comparer deux listes en multicritères[Bonnes pratiques] Balise vide dans le DOM ou création à la volée ?
[Excel] Copier le contenu de plusieurs fichier Excel dans un seul[VBA] Remplacer une formule dans plusieurs feuilles du classeur
dreamweaver feuille de style selection reglescomment faire une routine pour incrementer l'adresse d'une cellule
Lier plusieurs requêtes SQL[C/C++] Cherche fun en prog à plusieurs (social coding)
Plus de sujets relatifs à : Sélection de plusieurs cellules : de x à la dernière cellule non vide


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR