Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

2 variables successives qui posent pb (vba)

6 réponses
Avatar
j-pascal
Bonjour,

Dans le code qui suit, je ne comprends pas pourquoi, je ne peux pas
récupérer les 2 valeurs liées à "x1" et "x2".

Si, j'effectue la procédure en mode pas à pas, si "t" (N° Cde) n'existe
pas dans ma plage "Col_Import", "x2" ne se calcule pas et la procédure
se termine.

Je pensais qu'indépendemment du résultat de x1, je pouvais voir le
résultat pour x2 en survolant la variable avec la souris !

'------------------
t = "N° cde"
s = "NBC"

y = Range("Col_Import").Item(Range("Col_Import").Count).End(xlUp).Row

x1 = Range("Import").Find(t, Range("Import").Item(1), xlFormulas,
xlWhole, xlByRows, xlNext, False, False).Row + 1
x2 = Range("Import").Find(s, Range("Import").Item(1), xlFormulas,
xlWhole, xlByRows, xlNext, False, False).Row + 1
'------------------

Je crains que cette question soit stupide, mais je n'arrive pas à voir
ce qui cloche !

Merci pour vos lumières,

JP

6 réponses

Avatar
isabelle
bonjour Jp,

si t n'est pas trouvé cela provoque un erreur, as tu mis une gestion
d'erreur dans ton code ?

isabelle

j-pascal a écrit :
Bonjour,

Dans le code qui suit, je ne comprends pas pourquoi, je ne peux pas
récupérer les 2 valeurs liées à "x1" et "x2".

Si, j'effectue la procédure en mode pas à pas, si "t" (N° Cde)
n'existe pas dans ma plage "Col_Import", "x2" ne se calcule pas et la
procédure se termine.

Je pensais qu'indépendemment du résultat de x1, je pouvais voir le
résultat pour x2 en survolant la variable avec la souris !

'------------------
t = "N° cde"
s = "NBC"

y = Range("Col_Import").Item(Range("Col_Import").Count).End(xlUp).Row

x1 = Range("Import").Find(t, Range("Import").Item(1), xlFormulas,
xlWhole, xlByRows, xlNext, False, False).Row + 1
x2 = Range("Import").Find(s, Range("Import").Item(1), xlFormulas,
xlWhole, xlByRows, xlNext, False, False).Row + 1
'------------------

Je crains que cette question soit stupide, mais je n'arrive pas à voir
ce qui cloche !

Merci pour vos lumières,

JP




Avatar
j-pascal
bonjour Isabelle,

Non. La seule gestion d'erreur que je "sais" utiliser, c'est "on ...
resume next".
Dans mon exemple, je n'ai pas de message d'erreur. La précédure se
termine, prématurément, c'est tout !

Un moment, j'ai pensé à un DoEvents, ou qqch du genre, mais sans
conviction.

Bon dimanche,

jp

bonjour Jp,

si t n'est pas trouvé cela provoque un erreur, as tu mis une gestion d'erreur
dans ton code ?

isabelle

j-pascal a écrit :
Bonjour,

Dans le code qui suit, je ne comprends pas pourquoi, je ne peux pas
récupérer les 2 valeurs liées à "x1" et "x2".

Si, j'effectue la procédure en mode pas à pas, si "t" (N° Cde) n'existe pas
dans ma plage "Col_Import", "x2" ne se calcule pas et la procédure se
termine.

Je pensais qu'indépendemment du résultat de x1, je pouvais voir le résultat
pour x2 en survolant la variable avec la souris !

'------------------
t = "N° cde"
s = "NBC"

y = Range("Col_Import").Item(Range("Col_Import").Count).End(xlUp).Row

x1 = Range("Import").Find(t, Range("Import").Item(1), xlFormulas,
xlWhole, xlByRows, xlNext, False, False).Row + 1
x2 = Range("Import").Find(s, Range("Import").Item(1), xlFormulas,
xlWhole, xlByRows, xlNext, False, False).Row + 1
'------------------

Je crains que cette question soit stupide, mais je n'arrive pas à voir ce
qui cloche !

Merci pour vos lumières,

JP




Avatar
j-pascal
Bonjour Isabelle,

