OVH Cloud OVH Cloud

Variable qui ne varie pas

14 réponses
Avatar
Zanello
Bonjour.

J'ai un problème de variable.
Dans la boucle For... Next, la variable Chan_trouvé ne change pas.
Au premier passage elle prend bien la bonne valeur mais à la boucle d'après
elle garde sa valeur sans la recalculer.
Est-ce qu'un costaud (ou une d'ailleurs...) pourrait me dire où ça pêche.
Merci d'avance.


Dim Chan_cherché As String
Windows("calculs.xls").Activate
For ligne_Chan_cherché =
Worksheets("list_chan_v").Range("A1").End(xlDown).Row To 1 Step -1
Chan_cherché = Worksheets("list_chan_v").Range("A" &
ligne_Chan_cherché).Value
If Chan_cherché = "" Then Exit Sub
Workbooks.Open FileName:= _
"C:\WINNT\Profiles\Franck\Bureau\compta\personnel fichier base.xls"
Windows("personnel fichier base.xls").Activate
Range("B45").Select
On Error Resume Next
Chan_trouvé = Range(Cells.Find(What:=Chan_cherché, After:=ActiveCell, _
LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False).Address)
If Chan_trouvé = Empty Then
MsgBox "pas trouvé le chantier"
Else: Chan_trouvé.Offset(1, 0).Select
Selection.Insert Shift:=xlDown
End If
Windows("calculs.xls").Activate
Next

4 réponses

1 2
Avatar
Paul V.
Ah oui. OK.
Je retourne regarder Rolland Garros.
En attendant, je te suggère de réactiver les alertes tant que ton code n'est
pas au point.

--
HTH

Paul V.

Zanello wrote:
Ah oui désolé.
Le code a changé depuis ce matin.
Mea Culpa


"Paul V." a écrit dans le message de news:

Sans vouloir être désagréable, pourrais tu m'expliquer pourquoi tu
copie un code différent dans ta question.
C'est pas drôle.

--
HTH

Paul V.

Zanello wrote:
Non non.
Regarde bien, il n'y a pas de Workbooks.Open dans la boucle
J'ai mis tout le code et tu peux voir que l'ouverture se fait avant

Le pas à pas s'arrête sur
Set Chan_trouvé = Range(Cells.Find(What:=Chan_cherché,
After:¬tiveCell, _
LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:úlse).Address)

Ca ne marche qu'au premier passage.
Après : erreur 91 variable objet ou variable de bloc with non
definie



Sub Prépa_list_chan()
Application.ScreenUpdating = False
Application.DisplayAlerts = False

' Ouverture du fichier pers_chan.xls

ChDir "C:WINNTProfilesFranckBureaucompta"
Workbooks.OpenText FileName:= _
"C:WINNTProfilesFranckBureaucomptapers_chan.xls",
Origin:=xlWindows, _
StartRow:=1, DataType:=xlDelimited,
TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:úlse,
Tab:=True, Semicolon:úlse, Comma:úlse _ , Space:úlse,
Other:úlse, FieldInfo:=Array(Array(1, 1), Array(2, 1), _
Array(3, 1), Array(4, 1), Array(5, 1))

' Transformation agence=0 en agence=ZA

Cells.Replace What:="0", Replacement:="ZA", LookAt:=xlPart,
SearchOrder _
:=xlByRows, MatchCase:úlse

' Création d'un nouveau classeur calculs.xls et renommages feuilles

Workbooks.Add
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs FileName:= _
"C:WINNTProfilesFranckBureaucomptacalculs.xls",
FileFormat:=xlNormal, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:úlse,
_ CreateBackup:úlse
Sheets("Feuil2").Select
Sheets("Feuil2").Name = "list_chan_v"
Sheets("Feuil1").Select
Sheets("Feuil1").Name = "pers_chan"
Windows("pers_chan.xls").Activate
Cells.Select
Selection.Copy
Windows("calculs.xls").Activate
Cells.Select
ActiveSheet.Paste
Range("A1").Select
Windows("pers_chan.xls").Activate
ActiveWorkbook.Close

' Copie des chantiers de pers_chan vers list_chan et suppression des
doublons

Cells.Select
Selection.Sort Key1:=Range("D1"), Order1:=xlAscending,
Key2:=Range("C1") _
, Order2:=xlDescending, Key3:=Range("A1"), Order1:=xlAscending,
Header _ :=xlNo, OrderCustom:=1, MatchCase:úlse,
Orientation:=xlTopToBottom Columns("D:D").Select
Selection.Copy
Sheets("list_chan_v").Select
Columns("A:A").Select
ActiveSheet.Paste
Set MaCell = Worksheets("list_chan_v").Range("A1")
Do While Not IsEmpty(MaCell)
Set MaCellSuite = MaCell.Offset(1, 0)
If MaCellSuite.Value = MaCell.Value Then
MaCell.EntireRow.Delete
End If
Set MaCell = MaCellSuite
Loop

' Mise en forme du tableau pers_chan

