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

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Diverses questions VBA

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Diverses questions VBA

n°2276160
raph0ux
Amateur de PC
Posté le 24-02-2016 à 11:50:05  profilanswer
 

:hello:
 
Je débute sur VBA et j'ai besoin de ranger mes données, pour faire simple je donne un exemple :
 
J'ai toutes les villes de France dans une seule feuille avec une colonne qui correspond au numéro de département
Je veux que chaque ville soit copiée dans une feuille qui correspond à son département.
 
Sauf que bien évidemment, dans mon fichier c'est pas des départements (qui se suivent, et donc où il est facile de faire une boucle) mais des caisses avec des numéros qui n'ont rien à voir entre eux.
 
Le code  

Code :
  1. For i = 2 To 36691
  2. Sheets("Maquette" ).Select
  3. Cells(i, 2) = NumeroCaisse
  4. Sheets("MAQUETTE" ).Copy Before:=Sheets(1)
  5. ActiveSheet.Name = (NuméroCaisse)


 
Enfin c'est pas exactement ce que j'ai mis mais vu que ça ne fonctionne pas... :o
 
Je crois que c'est simple, j'ai déjà fait la même chose mais avec des classeurs au lieu des feuilles, mais j'ai paumé le fichier  :sweat:  
 
Ci-mer d'avance  :hello:


Message édité par raph0ux le 14-03-2016 à 11:54:03
mood
Publicité
Posté le 24-02-2016 à 11:50:05  profilanswer
 

n°2276161
raph0ux
Amateur de PC
Posté le 24-02-2016 à 11:51:43  profilanswer
 

C'est la toute dernière étape de ma macro, donc ça m'emmerde de rester coincé là. Je ne vous copie pas le code entier, il doit être tellement lourd que ça risquerait de passer en hors forfait chez vous :o


---------------
Topic A/V : Clavier Corsair K65 /// Poussette Trio Peg Perego
n°2276164
Chelmi18
Posté le 24-02-2016 à 13:57:08  profilanswer
 

Bonjour,
 
Qu'est ce qui ne fonctionne pas exactement : le renommage de la feuille ? la copie de la ville ? Avec/Sans message d'erreur ?
 
Déjà je vois plusieurs etrangetés dans ton code :
Lignes 1 et 2 => A quoi sert le même Select dans une boucle ?
Ligne 3 => Ce ne serait pas plutôt l'inverse pour alimenter NumeroCaisse ?
Ligne 5 => La feuille active est-elle bien celle à renommer ?
 
D'une manière générale, éviter les .Select et les ActiveQuelquechose, c'est assez casse-gueule et très consommateur en temps.
Rien ne vaut de nommer directement les objets Sheets("Maquette" ).Cells(i, 2) par exemple.

n°2276166
raph0ux
Amateur de PC
Posté le 24-02-2016 à 14:06:15  profilanswer
 

J'ai récupéré des bouts de code d'une boucle de plusieurs centaines de lignes, qui n'est pas forcément optimisée elle non plus (mais qui fonctionne) donc il est possible que les deux boucles soient le résultat de cette quantité de lignes :D Donc je sais que ce que j'ai posté n'est pas bon du tout, mais c'était histoire de partir sur une base de réflexion.
Pour la ligne 1 & 2, effectivement, pas bien utile...
Pour la ligne 3 tu as tout à fait raison, c'est d'ailleurs comme ça dans le code source, mais je ne sais pas trop ce que j'ai foutu pour que ça arrive dans cet ordre là ici :sweat:  
 
Pour les .activate, je pensais que c'était pour éviter les .select :lol:  
J'essaie de prendre de bonnes habitudes, je vais essayer de nettoyer le code comme tu me l'indiques :jap:
 
Et pour répondre à la première question, il me dit que la feuille existe déjà et s'arrête au lieu d'alimenter la dernière ligne non vide.
 
Donc voilà, je suis un peu paumé, je sais faire des boucles simples, mais pour l'export ça a toujours été la merde.
 
Idéalement j'aimerai éviter d'importer la liste de mes caisses dans mon fichier, histoire d'impliquer moins de classeurs, même si ça simplifierait les choses (je crois :o)


---------------
Topic A/V : Clavier Corsair K65 /// Poussette Trio Peg Perego
n°2276173
raph0ux
Amateur de PC
Posté le 24-02-2016 à 16:24:47  profilanswer
 

Bon en fait c'était une boucle toute conne qu'il me fallait :o
 

