OVH Cloud OVH Cloud

Y'a-t-il un unconvénient dans cette déclaration ?

20 réponses
Avatar
Apitos
Bonsoir =E0 tous,

J'ai d=E9clar=E9 un tableau :

---
Public Tableau()
---
et =E0 l'aide du code VBA je le remplie de valeurs :

----
L =3D 1
For Each Cel In sht2.Range("B2",
sht2.Range("B65536").End(xlUp))
On Error Resume Next
If UCase(Motrech) Like UCase(Cel) Then
Lst1 =3D Cel.Offset(, -1).Value
Lst2 =3D Cel.Offset(, 1).Value
Tableau(L, 1) =3D Lst1: Tableau(L, 2) =3D Lst2
L =3D L + 1
End If
Next Cel

----

Est-ce une mani=E8re de proceder =E0 =E9viter de n'avoir pas utiliser Dim o=
u
Redim Preserve pour la d=E9claration ou le redimentionnement dynamique
du tableau ?

Merci.

10 réponses

1 2
Avatar
Apitos
Bonjour MichDenis,

Le code à pour tâche de réaliser ce qui suit :

Dans la feuille1, je saisi quotidiennement mes achats sous la forme xx-
yyy-n, d'ou le xx représente le code catégorie, yyy la désignation du
produit et n les différents prix unitaire pour un même produit.

La feuille2 est un récapitulatif de la feuille1.

Alors si je voudrais saisir un produit dans feuille1 avec son prix
unitaire pour une nouvelle journée, je devrais savoir tout les prix
unitaire de ce produit récapitulés dans feuille2.

Ainsi la Userform (ListBox1) est appelé en tapant dans la colonne A de
feuille1, la forme xx-yyy-- (Avec deux tirets à la fin).

Alors une recherche est lancée et le résultat est stocké dans
"Tableau".

Ensuite la ListBox est rempli par "Tableau" avant d'être afficher sous
forme de deux colonnes : une représente le code du produit avec en
face dans la deuxième colonne son prix unitaire.

Il faut ajouter des valeurs à la fin du Tableau pour permettre une
sélection supplémentaire si le prix à saisir dans une journée est
introuvable dans la feuille2

Par exemple :

Si les valeurs trouvées sont stockées dans "Tableau" pour le mot
recherché "Pain" sont :

Bl-Pain-1 0,02
Bl-Pain-2 0,03
Bl-Pain-3 1,00
Sm-Pain-1 0,24

Alors avant d'alimenter la listBox une valeur supplémentaire doit être
ajoutée sans prix unitaire pour que la liste finale à afficher sera :

Bl-Pain-1 0,02
Bl-Pain-2 0,03
Bl-Pain-3 1,00
Sm-Pain-1 0,24
Bl-Pain-4
Sm-Pain-2

Je suppose que j'ai explique la tâche voulue !

Merci.
Avatar
michdenis
La procédure est dans le module de la feuil1
Fais un double-clique dans une des cellules de la feuil1
èt observe....

http://cjoint.com/?icpr48kNgP

Évidemment, il te faudra probablement adapter ceci
à ta façon de travailler !


"Apitos" a écrit dans le message de news:

Bonjour MichDenis,

Le code à pour tâche de réaliser ce qui suit :

Dans la feuille1, je saisi quotidiennement mes achats sous la forme xx-
yyy-n, d'ou le xx représente le code catégorie, yyy la désignation du
produit et n les différents prix unitaire pour un même produit.

La feuille2 est un récapitulatif de la feuille1.

Alors si je voudrais saisir un produit dans feuille1 avec son prix
unitaire pour une nouvelle journée, je devrais savoir tout les prix
unitaire de ce produit récapitulés dans feuille2.

Ainsi la Userform (ListBox1) est appelé en tapant dans la colonne A de
feuille1, la forme xx-yyy-- (Avec deux tirets à la fin).

Alors une recherche est lancée et le résultat est stocké dans
"Tableau".