Sheets("pers_chan").Select
Columns("C:C").Select
Application.CutCopyMode = False
Selection.Replace What:="ZA", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:úlse
Columns("A:C").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
Selection.Borders(xlEdgeTop).LineStyle = xlNone
Selection.Borders(xlEdgeBottom).LineStyle = xlNone
Selection.Borders(xlEdgeRight).LineStyle = xlNone
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
Selection.Borders(xlEdgeTop).LineStyle = xlNone
Selection.Borders(xlEdgeBottom).LineStyle = xlNone
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Cells.Select
With Selection.Font
.Name = "Arial"
.Size = 9
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With

' Ouverture de personnel fichier base.xls

Workbooks.Open FileName:= _
"C:WINNTProfilesFranckBureaucomptapersonnel fichier
base.xls"

' Sélection du chantier cherché

Dim Chan_cherché As String
Windows("calculs.xls").Activate
For ligne_Chan_cherché >>> Worksheets("list_chan_v").Range("A1").End(xlDown).Row To 1 Step -1
Chan_cherché = Worksheets("list_chan_v").Range("A" &
ligne_Chan_cherché).Value
If Chan_cherché = "" Then Exit Sub

' Copie des noms pour le chantier sélectionné

Worksheets("pers_chan").Select
i = 1
lignes_chan = Null
nombre_lignes >>> Worksheets("pers_chan").Range("A1").End(xlDown).Row While i <
nombre_lignes + 1 If Cells(i, 4) = Chan_cherché Then
lignes_chan = lignes_chan & i & ","
End If
i = i + 1
Wend
lignes_chan = Left(lignes_chan, Len(lignes_chan) - 1)
first_cell = "A" & Left(lignes_chan, InStr(lignes_chan, ",") -
1) last_cell = "C" & Right(lignes_chan, InStr(lignes_chan, ",")
- 1) Range(first_cell, last_cell).Copy

' Recherche du chantier dans personnel fichier base.xls

Dim Chan_trouvé As Range
Windows("personnel fichier base.xls").Activate
Range("B45").Select
Set Chan_trouvé = Range(Cells.Find(What:=Chan_cherché,
After:¬tiveCell, _
LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:úlse).Address)
If Chan_trouvé = "" Or Err.Number <> 0 Then
MsgBox "pas trouvé le chantier"
Else: Chan_trouvé.Offset(1, 0).Select
Selection.Insert Shift:=xlDown
End If
Windows("calculs.xls").Activate
Next

Application.ScreenUpdating = True
End Sub



"Paul V." a écrit dans le message de news:

Je n'ai fait que lire ton morceau de code mais il me semble que tu
as très clairement une boucle for .. next à l'intérieur de laquelle
tu fait une ouverture répétée du même fichier.
En résumé:

For ligne_Chan_cherché >>>> Worksheets("list_chan_v").Range("A1").End(xlDown).Row To 1 Step -1
..................
Workbooks.Open FileName:= _
"C:WINNTProfilesFranckBureaucomptapersonnel fichier
base.xls" .....................
next

Le reste de ton code à l'air parfait.

Si tu fais un pas à pas, tu détecteras ou se passe l'erreur sans
difficulté.

Si tu n'y arrives pas, mets le code complet sur le forum.


--
HTH

Paul V.

Zanello wrote:
Je change de fenêtre avec windows(toto.xls).activate mais les
fichiers sont déjà ouverts.
L'ouverture des fichiers se fait avant la boucle et il n'y a pas
de gestion d'erreur si ce n'est la ligne de john.
If Chan_trouvé Is Empty Or Err.Number <> 0 Then
J'ai essayé
If Chan_trouvé = "" Or Err.Number <> 0 Then

Je sais pas si c'est correct mais j'ai plus l'erreur
Par contre j'ai toujours mon problème du début (variable qui ne
varie pas.) Ca ne marche qu'au premier tour de la boucle.

Merci à tous les deux pour votre contribution.


"Paul V." a écrit dans le message de news:

Bonjour,

Selon moi, il n'y pas de problème ;-)
Sauf que tu ouvres à chaque boucle le fichier ce qui doit
provoquer une erreur.
J'en déduis donc que tu as une gestion d'erreur qui n'est pas
reproduite dans ton extrait et que c'est cette gestion d'erreur
qui provoque ce que tu décris.

Vérifie s'il y a une gestion d'erreur en amont et tiens moi au
courant.

--
HTH

Paul V.

Zanello wrote:
Aie
J'ai maintenant une erreur 424 : objet requis
quand il arrive sur

If Chan_trouvé Is Empty Or Err.Number <> 0 Then



' Sélection du chantier cherché
Dim Chan_cherché As String
Windows("calculs.xls").Activate
For ligne_Chan_cherché >>>>>>> Worksheets("list_chan_v").Range("A1").End(xlDown).Row To 1 Step
-1 Chan_cherché = Worksheets("list_chan_v").Range("A" &
ligne_Chan_cherché).Value
If Chan_cherché = "" Then Exit Sub

