XL 2013 la méthode value de l'objet range a échoué!!

youguybass

XLDnaute Nouveau
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ù!

Donc Help
 

Pièces jointes

  • Fichiers Maintenance Nouvelle génération.xlsm
    62.6 KB · Affichages: 16

Hasco

XLDnaute Barbatruc
Bonjour,

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
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour youguybass,

En Feuil1 le tableau structuré TabRefLacour était quelque peu corrompu.

Dans le fichier joint j'ai simplement mis sa colonne A au format Standard au lieu du format Texte.

Tout va bien maintenant.

A+
 

Pièces jointes

  • Fichiers Maintenance Nouvelle génération (1).xlsm
    51.2 KB · Affichages: 4

youguybass

XLDnaute Nouveau
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
1634124879248.png
 

youguybass

XLDnaute Nouveau
Bonjour,

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

Bonjour,

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
Je débute en VBA, a quel endroit dois-je mettre ce/ces codes.
Pouvez vous me les intégrer directement au fichier.
 

Discussions similaires

Haut Bas