Quelqu'un peut-il me dire pourquoi mon prog plante ?

Adoc5 Messages postés 53 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 1 octobre 2007 - 6 mai 2004 à 08:01
Adoc5 Messages postés 53 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 1 octobre 2007 - 6 mai 2004 à 11:31
Voila ce que j'ai écrit comme code:

' Déclaration de variables
Dim mySheet As Excel.Workbook
Dim iCpt As Integer
Dim iTab As Integer
Dim iTab2 As Integer
Dim monTab() As Long

Set mySheet = Sheet("Sheet1")
iCpt = 1
iTab = 0
iTab2 = 1

' Initialisation de la première ligne du tableau à deux dimensions
ReDim monTab(1, iTab)

' Lecture de la feuille Excel tant que la valeur de la cellule An n'est pas nulle
While mySheet.Range("A" & iCpt) <> ""

' On récupère les valeurs de la cellule A de la ligne iCtp et on les stockes dans monTab
monTab(0, iTab) = mySheet.Range("A" & iCpt)

' Idem pour la cellule B
monTab(1, iTab) = mySheet.Range("B" & iCpt)

' Calcule de la moyenne
monTab(1, iTab) = (monTab(1, iTab) + monTab(1, iTab2)) / 2
iCpt = iCpt + 1
iTab = iTab + 1
iTab2 = iTab2 + 1
ReDim Preserve monTab(1, iTab)
Wend
End Sub

Le programme plante à la ligne suivante (Set mySheet = Sheet("Sheet1")). Quelqu'un peut-iil me dire pourquoi ?
Merci d'avance
:)
:)

9 réponses

HFanny Messages postés 699 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 13 mai 2011 20
6 mai 2004 à 08:44
Bonjour,

C'est tout bête mais tu déclares mySheet en tant que Workbook, alors que c'est une Worksheet :) .

Fanny
0
Adoc5 Messages postés 53 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 1 octobre 2007 1
6 mai 2004 à 09:05
Rhaaaaaaaaaaaaaaaaaaaaaaa, quel con je fais mais quel ...
Retiens-moi je vais me jeter dans la Garonne.

Bon merci beaucoup.

Mon programme plante à ce niveau là.
While mySheet.Range("A" & iCpt) <> ""

Comment pourrais-je faire pour que le traitement dans la boucle se fasse tant que je fais la détection d'éléments dans les cellules Excel ?

Merci d'avance.
:)
0
Adoc5 Messages postés 53 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 1 octobre 2007 1
6 mai 2004 à 09:19
Voici comment j'ai contourné le problème:

' Déclaration de variables
Dim iCpt As Integer
Dim iTab As Integer
Dim iTab2 As Integer
Dim monTab() As Long

Workbooks("Lissage.xls").Worksheets("Sheet1").Activate
iCpt = 1
iTab = 0
iTab2 = 1

' Initialisation de la première ligne du tableau à deux dimensions
ReDim monTab(1, iTab)

' Lecture de la feuille Excel tant que la valeur de la cellule An n'est pas nulle
While ActiveSheet.Range("A" & iCpt) <> ""

' On récupère les valeurs de la cellule A de la ligne iCtp et on les stocke dans monTab
monTab(0, iTab) = ActiveSheet.Range("A" & iCpt)

' Idem pour la cellule B
monTab(1, iTab) = ActiveSheet.Range("B" & iCpt)

' Calcule de la moyenne
monTab(1, iTab) = (monTab(1, iTab) + monTab(1, iTab2)) / 2
iCpt = iCpt + 1
iTab = iTab + 1
iTab2 = iTab2 + 1
ReDim Preserve monTab(1, iTab)
Wend
End Sub

C'est à cette ligne (monTab(1, iTab) = (monTab(1, iTab) + monTab(1, iTab2)) / 2) que ça plante maintenant. J'ai esayé des trucs dans la fenêtre de débug mais je ne vois pas trop où j'ai fait une erreur...????

:)
0
HFanny Messages postés 699 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 13 mai 2011 20
6 mai 2004 à 09:24
NON !!!!!!!!! NE TE JETTE PAS !!!!!!!! TOUT N'EST PAS PERDU !!!!!!

Sans blague :-p pour ta boucle fais comme cela plutot,
tant que la cellule active n'est pas vide, traitements, tu descends d'une ligne :
(si tu restes toujour sur la même feuille, c'est plus pratique je pense)

mySheet.Activate
Range ("A1").Activate

While Not ActiveCell.Value = ""
TES TRAITEMENTS
ActiveCell.Offset(1,0).Activate
Wend


Sinon, si tu veux garder ta méthode, tu as tout simplement oublié le .Value après le Range ;) :