Ensuite la ListBox est rempli par "Tableau" avant d'être afficher sous
forme de deux colonnes : une représente le code du produit avec en
face dans la deuxième colonne son prix unitaire.

Il faut ajouter des valeurs à la fin du Tableau pour permettre une
sélection supplémentaire si le prix à saisir dans une journée est
introuvable dans la feuille2

Par exemple :

Si les valeurs trouvées sont stockées dans "Tableau" pour le mot
recherché "Pain" sont :

Bl-Pain-1 0,02
Bl-Pain-2 0,03
Bl-Pain-3 1,00
Sm-Pain-1 0,24

Alors avant d'alimenter la listBox une valeur supplémentaire doit être
ajoutée sans prix unitaire pour que la liste finale à afficher sera :

Bl-Pain-1 0,02
Bl-Pain-2 0,03
Bl-Pain-3 1,00
Sm-Pain-1 0,24
Bl-Pain-4
Sm-Pain-2

Je suppose que j'ai explique la tâche voulue !

Merci.
Avatar
Apitos
Bonjour Michdenis,

C'est presque ce que je voulais à l'exception de deux points :

1 - Motrech = Split(Target, "-")(1)

Pose un problème avec les mots composés de syntaxe : xx-yyy-yyy-n

2 - La listBox doit contenir une ou plus d'une ligne supplémentaire
(Choix) avec une deuxième colonne correspondante vide selon les
différents préfixes trouvés (xx-yyy-) de telle sorte qu'on voit ceci :

Bl-Pain-1 0,02
Bl-Pain-2 0,01
Sm-Pain-1 0,8
Bl-Pain-3
Sm-Pain-2

Merci d'avance.
Avatar
michdenis
Question 1

A ) Tu déclares la variable X as Variant en haut de ta procédure
B ) tu remplaces ceci Motrech = Split(Target, "-")(1) PAR :

Quand tu as ceci : xx-yyy-yyy-n , J'ai supposé que tu voulais
conserver yyy-yyy

X = Split(Target, "-")
If UBound(X) > 2 Then
Motrech = X(1) & "-" & X(2)
Else
Motrech = X(1)
End If

Question 2
Dans la procédure générale, tu as ceci qui permet
d'ajouter les items à ta liste du listbox. Lorsque tu
ajoutes des entrées dans ta feuille excel, tu peux
ajouter ces derniers quand tu veux à ta liste... c'est
à toi de déterminer quand tu veux les ajouter et comment
tu veux que ton application fonctionne .... la procédure
soumise n'était qu'un exemple !

'-----------------------------------------
With ListePrixU.ListBox1
.AddItem Trouve.Offset(, -1).Value
.List(A, 1) = Trouve.Offset(, 1).Value
End With
'-----------------------------------------


"Apitos" a écrit dans le message de news:

Bonjour Michdenis,

C'est presque ce que je voulais à l'exception de deux points :

1 - Motrech = Split(Target, "-")(1)

Pose un problème avec les mots composés de syntaxe : xx-yyy-yyy-n

2 - La listBox doit contenir une ou plus d'une ligne supplémentaire
(Choix) avec une deuxième colonne correspondante vide selon les
différents préfixes trouvés (xx-yyy-) de telle sorte qu'on voit ceci :

Bl-Pain-1 0,02
Bl-Pain-2 0,01
Sm-Pain-1 0,8
Bl-Pain-3
Sm-Pain-2

Merci d'avance.
Avatar
Apitos
Bonsoir,

Il est important de savoir qu'on doit préparer la liste des mots
correspondants et ajouter +1 a chaque sous liste trouvée avant de
l'afficher dans la ListBox.