Code :
  1. For i = 3 To 41
  2.         Workbooks("Recensement.xlsm" ).Activate
  3.         Sheets("LISTE Caisse" ).Select
  4.         NumCaisse = Cells(i, 2)
  5.         Workbooks("Fichiers fusionnés.xlsx" ).Activate
  6.         Worksheets("Données" ).Activate
  7.         ActiveSheet.Range("$A$2:$J$37000" ).AutoFilter Field:=3, Criteria1:=NumCR
  8.         Range("A1:J37000" ).Copy
  9.         ActiveSheet.Range("$A$2:$D$42" ).AutoFilter Field:=2
  10.         Sheets.Add after:=Sheets(Sheets.Count)
  11.         Sheets(Sheets.Count).Name = NumCaisse
  12.         ActiveSheet.Paste
  13.      
  14. Next


 
Bon par contre j'ai pas le droit de coller visiblement...
Je me demande bien pourquoi d'ailleurs :/
 
Après oui le code est dégueulasse :o
Je sais pas comment scanner comme sur SAS pour qu'il me prenne les lignes 1 par 1 alors je met en place le filtre, mais y'a sûrement mieux à faier  [:transparency]


---------------
Topic A/V : Clavier Corsair K65 /// Poussette Trio Peg Perego
n°2276201
Marc L
Posté le 24-02-2016 à 20:17:18  profilanswer
 

 
            'soir !
 
            Voir aussi du côté du filtre avancé pouvant copier directement les données dans la même instruction !
 

n°2276229
Chelmi18
Posté le 25-02-2016 à 08:25:16  profilanswer
 

Effectivement Marc L.
 
raph0ux, c'est le ActiveSheet.Paste qui ne lui plait pas, comme je te l'ai dis, évite les ActiveToto, c'est source de galère.
 
