Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Valeur de proprieté non valide

E

effeZERO

Guest
Bonjour le forum,
J'utilise une macro pour me faire une importation de lignes d'un fichier(Source) dans un autre(Interface utilisateur).
Si mon fichier dépasse 101 lignes la macro ne se termine pas correctement et m'affiche Erreur d'éxectution 380, Valeur de propriété non valide.
Le débogueur m'améne sur la ligne .Value = Index
Je ne saisi pas l'erreur, et ne sais comment la corriger.
Ci-dessous le code que j'utilise.

Private Sub CommandButton1_Click()
Dim Plage As Range, Cel As Range
Dim Index As Long, NbVal As Long
Set Plage = Range(ActiveCell, Cells(65536, ActiveCell.Column).End(xlUp))
NbVal = Plage.Cells.Count
Application.ScreenUpdating = False
Workbooks("Interface utilisateur").Activate
Worksheets("Données").Activate
Range("a1").Select
Workbooks.Open Filename:="C:\Source.xls"
Worksheets("Feuil1").Activate
Range("a2:al2").Select
While Not IsEmpty(ActiveCell)
With ProgressBar1
.Min = 0
If NbVal > 1 Then .Max = NbVal
For Each Cel In Plage
Index = Index + 1
.Value = Index
DoEvents
Next Cel
End With
Selection.Copy
Workbooks("Interface utilisateur").Activate
Worksheets("Données").Activate
ActiveCell.Offset(1, 0).Range("a1:al1").Select
ActiveSheet.Paste
Workbooks("Source").Activate
Worksheets("Feuil1").Activate
ActiveCell.Offset(1, 0).Range("a1:al1").Select
Wend
Application.CutCopyMode = False
Workbooks("Source").Close
Worksheets("Interface").Activate
Range("a1").Select
MsgBox ("Importation terminée.")
End Sub

Si quelqu'un à une idée à me soumettre je suis preneur.
Je vous remercie à l'avance et vous souhaite un bon appétit.
@+ Franck
 
J

jmps

Guest
Bonjour effeZERO,

Index est une propriété. Mot-clé réservé à VBA.
Si j'ai bien compris ton code, tu essayes de l'utiliser en tant que variable.
Ton problème vient sans doute de là.
Renomme ta variable Index en MonIndex ou Toto ou ce que tu veux et tout devrait s'arranger.

J'espère t'avoir aidé.

A+
 
E

effeZERO

Guest
Bonjour jmps, re-le forum,
Je te remrcie pour ton info, je viens d'essayer mais la punition reste la même. J'ai renommé Index par MonIndex partout où je l'ai trouvé mais Excel s'obstine à me bloquer.
Je suis parvenu à passer outre cette erreur "évitant" la ligne .Value = MonIndex, j'ai déclaré cette ligne de code en commentaire avec '
Là l'ereur ne se produit pas, et il va bien au delà de 101 lignes. Par contre ma barre de progression reste figée.
Ah cette damnée barre de progression !!!
En tous cas merci de t'être penché sur mon problème jmps.
Bonne après-midi !
@+ Franck
 
J

jmps

Guest
Bon, c'était bien tenté quand même.
Ceci-dit, mon conseil d'éviter d'utiliser des mots clés ou propriétés ou méthodes comme variables tient toujours. Ca peut éviter de longs moments de deboguage sur des problèmes bizarres.

Peux-tu poster un extrait de ton fichier ou m'indiquer un lien pour que je puisse le télécharger et me pencher sur ton "cas" ?

Bon courage effeZERO.
 
E

effeZERO

Guest
Re-jmps,
Je joint les deux fichiers en question, j'ai tenté de modfier des valeurs, etc... mais rien n'y fait.
Tu peux y jeter un oeuil si tu veux mais sinon je ne perdrais pas plus de temps dessus, je supprimerais la progressbar, ce sera plus simple; même si c'est dommage de ne pas aller au fond des choses.
Encore merci et bon courage.
@+ Franck
 

