Extraction de données

Résolu
cs_niemans Messages postés 8 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 17 mai 2007 - 17 mai 2007 à 19:20
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 - 18 mai 2007 à 02:41
Bonjour,
je veux copier des données dans un gros fichier excel et les coller dans des feuilles différentes.
Chaque bloc de données commence par Data et comprend une trentaine de lignes suivi des chiffres
disposés sur 8 colonnes et 1000 lignes environ.Le fichier comprend une quinzaine de blocs.
J'ai commencé par faire 2 macros: une pour créer les feuilles et une autre pour copier les données dedans.
Les 2 macros fonctionnant séparément j'ai voulu les regrouper.La première partie fonctionne et les feuilles sont créées et renommées.La copie des données ne fonctionne plus.
La macro s'arrête à la ligne 29 avec le message: 'erreur d'execution '1004': erreur définie par l'application ou par l'objet'.Si quelqu'un a une idée de ce qui provoque le bug je suis preneur.<ol><li>Sub CopyData()</li><li>' Déclaration des variables</li><li>Dim nbfeuille As Integer</li><li>Dim cpt As Integer</li><li>Dim bVerif As Boolean</li><li>Dim MyStart As Long</li><li>Dim compteur As Long</li><li>compteur 1</li><li>' Initialisation du n° de feuille</li><li>cpt 1</li><li>nbfeuille = 20</li><li>'Créer les nbfeuille et les renommer</li><li>For ind = 1 To nbfeuille</li><li>   Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "range" & Format(cpt, "00")</li><li>   cpt = cpt + 1</li><li>Next ind</li><li>'copie des données</li><li>For i = 1 To 20000</li><li>boucle:</li><li>    If Cells(i, 2).Value = "(Data" Then</li><li>       If bVerif = False Then</li><li>            MyStart = i</li><li>            bVerif = True</li><li>       Else</li><li>            Exit For</li><li>       End If</li><li>    End If</li><li>Next</li><li>        Range(Cells(MyStart, 1), Cells(i - 1, 12)).Copy</li><li>        Worksheets(compteur + 1).Range("A1").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _</li><li>        False, Transpose:=False</li><li>        compteur = compteur + 1</li><li>If Cells(i, 2).Value = "(Data" Then</li><li>  MyStart = i</li><li>  bVerif = False</li><li>  GoTo boucle</li><li>End If</li><li>End Sub</li></ol>

5 réponses

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
18 mai 2007 à 02:41
Salut,

concernant le i-1 dans Range(Cells(MyStart, 1), Cells(i - 1, 12)).Copy, il sera toujours = à 19999 car la boucle va de 1 à 20000, cette ligne d'instruction n'est lu qu'après la boucle (et pas dedans).
Donc i - 1 = 0  --> faux !

Ligne 13 à 16, tu crées des feuilles, ok, mais pense à resélectionner celle qui contient le données, sinon, tu vas lire des feuilles blanches

@++

<hr size="2" width="100%" />
  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
3
chapaleufu Messages postés 29 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 19 mai 2007
17 mai 2007 à 21:00
en 19 tu commences ta boucle a 1
en 29 tu definis un range avec un cells(i-1,12), donc un cells(0,12) : mauvais plan

2 remarques:
1- il est prferable de recourrir aux collections, ainsi pour pour boucler sur les feuilles du wb: "for each feuille in wb"
2- mis a part le gestionnaire d'erreur (on error goto), je ne suis pas fanatique des "goto label", ca rend le code plutot confus et plus difficile a debugge, mais c'est un avis personnel (je prefere les boucles, les appels a des UDF et/ou des procedures.
0
cs_niemans Messages postés 8 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 17 mai 2007
17 mai 2007 à 21:54
Merci pour la réponse.
J'ai essayé de modifier le programme en commençant la boucle à 10 mais j'obtient la même erreur.
Ce qui est étonnant c'est que les deux parties du programme fonctionne séparément.
Je suis debutant en programmation alors j'utilise ce que connait mais je vais me pencher sérieusement sur l'utilisation des collections.
Que signifie "appel à des UDF", ce sont des fonctions?
0
chapaleufu Messages postés 29 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 19 mai 2007
17 mai 2007 à 22:09
UDF=User Define Function, ce sont les fonctions qu tu as construites.

verifie la valeur de la variable "MyStart", elle ne s'incremente que si bVerif = False sinon elle est a 0 aussi
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_niemans Messages postés 8 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 17 mai 2007
17 mai 2007 à 22:36
Ah OK ce sont des fonction perso, c'est sûr que le code est plus lisible.
J'ai regardé dans la fenêtre de debogage de VBA, effectivement "MyStart" est à 0.
C'est bizard, normalement, comme la cellule B26 contient la valeur "(Data", "MyStart aurait due s'incrémenter"?
0
Rejoignez-nous