Pour copier une feuille, tu vérifies avant qu'elle n'existe pas et un simple .Copy suffit (dans l'exemple ci-dessous, on duplique la dernière feuille avec Sheets(Sheets.Count).Copy) :
 

Code :
  1. For i = 1 To Sheets.Count
  2.    If Sheets(i).Name = nomNouvelleFeuille Then feuillExiste = True
  3. Next i
  4. If Not (feuillExiste) Then
  5.    Sheets(Sheets.Count).Copy After:=Sheets(Sheets.Count)
  6.    Sheets(Sheets.Count).Name = nomNouvelleFeuille
  7. End If

n°2276250
raph0ux
Amateur de PC
Posté le 25-02-2016 à 10:25:25  profilanswer
 

Ouais je comprends bien que ça soit source de problèmes, mais pour l'instant je ne touche pas assez en VBA pour pouvoir m'en passer, mais j'essaie de nettoyer le code le plus possible au fur et à mesure :jap:
 
Après ici pas besoin de vérifier que la feuille existe ou non puisqu'en début de macro je crée un nouveau classeur, mais ça sera utile pour plus tard ! :jap:
Merci pour vos commentaires :jap:
Bon du coup c'est bon, mais ça met presque 10 minutes pour créer un classeur de 40 feuilles et 50 000 lignes :cry:
 
Sinon, je dois faire un formulaire qui doit me renvoyer au bon nom de ville, même s'il est mal écrit, mais avec la fonction like j'ai l'impression que je dois rajouter 50 lignes par ville pour que ça soit sûr :/


---------------
Topic A/V : Clavier Corsair K65 /// Poussette Trio Peg Perego
n°2276263
Marc L
Posté le 25-02-2016 à 12:19:07  profilanswer
 

 

raph0ux a écrit :

mais ça met presque 10 minutes pour créer un classeur de 40 feuilles et 50 000 lignes :cry:


             A lire
 

n°2277196
raph0ux
Amateur de PC
Posté le 08-03-2016 à 13:59:18  profilanswer
 

Super intéressant comme post, et ceux vers lesquels ils renvoient :jap:


Message édité par raph0ux le 08-03-2016 à 14:13:41

---------------
Topic A/V : Clavier Corsair K65 /// Poussette Trio Peg Perego
mood
Publicité
Posté le 08-03-2016 à 13:59:18  profilanswer
 

n°2277197
raph0ux
Amateur de PC
Posté le 08-03-2016 à 14:18:51  profilanswer
 

Par contre, je suis bien obligé d'utiliser .activate avant quand j'écris ça :

 
Code :
  1. Workbooks("Arrivée.xlsx" ).Sheets("Résultat" ).Range("A:A" ) = Workbooks("Départ" ).Sheets("Source" ).Range("A7", [E7].End(xlDown)).Value
 

Non ? Si la feuille Source n'est pas activée j'ai une erreur 1004.
Pourtant, elle est ouverte et bien définie il me semble :??:

 

Là dans ce code, ça recopie un million de ligne dont 99% de #NA, donc il faut que je trouve comment lui dire de s'arrêter quand il n'y a plus rien :whistle:

Message cité 1 fois
Message édité par raph0ux le 08-03-2016 à 14:21:40

---------------
Topic A/V : Clavier Corsair K65 /// Poussette Trio Peg Perego
n°2277205
raph0ux
Amateur de PC
Posté le 08-03-2016 à 16:42:03  profilanswer
 

Une idée pour un équivalent de .end(xldown) quand il s'agit de la zone d'arrivée ? Je voudrais coller exactement le contenu des 5 colonnes de la première feuille, mais le nombre de lignes est variable :/
 
J'ai essayé pas mal de trucs mais je n'arrive pas à trouver...


---------------
Topic A/V : Clavier Corsair K65 /// Poussette Trio Peg Perego
n°2277216
Marc L
Posté le 08-03-2016 à 18:38:28  profilanswer
 

raph0ux a écrit :

Par contre, je suis bien obligé d'utiliser .activate avant quand j'écris ça :
 

Code :
  1. Workbooks("Arrivée.xlsx" ).Sheets("Résultat" ).Range("A:A" ) = Workbooks("Départ" ).Sheets("Source" ).Range("A7", [E7].End(xlDown)).Value


 
Non ? Si la feuille Source n'est pas activée j'ai une erreur 1004.
Pourtant, elle est ouverte et bien définie il me semble :??:


            En fait tu as oublié de référencer la feuille de [E7] ‼ Donc sans feuille, c'est par défaut la feuille active …
 
 
            Aucun besoin d'activer en respectant bien le modèle objet d'Excel :
 

Code :
  1. With Workbooks("Départ" ).Sheets("Source" )
  2.      R& = .[E7].End(xlDown).Row - 6
  3.      Workbooks("Arrivée.xlsx" ).Sheets("Résultat" ).[A1:E1].Resize(R).Value = .[A7:E7].Resize(R).Value
  4. End With


            Edit : variante du code du post suivant …


Message édité par Marc L le 08-03-2016 à 18:56:01
n°2277217
Marc L
Posté le 08-03-2016 à 18:43:50  profilanswer
 

raph0ux a écrit :

Une idée pour un équivalent de .end(xldown) quand il s'agit de la zone d'arrivée ? Je voudrais coller exactement le contenu des 5 colonnes de la première feuille, mais le nombre de lignes est variable


Code :
  1. With Workbooks("Départ" ).Worksheets("Source" )
  2.     VA = .Range("A7", .[E7].End(xlDown)).Value
  3. End With
  4.     Workbooks("Arrivée.xlsx" ).Worksheets("Résultat" ).[A1:E1].Resize(UBound(VA)).Value = VA

 

n°2277231
raph0ux
Amateur de PC
Posté le 09-03-2016 à 09:47:23  profilanswer
 

C'est le Ubound visiblement que je ne maîtrise pas du tout, j'ai vu le post à ce sujet, il va falloir que je me documente :jap:
 
Par contre, elle est bien référencée la feuille de [E7] non ? ("Source" ) :??:


---------------
Topic A/V : Clavier Corsair K65 /// Poussette Trio Peg Perego
n°2277248
Marc L
Posté le 09-03-2016 à 11:00:45  profilanswer
 

            Pour la fonction UBound comme pour le reste, placer dans le code le curseur texte dessus puis appuyer sur la touchehttp://www.developpez.net/forums/images/smilies/f1.gif et lire …
 
            Dans ton code, [E7] n'ayant pas de feuille de calculs précisée, il fait donc référence à la feuille active ‼
 
            La bonne syntaxe est

Code :
  1. Workbooks("Arrivée.xlsx" ).Sheets("Résultat" ).Range("A:A" ) = Workbooks("Départ" ).Sheets("Source" ).Range("A7", Workbooks("Départ" ).Sheets("Source" ).[E7].End(xlDown)).Value


            D'où la simplification via l'instruction With dans mes deux exemples précédents …
 

n°2277298
raph0ux
Amateur de PC
Posté le 09-03-2016 à 15:39:20  profilanswer
 

Ok, merci pour la précision :jap:
 
Et la touche F1 sur Office 2010 ça fait un moment qu'elle ne sert plus à rien :o
Ceci dit je me suis renseigné sur la fonction entre temps ;)