While mySheet.Range("A" & iCpt).Value <> ""

Fanny
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
HFanny Messages postés 699 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 13 mai 2011 20
6 mai 2004 à 09:45
NON !!!!!!!!! NE TE JETTE PAS !!!!!!!! TOUT N'EST PAS PERDU !!!!!!

Sans blague :-p pour ta boucle fais comme cela plutot,
tant que la cellule active n'est pas vide, traitements, tu descends d'une ligne :
(si tu restes toujour sur la même feuille, c'est plus pratique je pense)

mySheet.Activate
Range ("A1").Activate

While Not ActiveCell.Value = ""
TES TRAITEMENTS
ActiveCell.Offset(1,0).Activate
Wend


Sinon, si tu veux garder ta méthode, tu as tout simplement oublié le .Value après le Range ;) :

While mySheet.Range("A" & iCpt).Value <> ""

Fanny
0
HFanny Messages postés 699 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 13 mai 2011 20
6 mai 2004 à 09:45
Encore moi ...
C'est une fois de plus tout bête mais c'est logique que ça ne fonctionne pas ta ligne
(monTab(1, iTab) = (monTab(1, iTab) + monTab(1, iTab2)) / 2)

Car tu n'as pas rempli avant : monTab(1, iTab2)
Donc il ne peux pas comprendre :)

Fanny
0
Adoc5 Messages postés 53 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 1 octobre 2007 1
6 mai 2004 à 10:06
ok, merci. Mais c'était trop tard je me suis quand même jeté et en cette saison l'eau est froide. Mais alors que je m'avançait lentement vers mon triste destin, un main s'est tendue vers moi, comme si elle venait de nulle part... c'était toi et ta super soluce... Merci !!! Bon trève d'humour.

J'y suis presque mais mon prog ne fait ce que je veux (c'est con les machines parfois, ça comprend jamais rien... lol)

En fait j'ai dans Excel ceci :
1 5
2 6
3 12
4 2
5 69
6 87

Je veux mettre dans un tableau, en mémoire, tous les chiffres de la 2ième colonne. Puis faire la moyenne des ces chiffres 2 à 2.
Par exemple, (5+6)/2 et le résultat doir être placé dans ce même tableau, en mémoire, dans la case mémoire où il y avait le 5.
Ceci doit être répéter pour tous les chiffres de cette colonne.

Or dans ce que j'ai fait, je ne remplis que la 1ere case de mon tableau mis en mémoire.
Si tu as une idée ? (je continue à chercher de mon côté car une partie de mon programme peut me servir).
:)
0
HFanny Messages postés 699 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 13 mai 2011 20
6 mai 2004 à 10:50
J'ai eu une idée.
Mais bon, on est d'accord, si tu fais 2 à 2, ton tableau fera une taille de moins que le nombre de tes données :

Dans le code en dessous (que tu peux copier/coller directement), ton tableau se remplit, et j'affiche les résultats en colonne D (juste pour que tu puisses voir que ça fonctionne).

Par contre, il n'y a pas de gestion d'erreur (si ce n'est pas des nombres).

Sub moyenne()
Dim monTab() As Double
Dim iCpt, i As Integer

iCpt = 0

Range("B1").Activate
While Not ActiveCell.Offset(1, 0).Value = ""
    ReDim Preserve monTab(1, iCpt)
    monTab(0, iCpt) = ActiveCell.Offset(0, -1).Value
    monTab(1, iCpt) = (ActiveCell.Value + ActiveCell.Offset(1, 0).Value) / 2
    ActiveCell.Offset(0, 2).Value = (ActiveCell.Value + ActiveCell.Offset(1, 0).Value) / 2
    ActiveCell.Offset(1, 0).Activate
    iCpt = iCpt + 1
Wend

For i = 0 To iCpt - 1
MsgBox monTab(1, i)
Next i

End Sub


Par ailleurs, tu as mis ton tableau en Long, tu ne veux pas les décimales ? sinon mets le en Double.

Fanny
0
Adoc5 Messages postés 53 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 1 octobre 2007 1
6 mai 2004 à 11:31
ok super merci beaucoup. Pour les royalties, ça me coutera pas trop ? (lol)

@+

Cédric soit Adoc5
:)
0
Rejoignez-nous