Bonjour
Quand je click sur le btn de validation dans les userform de création référence / Creation matière/ création client, excel plante très souvent et me met en message:
"la méthode value de l'objet range a échoué"
J'ai lu que c'était apparemment un boucle qu'Excel n'arrivait pas à terminer mais je ne vois pas où!
Essayez de faire le même travail sans activation/sélection des feuilles et cellules.
Exemple :
VB:
Dim NumLig as long
With ThisWorkbook.Sheets("NomDeLaFeuilleQuiVaBien")
NumLig = .Cells( Rows.Count,1).End(xlup).row+1
'.... autre Travail sur la feuille
End With
Ou si vous voulez travailler sur plusieurs feuilles
Code:
Dim shSource as worksheet, shDest as worksheet
Dim DerLigne as Long
With ThisWorkbook ' on est sûr d'être sur le classeur qui contient la macro, au bon moment
Set shSource = .Sheets("NomFeuilleSource")
Set shDest = .Sheets("NomFeuilleDestination")
End with
'
' Récupération du prochain numéro de ligne ligne de la colonne 1 de Destination
NumLigne = shDest.Cells(rows.Count,1).End(xlup).Row+1
'
' Copie des valeurs de A10:F10 de la feuille source dans la feuille destination à la prochaine ligne disponible sous le tableau
shDest.Range("A" & NumLigne & ":F" & NumLigne ).Value = shSource.Range("A10:F10").Value
'
' ou
'shDest.Cells(1,NumLigne).resize(,5).Value = shSource.Cells(1,1).Resize(,5).Value
NumLigne = NumLigne +1 'Ligne suivante
Il y a plusieurs façons de référencer et travailler sur les objets excel. Vous trouverez votre style propre par la pratique.
Mais ce qui est le plus important est que vous et le moteur d'exécution vb sache à un instant T sur quelle cellule de quelle feuille de quel classeur il doit travailler.
A cet instant T, ActiveSheet renseigne uniquement sur la feuille active. Mais sans nous dire qu'elle est cette feuille ni ne parle de son classeur. Si vos appels à d'autres procedures ont modifié ActiveSheet, de retour à la procédure appelante, la feuille active n'est plus la même.
Pour être certain avec activeSheet et selection il faudrait (au minimum) :
Code:
If ActiveSheet.Parent.Name = "NomDuClasseurDeLaFeuilleAttendue.xlsx" then
' ActiveSheet appartient au bon classeur
If ActiveSheet.Name = "NomDeLaFeuilleAttendue" then
'ActiveSheet est la bonne feuille du bon classeur
If TypeOf Selection Is Range then
'La selection est bien un objet range et non pas un Shape ou Graphique ou image ou autre chose
' nous pouvons travailler sur l'objet range
Else
' M...e ! pas le bon objet
End if
Else
' M...e ! pas la bonne feuille
End if
Else
' M...e ! pas le bon classeur
End if
P.S. j'ai pu faire quelques coquilles dans les lignes ci-dessus les ayant saisies à la volée.
P.S. Lorsque vous joignez un fichier excel, arrangez-vous pour qu' aucune procédure ne se lance au démarrage. C'est pénible, d'autant que le bouton 'Exit' ferme le classeur et pas seulement le userform.
Cordialement
Job75 Bonjour et merci
la 1° pièce jointe que vous m'avez envoyée fonctionne sur le moment, si j'enregistre et que je réouvre ça rebeug
La 2°pièce jointe beugue elle dès que je click sur le bouton création référence avec ce message
Essayez de faire le même travail sans activation/sélection des feuilles et cellules.
Exemple :
VB:
Dim NumLig as long
With ThisWorkbook.Sheets("NomDeLaFeuilleQuiVaBien")
NumLig = .Cells( Rows.Count,1).End(xlup).row+1
'.... autre Travail sur la feuille
End With
Ou si vous voulez travailler sur plusieurs feuilles
Code:
Dim shSource as worksheet, shDest as worksheet
Dim DerLigne as Long
With ThisWorkbook ' on est sûr d'être sur le classeur qui contient la macro, au bon moment
Set shSource = .Sheets("NomFeuilleSource")
Set shDest = .Sheets("NomFeuilleDestination")
End with
'
' Récupération du prochain numéro de ligne ligne de la colonne 1 de Destination
NumLigne = shDest.Cells(rows.Count,1).End(xlup).Row+1
'
' Copie des valeurs de A10:F10 de la feuille source dans la feuille destination à la prochaine ligne disponible sous le tableau
shDest.Range("A" & NumLigne & ":F" & NumLigne ).Value = shSource.Range("A10:F10").Value
'
' ou
'shDest.Cells(1,NumLigne).resize(,5).Value = shSource.Cells(1,1).Resize(,5).Value
NumLigne = NumLigne +1 'Ligne suivante
Il y a plusieurs façons de référencer et travailler sur les objets excel. Vous trouverez votre style propre par la pratique.
Mais ce qui est le plus important est que vous et le moteur d'exécution vb sache à un instant T sur quelle cellule de quelle feuille de quel classeur il doit travailler.
A cet instant T, ActiveSheet renseigne uniquement sur la feuille active. Mais sans nous dire qu'elle est cette feuille ni ne parle de son classeur. Si vos appels à d'autres procedures ont modifié ActiveSheet, de retour à la procédure appelante, la feuille active n'est plus la même.
Pour être certain avec activeSheet et selection il faudrait (au minimum) :
Code:
If ActiveSheet.Parent.Name = "NomDuClasseurDeLaFeuilleAttendue.xlsx" then
' ActiveSheet appartient au bon classeur
If ActiveSheet.Name = "NomDeLaFeuilleAttendue" then
'ActiveSheet est la bonne feuille du bon classeur
If TypeOf Selection Is Range then
'La selection est bien un objet range et non pas un Shape ou Graphique ou image ou autre chose
' nous pouvons travailler sur l'objet range
Else
' M...e ! pas le bon objet
End if
Else
' M...e ! pas la bonne feuille
End if
Else
' M...e ! pas le bon classeur
End if
P.S. j'ai pu faire quelques coquilles dans les lignes ci-dessus les ayant saisies à la volée.
P.S. Lorsque vous joignez un fichier excel, arrangez-vous pour qu' aucune procédure ne se lance au démarrage. C'est pénible, d'autant que le bouton 'Exit' ferme le classeur et pas seulement le userform.
Cordialemen
Essayez de faire le même travail sans activation/sélection des feuilles et cellules.
Exemple :
VB:
Dim NumLig as long
With ThisWorkbook.Sheets("NomDeLaFeuilleQuiVaBien")
NumLig = .Cells( Rows.Count,1).End(xlup).row+1
'.... autre Travail sur la feuille
End With
Ou si vous voulez travailler sur plusieurs feuilles
Code:
Dim shSource as worksheet, shDest as worksheet
Dim DerLigne as Long
With ThisWorkbook ' on est sûr d'être sur le classeur qui contient la macro, au bon moment
Set shSource = .Sheets("NomFeuilleSource")
Set shDest = .Sheets("NomFeuilleDestination")
End with
'
' Récupération du prochain numéro de ligne ligne de la colonne 1 de Destination
NumLigne = shDest.Cells(rows.Count,1).End(xlup).Row+1
'
' Copie des valeurs de A10:F10 de la feuille source dans la feuille destination à la prochaine ligne disponible sous le tableau
shDest.Range("A" & NumLigne & ":F" & NumLigne ).Value = shSource.Range("A10:F10").Value
'
' ou
'shDest.Cells(1,NumLigne).resize(,5).Value = shSource.Cells(1,1).Resize(,5).Value
NumLigne = NumLigne +1 'Ligne suivante
Il y a plusieurs façons de référencer et travailler sur les objets excel. Vous trouverez votre style propre par la pratique.
Mais ce qui est le plus important est que vous et le moteur d'exécution vb sache à un instant T sur quelle cellule de quelle feuille de quel classeur il doit travailler.
A cet instant T, ActiveSheet renseigne uniquement sur la feuille active. Mais sans nous dire qu'elle est cette feuille ni ne parle de son classeur. Si vos appels à d'autres procedures ont modifié ActiveSheet, de retour à la procédure appelante, la feuille active n'est plus la même.
Pour être certain avec activeSheet et selection il faudrait (au minimum) :
Code:
If ActiveSheet.Parent.Name = "NomDuClasseurDeLaFeuilleAttendue.xlsx" then
' ActiveSheet appartient au bon classeur
If ActiveSheet.Name = "NomDeLaFeuilleAttendue" then
'ActiveSheet est la bonne feuille du bon classeur
If TypeOf Selection Is Range then
'La selection est bien un objet range et non pas un Shape ou Graphique ou image ou autre chose
' nous pouvons travailler sur l'objet range
Else
' M...e ! pas le bon objet
End if
Else
' M...e ! pas la bonne feuille
End if
Else
' M...e ! pas le bon classeur
End if
P.S. j'ai pu faire quelques coquilles dans les lignes ci-dessus les ayant saisies à la volée.
P.S. Lorsque vous joignez un fichier excel, arrangez-vous pour qu' aucune procédure ne se lance au démarrage. C'est pénible, d'autant que le bouton 'Exit' ferme le classeur et pas seulement le userform.
Cordialement
Ce ne sont pas des codes prêts à l'emploi, c'est une manière de travailler avec les objets excel que vous devez étudier et intégrer vous même si vous voulez progresser.