---------------
Topic A/V : Clavier Corsair K65 /// Poussette Trio Peg Perego
n°2277320
Marc L
Posté le 09-03-2016 à 17:02:33  profilanswer
 

 
            Pour l'aide VBA interne, soit tu es bien configuré dessus (sans passer par le Web) mais Excel a été mal installé
            soit tu es configuré pour aller sur le Web (peut se modifier via l'icône en bas de la fenêtre) mais il y a un souci de droit d'accès,
            bref, voir avec le service informatique …


Message édité par Marc L le 09-03-2016 à 17:03:45
n°2277327
raph0ux
Amateur de PC
Posté le 09-03-2016 à 17:25:44  profilanswer
 

Mon contrat sera terminé d'ici à ce qu'ils me répondent [:rofl]


---------------
Topic A/V : Clavier Corsair K65 /// Poussette Trio Peg Perego
n°2277446
raph0ux
Amateur de PC
Posté le 10-03-2016 à 17:21:36  profilanswer
 

Bon effectivement c'est un milliard de fois plus rapide et tout con en fait d'utiliser ubound :jap:

 


Message édité par raph0ux le 15-03-2016 à 16:36:17

---------------
Topic A/V : Clavier Corsair K65 /// Poussette Trio Peg Perego
n°2277695
raph0ux
Amateur de PC
Posté le 15-03-2016 à 16:40:25  profilanswer
 

J'ai un truc qui me rend fou depuis tout à l'heure :

 
Code :
  1. i = 1
  2. For j = 2 To 36
  3. Worksheets("Maquette" ).Activate
  4.     If Cells(j, 13).Value <> "Moyenne" Then
  5.         dfg = Cells(j, 13).Value
  6.         ActiveSheet.ChartObjects("Graphique 2" ).Activate
  7.         ActiveChart.ChartArea.Copy
  8.         Worksheets(dfg).Activate
  9.         Range("Q3" ).Select
  10.         ActiveSheet.Paste
  11.         ActiveChart.SeriesCollection(1).Points(i).Interior.ColorIndex = 3
  12.         ActiveChart.SeriesCollection(1).Points(16).Interior.ColorIndex = 6
  13. i = i + 1
  14.     End If
  15. Next
 

On passera sur les .Activate et .select, mais j'ai un problème sur la ligne en rouge

 

Pour une raison que j'ignore, il me semble que ce matin ça fonctionnait (j'ai modifié des choses ailleurs entre temps mais qui ne sont pas du tout liées à ce passage de ma macro) mais maintenant, impossible de ne pas avoir l'erreur d'exécution 9 : l'indice n'appartient pas à la sélection...

 

Quand je remplace Worksheets(dfg).Activate par la valeur de dfg, ça fonctionne....

 

La copie et le collage du graphique ne fonctionne pas non plus du coup, ce que je comprends encore moins dans la mesure où pareil, ça fonctionnait ce matin.  :fou:

 

Si quelqu'un a une idée...  :whistle:


Message édité par raph0ux le 15-03-2016 à 17:10:00

---------------
Topic A/V : Clavier Corsair K65 /// Poussette Trio Peg Perego
n°2277704
raph0ux
Amateur de PC
Posté le 15-03-2016 à 17:06:08  profilanswer
 

Bordel de merde :o
 
Suffisait d'un Dim dfg$
 
Y'a 10 minutes je me disais que j'étais gogol de jamais définir mes variables mais que c'était pas grave parce que ça avait jamais planté :o


---------------
Topic A/V : Clavier Corsair K65 /// Poussette Trio Peg Perego
mood
Publicité
Posté le   profilanswer
 


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

  Diverses questions VBA

 

Sujets relatifs
Exporter les resultats d'une requete sql[Problème Maro Vba ] Exporter une colonne en fichier Texte.
Comment transformer un projet C++ .exe en .DLL pour exporter des fonctexporter données vers feuilles excel
Exporter documentation Doxygen vers un wiki PHP ?exporter une table en fichier texte csv[résolu]
[SQL Server 2005] Exporter une table vers un fichier texte via SSISExporter Access vers Excel
exporter données à partir d'excel vers une table access[Subversion]Exporter un dossier avec une liste d'exclusion
Plus de sujets relatifs à : Diverses questions VBA


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR