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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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+ ==
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
"Gilgamesh" <hsemaglig@uruk.com> a écrit dans le message de
news:%23n5h87klEHA.2020@TK2MSFTNGP09.phx.gbl...
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.
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
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+ ==
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+ ==
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.
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+ ==
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+ ==
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" <hsemaglig@uruk.com> a écrit dans le message de
news:OMoLKsllEHA.2884@TK2MSFTNGP09.phx.gbl...
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.
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+ ==
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
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
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
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
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" <jp.pradier.JVeuxPasDeSpam@wanadoo.fr> a écrit dans le message
de news:um5yj$llEHA.556@tk2msftngp13.phx.gbl...
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 :
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
JpPradier
Vivi, j'ai corrigé après mais pas assez rapidement ;-))
j-p
Vivi, j'ai corrigé après mais pas assez rapidement ;-))
Vivi, j'ai corrigé après mais pas assez rapidement ;-))
j-p
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
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" <jp.pradier.JVeuxPasDeSpam@wanadoo.fr> a écrit dans le message de
news:u1iRdDmlEHA.3968@TK2MSFTNGP11.phx.gbl...
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
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
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+ ==
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" <hsemaglig@uruk.com> a écrit dans le message de
news:%23n5h87klEHA.2020@TK2MSFTNGP09.phx.gbl...
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.
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.