OVH Cloud OVH Cloud

Type d'argument By Ref incompatible

9 réponses
Avatar
Gilgamesh
Bonjour,

je me trouve confronté à une erreur incompréhensible.

Dans une feuille "Tri" j'ai une cellule qui dès modif lance une
procédure de mise à jour d'un tableau situé dans une autre feuille
"Tableau de bord".
-----------------------------------------------------
Private Sub WorkSheet_Change(ByVal Target As Range)
If Target.Address = "$D$26" Then
Call MAJTdBTableau
End If
End Sub
-----------------------------------------------------


La procédure de MAJ fait elle même appelle à une boucle de dupplication
de ligne :
-----------------------------------------------------
Public Sub MAJTdBTableau()
Dim NombreLigne, PremiereLigne, DerniereLigne As Currency
Sheets("Tableau de bord").Select
' Calcul de la première ligne
PremiereLigne = Sheets("Tableau de bord").Range("NumLigne1TdBPdm").Value

' Calcul de la dernière ligne
DerniereLigne = Sheets("Tableau de bord").Range("NumLigneTdBPdm").Value

' Calcul du nombre de ligne à insérer
NombreLigne = Sheets("Tableau de bord").Range("NbModalite").Value

Call DuppliLigne("Tableau de bord", PremiereLigne, DerniereLigne,
NombreLigne)
(...)
-----------------------------------------------------


Et DuppliLigne est construit ainsi :

-----------------------------------------------------
Public Sub DuppliLigne(Feuille As String, NumLigne1, NumLigne, NbLigne
As Currency)

Worksheets(Feuille).Activate

' Supprime les lignes existantes
If NumLigne > NumLigne1 + 1 Then
ActiveSheet.Rows(NumLigne1 + 1 & ":" & NumLigne - 1).Select
Selection.Delete Shift:=xlUp
End If

' Insère le bon nombre de lignes vides
ActiveSheet.Rows(NumLigne1 + 1).Select
For i = 1 To NbLigne - 1
Selection.Insert Shift:=xlDown
Next i

' Recopie la première ligne dans les lignes vides
ActiveSheet.Rows(NumLigne1).Select
Selection.Copy
ActiveSheet.Rows(NumLigne1 + 1 & ":" & NumLigne1 + NbLigne - 1).Select
ActiveSheet.Paste
-----------------------------------------------------

Le pb : NombreLigne que j'ai désigné d'abord comme Long (avec la
conversion de précaution =CLng(..)) puis comme Currency ss plus de
succès, ne "passe" pas dans le DuppliLigne. Ca me provoque une erreur de
compil' Type d'argument ByRef incompatible.

comprend pas...

Si qqun a une idée je lui en serais très reconnaissant.


merci

a+
==

9 réponses

Avatar
papou
Bonjour
Bien que je ne vois pas trop ce qui peut bloquer (j'ai fait un petit test
sur le même principe), petite question subsidiaire :
Est-il indispensable de déclarer ta variable en tant que Currency ?
Parce que dans ta dernière procédure DuppliLigne tu n'utilises pas la
variable en tant que telle
ActiveSheet.Rows(NumLigne1 + 1 & ":" & NumLigne1 + NbLigne - 1).Select


Cordialement
Pascal

"Gilgamesh" a écrit dans le message de
news:%
Bonjour,

je me trouve confronté à une erreur incompréhensible.

Dans une feuille "Tri" j'ai une cellule qui dès modif lance une
procédure de mise à jour d'un tableau situé dans une autre feuille
"Tableau de bord".
-----------------------------------------------------
Private Sub WorkSheet_Change(ByVal Target As Range)
If Target.Address = "$D$26" Then
Call MAJTdBTableau
End If
End Sub
-----------------------------------------------------


La procédure de MAJ fait elle même appelle à une boucle de dupplication
de ligne :
-----------------------------------------------------
Public Sub MAJTdBTableau()
Dim NombreLigne, PremiereLigne, DerniereLigne As Currency
Sheets("Tableau de bord").Select
' Calcul de la première ligne
PremiereLigne = Sheets("Tableau de bord").Range("NumLigne1TdBPdm").Value

' Calcul de la dernière ligne
DerniereLigne = Sheets("Tableau de bord").Range("NumLigneTdBPdm").Value

' Calcul du nombre de ligne à insérer
NombreLigne = Sheets("Tableau de bord").Range("NbModalite").Value

Call DuppliLigne("Tableau de bord", PremiereLigne, DerniereLigne,
NombreLigne)
(...)
-----------------------------------------------------


Et DuppliLigne est construit ainsi :

-----------------------------------------------------
Public Sub DuppliLigne(Feuille As String, NumLigne1, NumLigne, NbLigne
As Currency)

