Question basique (enfin j'imagine) : utilisation du IF

Signaler
Messages postés
10
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
27 juin 2008
-
Messages postés
10
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
27 juin 2008
-
Bonjour,

Je suis en ce moment en stage-ingénieur environnement, donc pas programmeur de formation du tout, et j'ai un souci avec un code visual basic que l'on m'a fourni.

Le but de ce code est, à partir d'un nombre important de fichiers Excel ne contenant chacun qu'une colonne de données (des chiffres, de 0 à 10000), de tous les regrouper en un seul fichier Excel.


Ce code fonctionne, sauf dans le cas particulier ou l'un des fichiers excel qu'il traite est vide, ou ne contient qu'un chiffre. Lorsque le traitement arrive à un fichier excel de cette espèce, il s'arrête.


Mon idée serait donc d'inclure dans ce code une ou deux lignes "if" (enfin, du peu de java qu'on m'a enseigné, je crois que ça fonctionne comme ça). Ces lignes if seraient du genre :


" If première case est vide, abandonner le fichier excel en cours et passer au ficier excel suivant"


"If deuxieme case est vide, abandonner le fichier excel en cours et passer au fichier excel suivant"


Et mon problème, c'est que je ne sais absolument pas écrire ca en langage visual basic et que le tutorial me fait galérer pas mal....


Le code commence comme ça :


For i = 1 To 1001
    Sheets("Feuil1").Select
    ActiveCell.Offset(1, 0).Range("A1").Select
    NomFic = ActiveCell
    Sheets("Feuil1").Select
    Workbooks.OpenText Filename:="C:\Documents and Settings\...

Puis quelques lignes plus loin on a

ActiveCell.Offset(2, 0).Range("A1").Select
    Windows(NomFic).Close
    Next i

Voila voila, j'aimerai donc savoir où je dois placer la ou les lignes de code qui résoudront mon problème, et à quoi elles ressembleraient...
Donc une bonne âme serait-elle en mesure de me donner un coup de main, si ma question est pas trop abusée?

Merci beaucoup,
Morgan

20 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
tu pourrais nous filer la globalité du code, il m'a l'air plus compliqué qu'il ne faudrait
Messages postés
10
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
27 juin 2008

Waip

For i = 1 To 1001
    Sheets("Feuil1").Select
    ActiveCell.Offset(1, 0).Range("A1").Select
    NomFic = ActiveCell
    Sheets("Feuil1").Select
    Workbooks.OpenText Filename:="C:\Documents and Settings\mission\Bureau\Stage morgan" + NomFic, Origin:=xlMSDOS _
        , StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
        , Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
        TrailingMinusNumbers:=True
    Selection.CurrentRegion.Select
    Selection.Copy
    Windows("concatenation moi.xls").Activate
    Sheets("Feuil3").Activate
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Selection.End(xlDown).Select
    ActiveCell.Offset(2, 0).Range("A1").Select
    Windows(NomFic).Close
    Next i

Je dois préciser que je sais absolument pas ce que veulent dire toutes ces lignes au milieu, mais bon ça me semble pas être la source du problème. Après peut être qu'il existe une manière beaucoup plus simple de faire la même chose que ce code, mais c'est avec ce code là que je dois travailler, sans trop le modifier si c'est possible (c'est pour ça que deux "if" bien placés me paraissaient une bonne idée).

merci !
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
sur que ton code peut etre simplifié, ce qui le rendrais meme plus rapide.

je me perds un peu dans la cinématique...
mais je crois que tu cherches a faire ce genre de choses :


Dim i As Long
Dim NomFic As String
Dim oCSV As Workbook
For i = 1 To Sheets("Feuil1").UsedRange.End(xlDown).Row
NomFic = Sheets("Feuil1").Cells(i, 1).Text
If LenB(NomFic) Then
Workbooks.OpenText Filename:="C:" & NomFic, Origin:=xlMSDOS, _
StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False, _
Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
TrailingMinusNumbers:=True
Set oCSV = Workbooks(NomFic)
With Workbooks("concatenation moi.xls").Sheets("Feuil3")
oCSV.ActiveSheet.UsedRange.Copy .Cells(.Cells.SpecialCells(xlLastCell).Row + 1, 1)
End With
oCSV.Close
End If
Next i
Messages postés
10
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
27 juin 2008

Oula je ne comprends pas une traître ligne de tout ça (je connais visual basic depuis même pas une semaine).
Il est fort possible que ton code fonctionne mieux que celui qu'on m'a donné, mais c'est avec celui qu'on m'a donné que je dois travailler.
Donc en fait je voudrais juste savoir comment exploiter mon idée avec les "if" . Je pensais que 3 ou 4 lignes de code en plus dans ce que j'avais permettait de régler mon problème. Je me trompe, il faut vraiment tout changer?

En java, j'imagine que j'aurai pu sortir un truc genre
If cell(1,0) = vide
Then i+1

Enfin quelquechose de vraiment tout bête quoi. Mon unique souci est vraiment que le programme ne se bloque pas quand il rencontre un fichier excel vide.
Merci en tout cas
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
quel fichier ? celui qui contient le nom des fichiers ?
Messages postés
10
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
27 juin 2008