Voila le code sur lequel je bloque :
'-----
Sub AjoutChoixTabList1()
MsgBox "portée tab = " & UBound(Tableau, 2)
For p = 1 To UBound(Tableau, 2) - 1
elem = Tableau(1, p)
indc = CInt(Right$(elem, 1))
chn = Left(elem, Len(elem) - 2)
For t = p + 1 To UBound(Tableau, 2) - 1
elem2 = Tableau(1, t)
If elem2 <> "" And InStr(chn, elem2) <> 0 Then
MsgBox "indc avant pour " & elem2 & " = " & indc
If CInt(Right$(elem2, 1)) > indc Then indc = CInt(Right
$(elem2, 1))
MsgBox "indc après pour " & elem2 & " = " & indc
End If
Next t
ReDim Preserve Tableau(2, UBound(Tableau, 2) + 1)
Tableau(1, UBound(Tableau, 2)) = chn & "-" & indc+1
'MsgBox "Tableau(1, " & UBound(Tableau, 2) + 1 & ") = " &
Tableau(1, UBound(Tableau, 2) + 1)
Next p
End Sub

'----

Pour avoir ce résultat :
'--- Résultat de la recherche du mot "stylo"
Lib-Stylo C-1 0,10
Lib-Stylo-1 0,01
Lib-Stylo-2 0,12
Lib-Stylo-3 0,22
Xup-Stylo-Gh-1 0,15
Xx1-Stylo-1 0,05

'----- Eléments ajoutés à la fin de la liste "Tableau" : le plus gran d
indice de chaque sous groupe + 1

Lib-Stylo C-2
Lib-Stylo-4
Xup-Stylo-Gh-2
Xx1-Stylo-2

Merci michdenis de donner toujours suite à mes questions.
Avatar
michdenis
A ) Habituellement, pour pouvoir utiliser un tableau à 2 dimensions
on doit pouvoir utiliser ceci comme code :
ReDim Preserve MonTableau ... pour le redimensionner au fur et à
mesure que l'on désire ajouter des entrées.
Cependant, cette ligne de code permet que de redimensionner
seulement la dernière dimension du tableau... et c'est là que le bât
blesse.

Outre la suggestion que je t'ai déjà faite sur ce fil quant à l'usage
d'un tableau,
tu peux contourner la problématique soulevé par d'abord faire une boucle
sur le nombre de lignes que tu auras de besoin pour ton tableau. Pour ce
faire
la méthode "Find ... FindNext" dont je t'ai donné aussi un exemple sur
ce fil est
sûrement la plus rapide.
Lorsque tu connais exactement la dimension de ton tableau tu fais la
déclaration
suivante :
'Haut de ta procédure
Dim Tableau()
dim NbLigne as Long
'Boucle pour déterminer le nombre d'éléments
NbLigne = Ce que tu as trouvé (boucle) et tu peux ajouter un nombre
quelconque
de lignes si tu prévois devoir faire des ajouts
'définir les dimensions de ton tableau (Tableau à base 0 ou 1, à toi de
choisir)
Redim Tableau(0 to NbLignes, 0 to 1)
Et maintenant, tu peux refaire ta boucle en renseignant ton tableau
à partir des données que tu as.

B ) Dans la procédure que je t'ai soumise dans le module feuille,
tu poses comme condition à l'exécution du code ceci :
If Target.Column = 1 And Target.Count = 1 Then

Cela signifie que le code s'exécute avant que la dernière entrée
soit terminée puisque les 2 autres cellules à droite ne sont pas
encore renseignées....Si tu changes ta condition, tu peux dire à
excel d'exécuter le code seulement si les 3 cellules d'une même
ligne sont renseignées.....

C ) Perso, je n'ai pas d'autres suggestions à faire sur ta problématique.
Je sais que tout ceci n'est pas facile et requiert du temps ...
C'est le plaisir qui te tient en haleine !!!

;-)



"Apitos" a écrit dans le message de news:

Bonsoir,

Il est important de savoir qu'on doit préparer la liste des mots
correspondants et ajouter +1 a chaque sous liste trouvée avant de
l'afficher dans la ListBox.