Ceci semble fonctionner, mais c'est une usine à gaz, ce qui me désole.
Ma solution (sous réserve qu'elle ne dissimule pas d'erreurs que je
n'aurais pas vues ...) est lamentable :

'-------
Sub PlageACopier()
Dim x1 As Integer
Dim x2
Dim x
Dim y 'As Integer
Dim n 'As Integer erreur ???
Dim AdrPlageImport
Dim t
Dim s

t = "N° cde"
s = "NBC"

y =
Range("Col_Import").Item(Range("Col_Import").Count).End(xlUp).Row

Stop
On Error GoTo r1
x1 = Range("Col_Import").Find(t, Range("Col_Import").Item(1),
xlFormulas, xlWhole, xlByRows, xlNext, False, False).Row + 1
GoTo r2
r1:
x1 = 0

r2:
On Error GoTo r3
x2 = Range("Col_Import").Find(s, Range("Col_Import").Item(1),
xlFormulas, xlWhole, xlByRows, xlNext, False, False).Row + 1
GoTo r4
r3:
x2 = 0

r4:

If x1 > 0 Then
x = Range("Import").Find(t, Range("Import").Item(1),
xlFormulas, xlWhole, xlByRows, xlNext, False, False).Row + 1
Else
x = Range("Import").Find(s, Range("Import").Item(1),
xlFormulas, xlWhole, xlByRows, xlNext, False, False).Row + 1
End If

AdrPlageImport = Range(Cells(x, 1), Cells(y, 7)).Address '[g4]
= Range(Cells(x, 1), Cells(y, 7)).Address
Range(AdrPlageImport).Copy

End sub

'-------

bonjour Jp,

si t n'est pas trouvé cela provoque un erreur, as tu mis une gestion d'erreur
dans ton code ?

isabelle

j-pascal a écrit :
Bonjour,

Dans le code qui suit, je ne comprends pas pourquoi, je ne peux pas
récupérer les 2 valeurs liées à "x1" et "x2".

Si, j'effectue la procédure en mode pas à pas, si "t" (N° Cde) n'existe pas
dans ma plage "Col_Import", "x2" ne se calcule pas et la procédure se
termine.

Je pensais qu'indépendemment du résultat de x1, je pouvais voir le résultat
pour x2 en survolant la variable avec la souris !

'------------------
t = "N° cde"
s = "NBC"

y = Range("Col_Import").Item(Range("Col_Import").Count).End(xlUp).Row

x1 = Range("Import").Find(t, Range("Import").Item(1), xlFormulas,
xlWhole, xlByRows, xlNext, False, False).Row + 1
x2 = Range("Import").Find(s, Range("Import").Item(1), xlFormulas,
xlWhole, xlByRows, xlNext, False, False).Row + 1
'------------------

Je crains que cette question soit stupide, mais je n'arrive pas à voir ce
qui cloche !

Merci pour vos lumières,

JP




Avatar
Hervé
Bonjour,
Je n'ai pas tout compris dans ton code car il y a des variables qui sont
initialisées et pas utilisées ? Prend l'habitude de typer tes variables,
moins de mémoire utilisée et code plus rapide.
Teste si cela te convient et adapte :

Sub PlageACopier()

Dim Plage As Range
Dim PlageImport As Range
Dim Cel_1 As Range
Dim x As Integer 'Long si au delà de 32767
Dim y As Integer
Dim t As String
Dim s As String

t = "N° cde"
s = "NBC"

'défini la plage
Set Plage = [Col_Import]

'récupère le N° de la dernière ligne
'de la plage
With Plage
y = .Cells(1, 1).Row + .Rows.Count - 1
End With

'recherche la valeur de "t" dans la plage
Set Cel_1 = Plage.Find(t, , xlFormulas, xlWhole)

'si trouvé
If Not Cel_1 Is Nothing Then
x = Cel_1.Row + 1
Else
'sinon, recherche la valeur de "s" dans la plage
Set Cel_1 = Plage.Find(s, , xlFormulas, xlWhole)
'si trouvé
If Not Cel_1 Is Nothing Then
x = Cel_1.Row + 1
'sinon, message et sortie de procédure
Else
MsgBox "Valeur pas trouvée :o(("
Exit Sub
End If
End If

'défini la plage à copier
Set PlageImport = Range(Cells(x, 1), Cells(y, 7))

'et copie dans la feuille 2 à partir de A1
'à adapter
PlageImport.Copy Worksheets("Feuil2").[A1]

Set Plage = Nothing
Set Cel_1 = Nothing
Set PlageImport = Nothing

Hervé.


End Sub
"j-pascal" a écrit dans le message de
news:
Bonjour,

Dans le code qui suit, je ne comprends pas pourquoi, je ne peux pas
récupérer les 2 valeurs liées à "x1" et "x2".

Si, j'effectue la procédure en mode pas à pas, si "t" (N° Cde) n'existe
pas dans ma plage "Col_Import", "x2" ne se calcule pas et la procédure se
termine.

Je pensais qu'indépendemment du résultat de x1, je pouvais voir le
résultat pour x2 en survolant la variable avec la souris !

'------------------
t = "N° cde"
s = "NBC"

y = Range("Col_Import").Item(Range("Col_Import").Count).End(xlUp).Row

x1 = Range("Import").Find(t, Range("Import").Item(1), xlFormulas,
xlWhole, xlByRows, xlNext, False, False).Row + 1
x2 = Range("Import").Find(s, Range("Import").Item(1), xlFormulas,
xlWhole, xlByRows, xlNext, False, False).Row + 1
'------------------

Je crains que cette question soit stupide, mais je n'arrive pas à voir ce
qui cloche !

Merci pour vos lumières,

JP




Avatar
j-pascal
Bonsoir,

Je note tes conseils (et en particulier le "risque" d'avoir recours à
une variable "xn".

Néanmoins, la présente gestion d'erreur ne m'éclaire pas vraiment sur
l'optimisation de mon code "usine à gaz". J'aurais peut-être un peu
plus d'inspiration un autre jour.

JP

Bonjour J-Pascal,

Pour définir le nom d'une variable, tu as droit à 255 caractères.

Tu dois éviter d'utiliser un mot réservé par le code VBA et
une adresse de cellule comme X1 et X2 comme nom pour
tes variables. Cela évite de confondre Excel.

Deuxièmement, un exemple d'une gestion d'erreur
'-----------------------------
Sub test ()
Dim Gestion_Erreur as string

On error goto gestion_erreur

Ton code

Exit sub

Gestion_Erreur:
Err.clear
'Message n'est pas obligatoire
Msgbox Err.Number & " ' " & err.Description
On error resume next
end Sub
'-----------------------------




"j-pascal" a écrit dans le message de groupe de
discussion : Bonjour Isabelle,

Ceci semble fonctionner, mais c'est une usine à gaz, ce qui me désole.
Ma solution (sous réserve qu'elle ne dissimule pas d'erreurs que je
n'aurais pas vues ...) est lamentable :

'-------
Sub PlageACopier()
Dim x1 As Integer
Dim x2
Dim x
Dim y 'As Integer
Dim n 'As Integer erreur ???
Dim AdrPlageImport
Dim t
Dim s

t = "N° cde"
s = "NBC"

y =
Range("Col_Import").Item(Range("Col_Import").Count).End(xlUp).Row

Stop
On Error GoTo r1
x1 = Range("Col_Import").Find(t, Range("Col_Import").Item(1),
xlFormulas, xlWhole, xlByRows, xlNext, False, False).Row + 1
GoTo r2
r1:
x1 = 0

r2:
On Error GoTo r3
x2 = Range("Col_Import").Find(s, Range("Col_Import").Item(1),
xlFormulas, xlWhole, xlByRows, xlNext, False, False).Row + 1
GoTo r4
r3:
x2 = 0

r4:

If x1 > 0 Then
x = Range("Import").Find(t, Range("Import").Item(1),
xlFormulas, xlWhole, xlByRows, xlNext, False, False).Row + 1
Else
x = Range("Import").Find(s, Range("Import").Item(1),
xlFormulas, xlWhole, xlByRows, xlNext, False, False).Row + 1
End If

AdrPlageImport = Range(Cells(x, 1), Cells(y, 7)).Address '[g4]
= Range(Cells(x, 1), Cells(y, 7)).Address
Range(AdrPlageImport).Copy

End sub

'-------

bonjour Jp,

si t n'est pas trouvé cela provoque un erreur, as tu mis une gestion
d'erreur dans ton code ?

isabelle

j-pascal a écrit :
Bonjour,

Dans le code qui suit, je ne comprends pas pourquoi, je ne peux pas
récupérer les 2 valeurs liées à "x1" et "x2".

Si, j'effectue la procédure en mode pas à pas, si "t" (N° Cde) n'existe pas
dans ma plage "Col_Import", "x2" ne se calcule pas et la procédure se
termine.

Je pensais qu'indépendemment du résultat de x1, je pouvais voir le résultat
pour x2 en survolant la variable avec la souris !

'------------------
t = "N° cde"
s = "NBC"

y = Range("Col_Import").Item(Range("Col_Import").Count).End(xlUp).Row

x1 = Range("Import").Find(t, Range("Import").Item(1), xlFormulas,
xlWhole, xlByRows, xlNext, False, False).Row + 1
x2 = Range("Import").Find(s, Range("Import").Item(1), xlFormulas,
xlWhole, xlByRows, xlNext, False, False).Row + 1
'------------------

Je crains que cette question soit stupide, mais je n'arrive pas à voir ce
qui cloche !

Merci pour vos lumières,

JP






Avatar
j-pascal
Bonsoir Hervé,

Merci bcp pour toutes ces explications très pédagogiques.

Pour que ça fonctionne plus spécifiquement à mes besoins,
j'ai remplacé : 'y = .Cells(1, 1).Row + .Rows.Count - 1
Par : y = Plage.Item(Plage.Count).End(xlUp).Row

J'ai noté, la RAZ des variables et leur "typage" (?). Habituellement
j'essaye d'y veiller mais ce n'est pas toujours évident de trouver le
bon type ! Ici, j'ai posté un peu vite ;-)

Un jour, j'ai typé avec "String" ce qui suit, et je me suis retrouvé
avec un bug difficile à identifier (pour un néophyte) :

'----
Dim NomFichierImport As Variant 'String = non !!!

(NomFichierImport = Application.GetOpenFilename(typeFichier, , Titre))
'----

Pour moi, le nom du fichier récupéré était une chaine de caractères.

Mystère !

Encore merci ++

JP

Bonjour,
Je n'ai pas tout compris dans ton code car il y a des variables qui sont
initialisées et pas utilisées ? Prend l'habitude de typer tes variables,
moins de mémoire utilisée et code plus rapide.
Teste si cela te convient et adapte :

Sub PlageACopier()

Dim Plage As Range
Dim PlageImport As Range
Dim Cel_1 As Range
Dim x As Integer 'Long si au delà de 32767
Dim y As Integer
Dim t As String
Dim s As String

t = "N° cde"
s = "NBC"

'défini la plage
Set Plage = [Col_Import]

'récupère le N° de la dernière ligne
'de la plage
With Plage
y = .Cells(1, 1).Row + .Rows.Count - 1
End With

'recherche la valeur de "t" dans la plage
Set Cel_1 = Plage.Find(t, , xlFormulas, xlWhole)

'si trouvé
If Not Cel_1 Is Nothing Then
x = Cel_1.Row + 1
Else
'sinon, recherche la valeur de "s" dans la plage
Set Cel_1 = Plage.Find(s, , xlFormulas, xlWhole)
'si trouvé
If Not Cel_1 Is Nothing Then
x = Cel_1.Row + 1
'sinon, message et sortie de procédure
Else
MsgBox "Valeur pas trouvée :o(("
Exit Sub
End If
End If

'défini la plage à copier
Set PlageImport = Range(Cells(x, 1), Cells(y, 7))

'et copie dans la feuille 2 à partir de A1
'à adapter
PlageImport.Copy Worksheets("Feuil2").[A1]

Set Plage = Nothing
Set Cel_1 = Nothing
Set PlageImport = Nothing

Hervé.


End Sub
"j-pascal" a écrit dans le message de
news:
Bonjour,

Dans le code qui suit, je ne comprends pas pourquoi, je ne peux pas
récupérer les 2 valeurs liées à "x1" et "x2".

Si, j'effectue la procédure en mode pas à pas, si "t" (N° Cde) n'existe pas
dans ma plage "Col_Import", "x2" ne se calcule pas et la procédure se
termine.

Je pensais qu'indépendemment du résultat de x1, je pouvais voir le résultat
pour x2 en survolant la variable avec la souris !

'------------------
t = "N° cde"
s = "NBC"

y = Range("Col_Import").Item(Range("Col_Import").Count).End(xlUp).Row

x1 = Range("Import").Find(t, Range("Import").Item(1), xlFormulas,
xlWhole, xlByRows, xlNext, False, False).Row + 1
x2 = Range("Import").Find(s, Range("Import").Item(1), xlFormulas,
xlWhole, xlByRows, xlNext, False, False).Row + 1
'------------------

Je crains que cette question soit stupide, mais je n'arrive pas à voir ce
qui cloche !

Merci pour vos lumières,

JP