Dans le code que j'ai donné au dessus, le fichier "concatenation moi" est le fichier excel dans lequel sont "Feuil1" et "Feuil3".
D'après ce que j'ai compris, le programme "lit" Feuil1, dans laquelle sont référencés tous les noms des fichiers excel à traiter (à concaténer en fait). Ces fichiers excel sont dans le dossier C:\Documents and Settings\mission\Bureau\Stage morgan\

Le résultat, qui n'est en fait qu'une colonne pleine de chiffre, est mis dans "feuil3".


Ce que le programme me fait comme problème, que j'aimerai résoudre, c'est que lorsque je le lance, il prends tous les fichiers excels que je veux concaténer un par un à la suite. Là il me copie les données du premier, les fout dans feuil3, puis passe au fichier suivant et refait pareil. Mais lorsqu'il arrive sur un fichier excel vide, ou avec une seule case occupée par un chiffre, le programme arrete de tourner et me met un message d'erreur. Donc je voudrais dire au programme que lorsqu'il arrive sur un tel fichier excel, ben il s'en occupe pas et passe au suivant.

J'ai pas l'impression d'être super clair mais j'arrive pas vraiment à faire mieux...
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
...

le programme arrete de tourner et me met un message d'erreur.

Qu'elle est la ligne surlignée dans le VBE(Visial Basic Editeur) ?
Messages postés
10
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
27 juin 2008

Une fenetre apparait avec marqué dedans :

Erreur d'execution 1004
Erreur définie par l'application ou par l'objet

Rien ne se surligne.

Mais dans "Feuil3", j'ai quand même tous les fichiers excel concaténés, jusqu'au premier qui est vide a partir duquel le programme s'arrete de tourner (ici, sur les 1000 fichiers excel qui doivent etre concaténés, le premier qui est vide est le numero 44, donc le programme me pond pour l'instant la concaténation des 43 premiers fichiers excel.

Comme ca on pourrait penser que ca irait plus vite de suprimer moi meme les fichiers excel vides, mais je dois ensuite faire tourner ce programme sur plusieurs dizaines de milliers de fichiers excels par la suite, donc c'est pas envisageable.


Mais sinon, mon idée de mettre juste un "if....then" dedans ca pourrait pas fonctionner?
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
la faute a ton :

Selection.CurrentRegion.Select
Selection.Copy
Windows("concatenation moi.xls").Activate
Sheets("Feuil3").Activate
ActiveSheet.Paste

a toi de tester a ce niveau là, et de conditioner tout ce bloc
Messages postés
10
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
27 juin 2008

je me trompais donc sur la chose à conditionner.

ici apparement le Selection.CurrentRegion réfère aux données contenues dans le fichier excel a concaténer.
L'idée serait donc de dire
If Selection.CurrentRegion "est composé de moins de deux cases"
Then "passer directement au fichier excel suivant"

Vous sauriez dire ca dans le langage qui va bien? (si je suis venu vous demander de l'aide, c'était surtout pour ça : traduire 2 ou 3  lignes de francais en langue informatique Visual Basic)
Sinon j'imagine qu'en fouillant bien les tuto je finirai par y arriver, mais le temps que j'y ai déjà passé m'incite pas à l'optimisme, surtout que j'ai l'impression que pour un habitué de ce langage ca vient naturellement :)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
en gros et de tete :

If ActiveSheet.Cells.SpecialCells(xlLastCells).Row > 2 Then
Selection.CrrentRegion.....
......
End If
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
donc cela plante sur le 44ieme... ajoute la ligne(temporaire) suivante qui vas nous aider a debuger ton code:

For i = 1 To 1001
    If i = 44 then stop
    Sheets("Feuil1").Select

lance ton code
Maintenant ton code c'est arreté et une ligne est surlignée en jaune.
En suite appui succesivement sur la touche F8 pour executer le code ligne par ligne. Execute le code de cette façon juqu'au plantage et note la ligne en cause et revient avec.

1000 fichiers ? si j'ai bien compris cela fait 1000 colonnes ça non ?
si c'est bien le cas tu vas avoir un autre probleme car une feuille excel est limiter a 256 colonnes !
Messages postés
10
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
27 juin 2008

Que signifie "SpecialCells(xlLastCells).Row > 2" ?
Quand je lance le programme le message d'erreur 9 apparait : l'indice ne fait pas partie de la sélection.

Sinon, vu que pour chaque fichier excel a concaténer seule la colonne A a des valeurs, dire "If Selection.CurrentRegion "est composé de moins de deux cases"
Then "passer directement au fichier excel suivant""

Ca veut aussi dire "Si A3 est vide, passer au fichier excel suivant", ou bien "si A3 est plein, continuer"
La condition me parait alors plus simple.
En langage codé, ca pourrait ressembler à

If ActiveCell.Offset(1, 0).Range("A3") différent de "vide" (void?) , Then ...

Par contre, le (1,0) après Offset je vois pas trop avec quoi c'est en rapport. mais bref dans l'idée ca doit fonctionner.


 