Pièces jointes

  • Interfaceutilisateur.zip
    35.9 KB · Affichages: 37
J

jmps

Guest
Re-effeZERO,

Bon, je crois que je tiens le coupable.
C'est MonIndex qui à un moment dépasse le .Max de ta progress bar, lui-même venant de NbVal fixé tout en début du sub.
Mais avant d'aller plus loin, je voudrais savoir si tu veux que ta barre avance cellule par cellule ou ligne par ligne ?
En effet je ne comprend pas bien car tu définis NbVal en nombre de cellules (Plage.Cells.Count) et ensuite tu copies les données ligne par ligne.

Peux-tu me préciser ce point ?

Et aussi ta version d'Excel car sur la mienne (XL97), l'instruction :
Workbooks("Nom du classeur").Activate plante la macro, je suis obligé de remplacer "Nom du classeur" par Numéro_Index_Classeur.

A+
 
J

jmps

Guest
Re-effeZERO,

Voila ma proposition.
Peut-être devras-tu faire quelques adaptations en fonction de tes besoins, mais la structure est là.

Je n'ai pas mis de commentaires, je pense que les noms de variables sont assez explicites.

Note deux choses quand même :

1) Tu devras peut-être remettre les noms des Workbooks à la place des numéros d'index (Dans les Workbooks(xxx).Activate et .Close) à cause de ta version Excel. Bien que je pense qu'ils ont du garder l'ancienne méthode aussi, mais c'est vrai que les noms sont plus parlants et permettent de mieux voir les erreurs possibles.

2) Pour le coller, j'ai ajouté +1 à la variable i (numéro de ligne) car j'ai vu que dans ta feuille cible, la ligne 1 est réservée (cellules sans quadrillage).
Mais tu peux toujours l'enlever si ça te convient mieux.

Voilà, j'espère que ça te convient.
N'hésite pas si tu as des questions.

Bonne soirée.
 

Pièces jointes

  • Interfaceutilisateur_jmps.zip
    42.3 KB · Affichages: 38
E

effeZERO

Guest
Re-jmps,
Impeccable, cela fonctionne du tonnerre !
En regardant ton code et en le comparant au mien je n'y trouve rien de comparable. Qu'est ce qui ne "colle" pas dans ma façon d'écrire mon code ?
Je me bat avec cette foutue barre de progression depuis quelque jours, j'avais d'ailleurs posté à ce sujet samedi ou dimanche, @+Thierry m'avait envoyé une démo, j'étais heureux comme un roi et quand j'ai voullu la reproduire par mes propres moyens voilà que ça ne marchait pas. J'avais glissé quelque part.
J'ai une question par contre : tu déclares Nblignes en donnée Double, pourquoi ? Long ne suffit pas ?
Encore merci jmps, et bonne après-midi !
@+ Franck
 
J

jmps

Guest
Re-effeZERO,

Commençons par la fin : Pour NbLignes, tu as raison, un Long suffirait amplement (2 147 483 647 lignes c'est déjà pas mal).
Pour me trouver une excuse (Bidon ?), disons que demain, si Billou nous sort une nouvelle version d'un Super-Excel 2030 XP Plus Bifluoré avec des vrais morceaux de code à l'intérieur, alors la macro elle marche plus à partir de la ligne 2 147 483 648 ! Oh déception d'effeZERO ! ;-)
Au passage, si Billou pouvait augmenter aussi le nombre de colonnes...
Bon faudrait aussi un PXXIII avec quelques Téra-octets de RAM, mais ça va venir un jour. Si si...
C'était mon excuse bidon pour dire qu'un Long te suffit et que j'ai pas optimisé mon code comme tout XLDien digne de ce nom le devrait.
Je suis encore loin du niveau de notre ami (Maître devrais-je dire) @+Thierry.

J'ai vu ton post après ma première réponse et j'ai étudié la démo de @+Thierry. J'ai d'ailleurs "piqué" un ou deux trucs dedans (Pas plus. Juré ! On dira que je me suis inspiré). @+Thierry... Si tu me lis...

Bref, je vais essayer de te donner quelques pistes sur "ta façon d'écrire ton code". N'y vois rien de moqueur, c'est juste constructif pour t'aider à progresser. Et ce sont juste mes impressions, je peux me tromper.
Moi aussi j'ai débuté sur Excel (V1 et des poussières sous Windows 3.0 en 1991 !). Avant je ne connaissait que Multiplan sous DOS (De Microsoft aussi si je ne m'abuse). Nostalgie quand tu nous tiens...