Voila le code sur lequel je bloque :
'-----
Sub AjoutChoixTabList1()
MsgBox "portée tab = " & UBound(Tableau, 2)
For p = 1 To UBound(Tableau, 2) - 1
elem = Tableau(1, p)
indc = CInt(Right$(elem, 1))
chn = Left(elem, Len(elem) - 2)
For t = p + 1 To UBound(Tableau, 2) - 1
elem2 = Tableau(1, t)
If elem2 <> "" And InStr(chn, elem2) <> 0 Then
MsgBox "indc avant pour " & elem2 & " = " & indc
If CInt(Right$(elem2, 1)) > indc Then indc = CInt(Right
$(elem2, 1))
MsgBox "indc après pour " & elem2 & " = " & indc
End If
Next t
ReDim Preserve Tableau(2, UBound(Tableau, 2) + 1)
Tableau(1, UBound(Tableau, 2)) = chn & "-" & indc+1
'MsgBox "Tableau(1, " & UBound(Tableau, 2) + 1 & ") = " &
Tableau(1, UBound(Tableau, 2) + 1)
Next p
End Sub

'----

Pour avoir ce résultat :
'--- Résultat de la recherche du mot "stylo"
Lib-Stylo C-1 0,10
Lib-Stylo-1 0,01
Lib-Stylo-2 0,12
Lib-Stylo-3 0,22
Xup-Stylo-Gh-1 0,15
Xx1-Stylo-1 0,05

'----- Eléments ajoutés à la fin de la liste "Tableau" : le plus grand
indice de chaque sous groupe + 1

Lib-Stylo C-2
Lib-Stylo-4
Xup-Stylo-Gh-2
Xx1-Stylo-2

Merci michdenis de donner toujours suite à mes questions.
Avatar
Apitos
Bonjour,

B ) Dans la procédure que je t'ai soumise dans le module feuille,
      tu poses comme condition à l'exécution du code ceci :
      If Target.Column = 1 And Target.Count = 1 Then

    Cela signifie que le code s'exécute avant que la dernière ent rée
     soit terminée puisque les 2 autres cellules à droite ne so nt pas
     encore renseignées....Si tu changes ta condition, tu peux di re à
     excel d'exécuter le code seulement si les 3 cellules d'une m ême
     ligne sont renseignées.....



Les deux dernieres cellules seront renseignées selon la valeur de la
premiere cellule.

C ) Perso, je n'ai pas d'autres suggestions à faire sur ta problémati que.
      Je sais que tout ceci n'est pas facile et requiert du temps . ..
      C'est le plaisir qui te tient en haleine !!!

;-)



Tout le plaisir et pour moi d'avoir tant d'interêt a mon post.

Grand merci à toi et nicholas.
Avatar
Apitos
Bonjour Michdenis et tout le forum,

Voila où j'en suis avec l'aide d'un forumeur.

Ca avance pas à pas !

Mais il y'a encore des erreurs comme : incomptabilité de type,
L'indice n'appartient pas à la sélection ...

http://cjoint.com/?iokt2SJWwE

Merci.
Avatar
michdenis
Dans ta procédure "AjoutChoixTabList1" du module1

à cette ligne de code : If X = 0 Then .... Exit for
Et bien, au premier test, il sort de la boucle

ce qui signifie que l'objet "Collec" est vide , aucun élément
a été ajouté dans ton objet collection.

Conséquemment, la ligne de code cela ne fait aucun
sens à la ligne de code suivante Collect.count = 0

ReDim Tabajout(2, 1 To collec.Count)

D'où ton message d'erreur



"Apitos" a écrit dans le message de news:



Bonjour Michdenis et tout le forum,

Voila où j'en suis avec l'aide d'un forumeur.

Ca avance pas à pas !

Mais il y'a encore des erreurs comme : incomptabilité de type,
L'indice n'appartient pas à la sélection ...

http://cjoint.com/?iokt2SJWwE

Merci.
Avatar
Apitos
Bonsoie michdenis,

Je n'ai pas pu contourner ce problème !!
1 2