Vous pourriez donc me mettre decker comme il faut  le
 "If ActiveCell.Offset(1, 0).Range("A3") différent de "vide" (void?) , Then "
?

Merci bcp !
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
j'ai fait de tête....

c'etait: xlCellTypeLastCell

different de vide ?

<>""
Messages postés
10
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
27 juin 2008

j'ai fait ta manip bigfish


et la ligne pourlaquelle ca bug (à l'itération 143, soit le numero du premier fichier apres le 43ème à etre vide) c'est Selection.CurrentRegion.Select


je suppsoe que ca signifie qu'on était donc sur la bonne piste et que c'est là qu'il faut conditionner.
avec "If ActiveCell.Offset(1, 0).Range("A3") différent de "vide" (void?) , Then "

peut etre  ?
Messages postés
10
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
27 juin 2008

Bon et bien que ce soit avec l'une ou l'autre ligne if, ca fonctionne jusqu'au fichier excel numero 72, puis ca plante avec l'erreur 1004 comme avant.
Ce qui m'étonne, c'est que ce fichier 72 est banal, il a des données sur 10 ou 12 cases, bref je vois pas en quoi il est différent des autres.
Je vais donc chercher un peu ou est la merde, et si j'arrive pas à la régler je reviendrai sans doute prendre de vos conseils.

Mrci beaucoup pour votre aide en tout cas !
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
arrete avec ton if ! une ligne : On local error resume next  suffit. Pas besoin de savoir dans quel cas cela vas planter mais juste de savoir qu'elle est la ligne
Honnetement pour du excel ta methode est globalement mauvaise. il y a peu pres tout a refaire et c'est ce qu'essai courgeusement  de faire  Renfield  mais je trouve que c'est peine perdu  vu  que ce n'est de toute facon pas ton intention.  Tu arrive ici  comme quelqu'un qui arriverait chez le garagiste en disant ma batterie charge pas changer moi l'alternateur ! Le garagiste de te repondre :
-laisser moi regarder ce n'est peut etre pas l'alternateur
tu lui reponds
- c'est l'alternateur changer le.
le jour suivant il te rappel et te dit
- j'ai changer votre alternateur mais cela ne marche toujours pas !?!

tu n'est pas informaticien mais tu es ingenieur, tu dit connaitre un peu le java et tu n'es meme pas capable de comprendre l'aide du VBA sur une condition if.

Ok je m'enerve un peu la... je suis ingenieur aussi et pas informaticien mais cela ne ma pas empecher de la comprendre cette condition if ! et avec l'aide en anglais en plus... mais ça fait du bien de temps temps un petit coup de gueule
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
...

ce qui suit fonctionne sans tenir compte de ce qu'il y a dans les cellules a copier, verifi l'existance des fichiers et ne selectionne rien mais plantera apres la 256 ieme colonnes comme je te l'ai deja dit

Dim Chemin As String
Chemin = "C:\Documents and Settings\mission\Bureau\Stage morgan"
For i = 1 To 1001
    nomfic = ThisWorkbook.Sheets("Feuil1").Range("A" & i).Value
    nomfic = Dir(Chemin & nomfic) 'on test si le fichier exite
    If Not nomfic = "" Then 'si le fichier existe nonfic <> ""
        Workbooks.Open FileName:=nomfic
        Sheets("feuil1").Columns(1).Copy
        ThisWorkbook.ActiveSheet.Paste Destination:=ThisWorkbook.Sheets("feuil3").Columns(i)
        Workbooks(nomfic).Close SaveChanges:=False
    End If
Next i

A+
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
oups

Dim Chemin As String
Chemin = "C:\Documents and Settings\mission\Bureau\Stage morgan"
For i = 1 To 1001
    nomfic = ThisWorkbook.Sheets("Feuil1").Range("A" & i).Value
    nomfic = Dir(Chemin & nomfic) 'on test si le fichier exite
    If Not nomfic = "" Then 'si le fichier existe nonfic <> ""
        Workbooks.Open FileName:= Chemin & nomfic
        Sheets("feuil1").Columns(1).Copy
        ThisWorkbook.ActiveSheet.Paste Destination:=ThisWorkbook.Sheets("feuil3").Columns(i)
        Workbooks(nomfic).Close SaveChanges:=False
    End If
Next i
Messages postés
10
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
27 juin 2008

Ce qui est fou, c'est qu'hier matin j'ai du faire changer ma batterie et que j'ai commencé par demandé si l'alternateur avait pas un problème. Véridique

Sinon désolé d'avoir été un peu gonflant, mais je connais vraiment rien à tout ça, on vient de me mettre ca entre les bras et c'est pas vraiment mon choix d'essayer a tout prix de faire fonctionner ce code plutot que d'en changer.

Enfin merci beaucoup d'essayer de m'aider en tout cas.
Je vais essayer ta méthode lundi au boulot bigfish, on verra si ca fonctionne, et sinon j'essaierai d'adapter :)

ah oui sinon, les cellules osnt remplies par lignes et pas par colonne, donc je crois que ca va jusqu'a plus de 60000 pour les lignes, devrait pas y avoir de probleme.

A+ :)