Worksheets(Feuille).Activate

' Supprime les lignes existantes
If NumLigne > NumLigne1 + 1 Then
ActiveSheet.Rows(NumLigne1 + 1 & ":" & NumLigne - 1).Select
Selection.Delete Shift:=xlUp
End If

' Insère le bon nombre de lignes vides
ActiveSheet.Rows(NumLigne1 + 1).Select
For i = 1 To NbLigne - 1
Selection.Insert Shift:=xlDown
Next i

' Recopie la première ligne dans les lignes vides
ActiveSheet.Rows(NumLigne1).Select
Selection.Copy
ActiveSheet.Rows(NumLigne1 + 1 & ":" & NumLigne1 + NbLigne - 1).Select
ActiveSheet.Paste
-----------------------------------------------------

Le pb : NombreLigne que j'ai désigné d'abord comme Long (avec la
conversion de précaution =CLng(..)) puis comme Currency ss plus de
succès, ne "passe" pas dans le DuppliLigne. Ca me provoque une erreur de
compil' Type d'argument ByRef incompatible.

comprend pas...

Si qqun a une idée je lui en serais très reconnaissant.


merci

a+
==


Avatar
Gilgamesh

Bonjour
Bien que je ne vois pas trop ce qui peut bloquer (j'ai fait un petit test
sur le même principe), petite question subsidiaire :
Est-il indispensable de déclarer ta variable en tant que Currency ?
Parce que dans ta dernière procédure DuppliLigne tu n'utilises pas la
variable en tant que telle


-- J'ai d'abord essayé de la déclarer en Long integer, et ça ne marchait
pas mieux. Je viens d'esayer en Integer, tjs pas mieux.

J'ai changé l'ordre de déclaration dans DuppliLigne en mettant NbLigne
en premier: NbLigne, NumLigne1, NumLigne au lieu de NumLigne1, NumLigne,
NbLigne et bizarement ça a l'air de fonctionner mieux. Ca rame sévère
(alors que ce ne sont que des opérations élémentaires...) mais au moins
pas de code d'erreur.

a+
==

Avatar
papou
Oui, en complément je pourrais ajouter que j'ai parfois constaté quelques
soucis lorsque je déclarais plusieurs variables de même type sur UNE SEULE
ligne, dans ces cas de figure, j'avais solutionné sans trop chercher à
comprendre pourquoi (mais peut-être quelque chose en rapport avec la mémoire
??) en découpant mes lignes de déclarations et en ne déclarant que maximum 4
variables sur une seule ligne.
Cordialement
Pascal

"Gilgamesh" a écrit dans le message de
news:

Bonjour
Bien que je ne vois pas trop ce qui peut bloquer (j'ai fait un petit
test


sur le même principe), petite question subsidiaire :
Est-il indispensable de déclarer ta variable en tant que Currency ?
Parce que dans ta dernière procédure DuppliLigne tu n'utilises pas la
variable en tant que telle


-- J'ai d'abord essayé de la déclarer en Long integer, et ça ne marchait
pas mieux. Je viens d'esayer en Integer, tjs pas mieux.

J'ai changé l'ordre de déclaration dans DuppliLigne en mettant NbLigne
en premier: NbLigne, NumLigne1, NumLigne au lieu de NumLigne1, NumLigne,
NbLigne et bizarement ça a l'air de fonctionner mieux. Ca rame sévère
(alors que ce ne sont que des opérations élémentaires...) mais au moins
pas de code d'erreur.

a+
==



Avatar
JpPradier
Bonjour Pascal et Gilgamesh

Il me semble que quand tu déclares plusieurs variables de cette façon :
Dim a, b ,c as integer

Seul a est integer et les autres restent en variant. il faut préciser à chaque fois :
Dim a as integer, b as integer, c as integer

j-p
Avatar
JpPradier
Il me semble que quand tu déclares plusieurs variables de cette façon :
Dim a, b ,c as integer

Seul a est integer et les autres restent en variant. il faut préciser à chaque fois :
Dim a as integer, b as integer, c as integer


Lire : Seul 'c' est integer

j-p

Avatar
papou
Bonjour
Non c'est l'inverse !
C'est c qui est integer et les précédentes Variant
Pour le reste tout à fait d'accord ;-)
Mais en ce qui me concerne, j'essaie depuis longtemps de bien découper mes
déclarations.
Cordialement
Pascal

"JpPradier" a écrit dans le message
de news:um5yj$
Bonjour Pascal et Gilgamesh

Il me semble que quand tu déclares plusieurs variables de cette façon :
Dim a, b ,c as integer

Seul a est integer et les autres restent en variant. il faut préciser à
chaque fois :

Dim a as integer, b as integer, c as integer

j-p