' Copie des noms pour le chantier sélectionné
Worksheets("pers_chan").Select
i = 1
lignes_chan = Null
nombre_lignes >>>>>>> Worksheets("pers_chan").Range("A1").End(xlDown).Row While i
< nombre_lignes + 1 If Cells(i, 4) = Chan_cherché Then
lignes_chan = lignes_chan & i & ","
End If
i = i + 1
Wend
lignes_chan = Left(lignes_chan, Len(lignes_chan) - 1)
first_cell = "A" & Left(lignes_chan, InStr(lignes_chan,
",") - 1) last_cell = "C" & Right(lignes_chan,
InStr(lignes_chan, ",") - 1) Range(first_cell,
last_cell).Copy

' Recherche du chantier dans personnel fichier base.xls
Dim Chan_trouvé As Range
Windows("personnel fichier base.xls").Activate
Range("B45").Select
Set Chan_trouvé = Range(Cells.Find(What:=Chan_cherché,
After:¬tiveCell, _
LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:úlse).Address)
If Chan_trouvé Is Empty Or Err.Number <> 0 Then
MsgBox "pas trouvé le chantier"
Else: Chan_trouvé.Offset(1, 0).Select
Selection.Insert Shift:=xlDown
End If
Windows("calculs.xls").Activate
Next



"John Fuss" a écrit dans le message de
news: c91mnp$2mq$
Tu utilises on error resume next, ça vient peut-être de là,
utilise if Err.number <> 0 then 'si une erreur s'est produite


sinon ton test :
If Chan_trouvé = Empty Then
if Chan_trouvé is Empty then


If Chan_trouvé is empty or err.number = 0 then....

John

"Zanello" a écrit dans le message de
news:
C'est vrai.
J'avais enlevé le set pour voir le résultat produit et j'ai
oublié de le coller ici.
D'ailleurs s'il n'y est pas, le résultat est encore pire.
L'erreur que j'ai décrite plus bas arrive avec

Set Chan_trouvé = Range(Cells.Find(What:=Chan_cherché,
After:¬tiveCell, _
LookIn:=xlValues, LookAt:=xlPart,
SearchOrder:=xlByRows, _ SearchDirection:=xlNext,
MatchCase:úlse).Address)



"John Fuss" a écrit dans le message de
news: c91kn7$1d3$
Essai :
SET Chan_trouvé = Range(Cells.Find(What:=Chan_cherché,
After:¬tiveCell, _ LookIn:=xlValues,
LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:úlse).Address)

car Chan_trouvé est un objet Range et on doit utiliser SET
nomobj = obj.

John


"Zanello" a écrit dans le message de
news:
Bonjour.

J'ai un problème de variable.
Dans la boucle For... Next, la variable Chan_trouvé ne
change pas. Au premier passage elle prend bien la bonne
valeur mais à la boucle d'après elle garde sa valeur sans
la recalculer. Est-ce qu'un costaud (ou une d'ailleurs...)
pourrait me dire où ça pêche. Merci d'avance.


Dim Chan_cherché As String
Windows("calculs.xls").Activate
For ligne_Chan_cherché >>>>>>>>>>> Worksheets("list_chan_v").Range("A1").End(xlDown).Row To 1
Step -1 Chan_cherché >>>>>>>>>>> Worksheets("list_chan_v").Range("A" &
ligne_Chan_cherché).Value If Chan_cherché = "" Then Exit
Sub Workbooks.Open FileName:= _
"C:WINNTProfilesFranckBureaucomptapersonnel
fichier base.xls" Windows("personnel fichier
base.xls").Activate Range("B45").Select
On Error Resume Next
Chan_trouvé = Range(Cells.Find(What:=Chan_cherché,
After:¬tiveCell, _ LookIn:=xlValues, LookAt:=xlPart,
SearchOrder:=xlByRows, _ SearchDirection:=xlNext,
MatchCase:úlse).Address) If Chan_trouvé = Empty Then
MsgBox "pas trouvé le chantier"
Else: Chan_trouvé.Offset(1, 0).Select
Selection.Insert Shift:=xlDown
End If
Windows("calculs.xls").Activate
Next






















Avatar
Clément Marcotte
Bonjour,

Je n'ai pas tout lu, mais ceci ne marchera jamais:

If Chan_trouvé Is Empty Or Err.Number <> 0 Then


plutôt mettre:

is isempty(Chan_trouvé ) Or Err.Number <> 0 Then

Avatar
Clément Marcotte
Bonjour,

SVP messieurs un peu d'élagage, les messages sont rendus dans les 15K
et 16k.
Avatar
John Fuss
etonnant,

moi c'est l'inverse, j'ai des soucis avec isempty().

John

"Clément Marcotte" a écrit dans le message
de news:
Bonjour,

Je n'ai pas tout lu, mais ceci ne marchera jamais:

If Chan_trouvé Is Empty Or Err.Number <> 0 Then


plutôt mettre:

is isempty(Chan_trouvé ) Or Err.Number <> 0 Then





1 2