1°) Tu es un fonceur.
Il me semble que tu n'as pris le temps ni d'analyser la démo de @+Thierry (Appelons-le @+T pour faire plus court. Tu permets @+T ?) ni d'analyser ton problème et le résultat que tu voulais obtenir.
Tu as "picoré" des bouts de code sans regarder à quel moment ils étaient utilisés.

2°) Résultat du 1° : ton code n'est pas structuré.
Comme te le disait @+T dans sa réponse, il faut mettre à jour la progress bar pendant la boucle de copier/coller. Ce que tu as bien fait cette fois mais de façon un peu erratique (A mon sens).

3°) A force de chercher, tu génères du code inutile voire gênant pour la compréhension.
Exemple : Tu passes d'un classeur à l'autre pour faire tes copier/coller (Activate) alors que ce n'est pas forcément utile. Et là je dis merci à @+T car je ne connaissait pas non plus la syntaxe du .copy avec le paste direct derrière sans passer par du select, copy, paste.
Conclusion : quand tu as 12 lignes de code pour une opération, pose toi la question de savoir si tu ne peux pas y arriver par une ou deux lignes de code (N'est-ce pas @+T ?).
Autre exemple : Tu fais des select de range("a1:a11") mais je n'ai pas compris pour quoi faire... (Je suis peut-être un peu bouché...)

4°) Ne baisse jamais (JAMAIS !) les bras.
Si tu n'as pas la solution, XLD (Enfin les XLDien(ne)s) l'a (L'ont) sûrement.
Cherche dans l'aide de VBA, d'Excel (F1, F1, F1 !!! Je veux dire : tape un mot-clé, place le curseur dedans, et appuie sur F1 et suis les hyper-liens de l'aide).

En conclusion : Perdons un peu temps d'abord pour en gagner +++ après.

Je suis sûr que tu vas devenir un champion (Pas avec mes critiques mais avec ce super forum que j'adore depuis une quinzaine de jours).

Et selon la formule consacrée :
Bonsoir effeZERO, bonsoir le forum, à demain si vous le voulez bien.

Allez, je vous dévoile mon prénom : José.
 
E

effeZERO

Guest
Bonjour José, le forum,
Merci pour tout José, pour le coup de pompe au derriere mais aussi pour les encouragements; c'est vrai que je veux toujours aller trop vite, et que c'est une erreur, mais que veux-tu, on ne se refait pas...
En tous cas je prends bonne note de tes conseils, comme ceux d'@+Thierry d'ailleurs.
Pour la "taille" du code j'ai appris la semaine derniere à copier des lignesà la condition qu'elles soient pleines, avec la boucle While Not, je voulais le mettre en application non pas pour le fun mais juste pour voir si je pouvais la réiterer en cas réel sans me planter, ce qui explique que je colle mes lignes unes à unes, sans sélectionner une plage fixe. De ce coté là au moins il semble que j'ai réussi ))
Pour le forum j'y viens depuis quelques temps et c'est vrai que sa convivialité et sa solidarité invtent à y venir le plus souvent possible.
Encore merci José et le forum, et bonne fête nationale à tous !
@+ Franck
 

Discussions similaires

Réponses
12
Affichages
816
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…