Avatar
JpPradier
Vivi, j'ai corrigé après mais pas assez rapidement ;-))

j-p
Avatar
michdenis
Bonjour,

Et j'ajouterai que la remarque de JP Pradier s'applique aussi dans dans la ligne de déclaration de la procédure et de la
fonction. De plus, définir une variable de type "Currency" pour contenir le numéro d'une ligne est pour le moins étrange
... de type "Long" semble plus approprié.


Salutations!



"JpPradier" a écrit dans le message de
news:
Il me semble que quand tu déclares plusieurs variables de cette façon :
Dim a, b ,c as integer

Seul a est integer et les autres restent en variant. il faut préciser à chaque fois :
Dim a as integer, b as integer, c as integer


Lire : Seul 'c' est integer

j-p

Avatar
Michel Pierron
Bonjour Gilgamesh;
Comme le dit JP, la déclaration n'est pas distributive donc toutes les
variables sauf la dernière sont Variant et consomment de la mémoire
inutilement.
Comme je suppose que les variables indiquent des numéros de ligne:
Public Sub MAJTdBTableau()
'& = type Long
Dim NombreLigne&, PremiereLigne,& DerniereLigne&
' Calcul de la première ligne
PremiereLigne = Sheets("Tableau de bord").Range("NumLigne1TdBPdm").Value
' Calcul de la dernière ligne
DerniereLigne = Sheets("Tableau de bord").Range("NumLigneTdBPdm").Value
' Calcul du nombre de ligne à insérer
NombreLigne = Sheets("Tableau de bord").Range("NbModalite").Value
Call DuppliLigne("Tableau de bord", PremiereLigne, DerniereLigne,
NombreLigne)
(...)
-----------------------------------------------------

Les arguments que tu passes ainsi sont donc des valeurs et non des
références:
Public Sub DuppliLigne(Feuille As String, ByVal NumLigne1&, ByVal NumLigne&
_
, ByVal NbLigne&)

Si tu veux les passer par référence, cela doit être possible avec:
Public Sub DuppliLigne(Feuille$, PremiereLigne&, DerniereLigne&,
NombreLigne&)

MP



"Gilgamesh" a écrit dans le message de
news:%
Bonjour,

je me trouve confronté à une erreur incompréhensible.

Dans une feuille "Tri" j'ai une cellule qui dès modif lance une
procédure de mise à jour d'un tableau situé dans une autre feuille
"Tableau de bord".
-----------------------------------------------------
Private Sub WorkSheet_Change(ByVal Target As Range)
If Target.Address = "$D$26" Then
Call MAJTdBTableau
End If
End Sub
-----------------------------------------------------


La procédure de MAJ fait elle même appelle à une boucle de dupplication
de ligne :
-----------------------------------------------------
Public Sub MAJTdBTableau()
Dim NombreLigne, PremiereLigne, DerniereLigne As Currency
Sheets("Tableau de bord").Select
' Calcul de la première ligne
PremiereLigne = Sheets("Tableau de bord").Range("NumLigne1TdBPdm").Value

' Calcul de la dernière ligne
DerniereLigne = Sheets("Tableau de bord").Range("NumLigneTdBPdm").Value

' Calcul du nombre de ligne à insérer
NombreLigne = Sheets("Tableau de bord").Range("NbModalite").Value

Call DuppliLigne("Tableau de bord", PremiereLigne, DerniereLigne,
NombreLigne)
(...)
-----------------------------------------------------


Et DuppliLigne est construit ainsi :

-----------------------------------------------------
Public Sub DuppliLigne(Feuille As String, NumLigne1, NumLigne, NbLigne
As Currency)

Worksheets(Feuille).Activate

' Supprime les lignes existantes
If NumLigne > NumLigne1 + 1 Then
ActiveSheet.Rows(NumLigne1 + 1 & ":" & NumLigne - 1).Select
Selection.Delete Shift:=xlUp
End If

' Insère le bon nombre de lignes vides
ActiveSheet.Rows(NumLigne1 + 1).Select
For i = 1 To NbLigne - 1
Selection.Insert Shift:=xlDown
Next i

' Recopie la première ligne dans les lignes vides
ActiveSheet.Rows(NumLigne1).Select
Selection.Copy
ActiveSheet.Rows(NumLigne1 + 1 & ":" & NumLigne1 + NbLigne - 1).Select
ActiveSheet.Paste
-----------------------------------------------------

Le pb : NombreLigne que j'ai désigné d'abord comme Long (avec la
conversion de précaution =CLng(..)) puis comme Currency ss plus de
succès, ne "passe" pas dans le DuppliLigne. Ca me provoque une erreur de
compil' Type d'argument ByRef incompatible.

comprend pas...

Si qqun a une idée je lui en serais très reconnaissant.


merci

a+
==