Vba array vers range dans boucle
Résolu/Fermé
Didoch54000
Messages postés
308
Date d'inscription
vendredi 16 février 2007
Statut
Membre
Dernière intervention
27 décembre 2012
-
29 oct. 2012 à 22:05
Didoch54000 Messages postés 308 Date d'inscription vendredi 16 février 2007 Statut Membre Dernière intervention 27 décembre 2012 - 2 nov. 2012 à 19:56
Didoch54000 Messages postés 308 Date d'inscription vendredi 16 février 2007 Statut Membre Dernière intervention 27 décembre 2012 - 2 nov. 2012 à 19:56
A voir également:
- Vba array vers range dans boucle
- Windows 7 vers windows 10 - Guide
- Il est en cours de transport vers votre site de livraison - Forum Consommation & Internet
- Transferer photo android vers pc - Guide
- Qwerty vers azerty - Guide
- Find vba - Astuces et Solutions
8 réponses
Heliotte
Messages postés
1491
Date d'inscription
vendredi 26 octobre 2012
Statut
Membre
Dernière intervention
28 janvier 2013
92
29 oct. 2012 à 23:16
29 oct. 2012 à 23:16
Bonsoir Didoch54000,
Je pense qu'en fait fait il te retourne toujours la valeur de la dernière cellule de la colonne "B".
C'est dû à la fonction "Function retournLibelle".
En fait, dans cette fonction, d'abord tu boucles sur toutes les lignes de la colonne "B", mais en plus, tu ne lui demande que de te renvoyer la dernière valeur trouvée.
Ce que je n'arrive pas à comprendre, c'est que la taille du tableau est variable, mais que tu dispose les éléments de ce tableau dans un rectangle de taille fixe => (126/4) sur (48/6) .. As-tu une raison particulière pour faire de la sorte ?
Je pense qu'en fait fait il te retourne toujours la valeur de la dernière cellule de la colonne "B".
C'est dû à la fonction "Function retournLibelle".
En fait, dans cette fonction, d'abord tu boucles sur toutes les lignes de la colonne "B", mais en plus, tu ne lui demande que de te renvoyer la dernière valeur trouvée.
Ce que je n'arrive pas à comprendre, c'est que la taille du tableau est variable, mais que tu dispose les éléments de ce tableau dans un rectangle de taille fixe => (126/4) sur (48/6) .. As-tu une raison particulière pour faire de la sorte ?
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 303
30 oct. 2012 à 09:01
30 oct. 2012 à 09:01
Bonjour,
a chaque pas de la boucle, tu appelles l'ensemble de la variable tableau "TbloLibel"
donc la plage sélectionnée aura toujours la 1° ou dernière valeur de TbloLibel (pour inverser je serais plutôt aller de Ubound à Lbound)
il faudrait peut-^tre que TbloLibel exporte un nbre de données égale à la surface de ta plage. fais attention au décalage car TbloLibel est en base zéro
mais je vois mal ce que tu veux faire ( tu parles de tri, mais...)
pour joindre une pièce
mettre le classeur sans données confidentielles en pièce jointe sur
https://www.cjoint.com/
puis copier l'adresse du lien et la coller dans le message de réponse
mais explique tout clairement surtout ta page "étiquette"
dans l'attente
a chaque pas de la boucle, tu appelles l'ensemble de la variable tableau "TbloLibel"
donc la plage sélectionnée aura toujours la 1° ou dernière valeur de TbloLibel (pour inverser je serais plutôt aller de Ubound à Lbound)
il faudrait peut-^tre que TbloLibel exporte un nbre de données égale à la surface de ta plage. fais attention au décalage car TbloLibel est en base zéro
mais je vois mal ce que tu veux faire ( tu parles de tri, mais...)
pour joindre une pièce
mettre le classeur sans données confidentielles en pièce jointe sur
https://www.cjoint.com/
puis copier l'adresse du lien et la coller dans le message de réponse
mais explique tout clairement surtout ta page "étiquette"
dans l'attente
Didoch54000
Messages postés
308
Date d'inscription
vendredi 16 février 2007
Statut
Membre
Dernière intervention
27 décembre 2012
26
Modifié par Didoch54000 le 30/10/2012 à 22:01
Modifié par Didoch54000 le 30/10/2012 à 22:01
Bonsoir à tous,
D'ores et déjà un grand remerciement à vous tous j'ai uploadé le fichier a cet emplacement : https://www.cjoint.com/?0JEwaGM7cbP
J'ai plus ou moins trouvé mon probleme de boucle :
Pour reprendre le fonctionement du fichier :
Il faut implémenter le code dans la premiere celule de dotation (la seconde est issue d'une recherchev dans l'onglet database) ensuite une quantité et la dernière colone est issue de la valeur de Dot/pv /2 .
Ensuite il faut cliquer sur le bouton generer et la suite est expliquée dans mes precedents posts.
@michel_m : je n'ai pas encore fait la fonction de tri juste trouvé quelques exemples sur www.
En fait l'idée est de trier le trableau en fonction des différentes Liste (onglet dotation issus d'une rechercheV) .Peut être faire un filtre ou autre .... je n'ai pas encore reflechit à cette fonction.
Et l'onglet etiquette est l'onglet final j'ai mis un exemple de ce que souhaite avoir.
Vous remerciant,
D'ores et déjà un grand remerciement à vous tous j'ai uploadé le fichier a cet emplacement : https://www.cjoint.com/?0JEwaGM7cbP
J'ai plus ou moins trouvé mon probleme de boucle :
Sub Bouton5_Clic() Dim DernLigne As Long DernLigne = Range("A" & Rows.Count).End(xlUp).Row 'traitementListes RangeArray DernLigne End Sub Sub RangeArray(DrLgn As Long) 'Declaration du tableau taille dynamique et redimension du tableau Dim TbloLibel() As Variant With Sheets("Dotation").Range("A2:E" & DrLgn) ReDim TbloLibel(.Rows.Count, .Columns.Count) 'Affecte les valeurs au tableau TbloLibel = .Value 'MsgBox UBound(TbloLibel) End With Dim x As Integer, y As Integer, i As Integer, ia As Integer Dim Onglet As Worksheet Dim PlageTravail As Range Set Onglet = Worksheets("etiquette pt") Onglet.Select 'Remplir la case 'libellé' ia = 1 For x = 2 To 126 Step 4 For y = 2 To 48 Step 6 Set PlageTravail = Range("C" & x & ":C" & y) 'Alimente les éléments du tableau Onglet.Cells(x, y) = retournLibelle(ia, TbloLibel) ia = ia + 1 If ia > UBound(TbloLibel) Then Exit Sub End If Next y Next x End Sub 'Fonction qui retourne le libelle du tableau Function retournLibelle(indice As Integer, ByRef varTab() As Variant) As Variant retournLibelle = varTab(indice, 2) End Function
Pour reprendre le fonctionement du fichier :
Il faut implémenter le code dans la premiere celule de dotation (la seconde est issue d'une recherchev dans l'onglet database) ensuite une quantité et la dernière colone est issue de la valeur de Dot/pv /2 .
Ensuite il faut cliquer sur le bouton generer et la suite est expliquée dans mes precedents posts.
@michel_m : je n'ai pas encore fait la fonction de tri juste trouvé quelques exemples sur www.
En fait l'idée est de trier le trableau en fonction des différentes Liste (onglet dotation issus d'une rechercheV) .Peut être faire un filtre ou autre .... je n'ai pas encore reflechit à cette fonction.
Et l'onglet etiquette est l'onglet final j'ai mis un exemple de ce que souhaite avoir.
Vous remerciant,
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 303
Modifié par michel_m le 31/10/2012 à 09:45
Modifié par michel_m le 31/10/2012 à 09:45
Bonjour,
J'ai l'impression que tu t'es bien casser la t^te....
dans l'onglet dotation j'ai remplacer les cases à cocher (controles formulaire) par des checkboxs (controle activex) plus adaptés au VBA
Quant à ton Tri, je ne connais ni ton critère de tri , ni ce que tu veux faire donc...
dis toi bien que nous n'avons que tes écrits pour essayer de te proposer qqchose et que l'on ne connait tout ce que tu veux faire
ainsi dans les étiquettes, tu parles de code EAN et de code ? quès aco ? d'où viennent ces infos?
en VBA, il est nécessaire d'avoir une description complète car tout information supplémentaire peut obliger à revoir tous les codes... :o)
Michel
J'ai l'impression que tu t'es bien casser la t^te....
dans l'onglet dotation j'ai remplacer les cases à cocher (controles formulaire) par des checkboxs (controle activex) plus adaptés au VBA
Option Explicit Dim TbloLibel() As Variant Sub Bouton5_Clic() Dim Petite As Boolean, Grande As Boolean 'initialisations Application.ScreenUpdating = False 'fige le défilement de l'écran With Sheets("Dotation") TbloLibel = .Range("A2:E" & Range("A" & Rows.Count).End(xlUp).Row).Value Petite = .CheckBox1 Grande = .CheckBox2 End With 'rédaction des étiquettes If Petite = True Then etiqueter Sheets("etiquette pt") If Grande = True Then etiqueter Sheets("etiquette grd") MsgBox "Etiquetage terminé" End Sub Sub etiqueter(onglet) Dim indice As Integer, Ligne As Byte, Col As Byte With onglet .Cells.ClearContents ' Remplir la case 'libellé' indice = 1 For Ligne = 2 To 126 Step 4 For Col = 2 To 48 Step 6 .Cells(Ligne, Col) = TbloLibel(indice, 2) indice = indice + 1 If indice > UBound(TbloLibel) Then Exit Sub Next Col Next Ligne End With End Sub
Quant à ton Tri, je ne connais ni ton critère de tri , ni ce que tu veux faire donc...
dis toi bien que nous n'avons que tes écrits pour essayer de te proposer qqchose et que l'on ne connait tout ce que tu veux faire
ainsi dans les étiquettes, tu parles de code EAN et de code ? quès aco ? d'où viennent ces infos?
en VBA, il est nécessaire d'avoir une description complète car tout information supplémentaire peut obliger à revoir tous les codes... :o)
Michel
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 303
31 oct. 2012 à 09:44
31 oct. 2012 à 09:44
Heliotte
Messages postés
1491
Date d'inscription
vendredi 26 octobre 2012
Statut
Membre
Dernière intervention
28 janvier 2013
92
Modifié par Heliotte le 31/10/2012 à 10:39
Modifié par Heliotte le 31/10/2012 à 10:39
Il n'y a pas qu'en VBA
Pour ainsi dire toute construction de programme demande une étude bien établie pour l'élaboration d'une bonne base
Pour ainsi dire toute construction de programme demande une étude bien établie pour l'élaboration d'une bonne base
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 303
31 oct. 2012 à 11:36
31 oct. 2012 à 11:36
Commentaire verbeux et inutile
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Didoch54000
Messages postés
308
Date d'inscription
vendredi 16 février 2007
Statut
Membre
Dernière intervention
27 décembre 2012
26
31 oct. 2012 à 19:46
31 oct. 2012 à 19:46
Bonsoir Michel ,
Merci pour ce retour de code.
En effet je me suis bien cassé la tête au vu de ton code (mais je fait avec mes connaissances et mon code fonctionne au final, bon je te l'accorde peut être sur 3 pattes)
Maintenant je vais continuer à travailler en suivant ta source.
En ce qui concerne les informations rien n'est inventé tout est issus de l'onglet 'dotation' et recupère ces sources dans l'onglet database les données sont juste 'organisées' en vue de leur impression :
Le code ean (police ean code 3 9) est issu du code de référence (donnée colonneA dans le premier onglet) .
Pour le tri en fait il faut que je réorganise le 'array' en fonction des 3 listes (L1,L2,SL) car les couleurs des etiquettes different selon cette reference.
Pour info j'ai travaillé sur le code hier soir et voila ce que ca donne.
En tout cas merci pour vos propositions et vos conseils
Merci pour ce retour de code.
En effet je me suis bien cassé la tête au vu de ton code (mais je fait avec mes connaissances et mon code fonctionne au final, bon je te l'accorde peut être sur 3 pattes)
Maintenant je vais continuer à travailler en suivant ta source.
En ce qui concerne les informations rien n'est inventé tout est issus de l'onglet 'dotation' et recupère ces sources dans l'onglet database les données sont juste 'organisées' en vue de leur impression :
Le code ean (police ean code 3 9) est issu du code de référence (donnée colonneA dans le premier onglet) .
Pour le tri en fait il faut que je réorganise le 'array' en fonction des 3 listes (L1,L2,SL) car les couleurs des etiquettes different selon cette reference.
Pour info j'ai travaillé sur le code hier soir et voila ce que ca donne.
En tout cas merci pour vos propositions et vos conseils
Sub Bouton5_Clic() Dim DernLigne As Long DernLigne = Range("A" & Rows.Count).End(xlUp).Row RangeArray DernLigne End Sub Sub RangeArray(DrLgn As Long) 'Declaration du tableau taille dynamique et redimension du tableau Dim TbloLibel() As Variant With Sheets("Dotation").Range("A2:E" & DrLgn) ReDim TbloLibel(.Rows.Count, .Columns.Count) 'Affecte les valeurs au tableau TbloLibel = .Value 'MsgBox UBound(TbloLibel) End With Dim x As Integer, y As Integer, i As Integer, ia As Integer Dim Onglet As Worksheet Dim PlageTravail As Range Set Onglet = Worksheets("etiquette pt") Onglet.Select 'efface les données For x = 1 To 126 For y = 1 To 48 Onglet.Cells(x, y) = "" Next y Next x 'Remplir la case 'libellé' ia = 0 For x = 2 To 126 Step 4 For y = 2 To 48 Step 6 'Alimente les éléments du tableau ia = ia + 1 If ia > UBound(TbloLibel) Then Onglet.Cells(x, y) = "" Else Onglet.Cells(x, y) = retournLibelle(ia, TbloLibel) End If Next y Next x 'rapel : lign x , colonne y 'Remplir la case 'code' ia = 0 For x = 3 To 127 Step 4 For y = 4 To 48 Step 6 'Alimente les éléments du tableau ia = ia + 1 If ia > UBound(TbloLibel) Then Onglet.Cells(x, y) = "" Else Onglet.Cells(x, y) = retournCode(ia, TbloLibel) End If Onglet.Cells(x, y - 1) = "*" & Onglet.Cells(x, y).Value & "*" Next y Next x 'Remplir la case 'liste' ia = 0 For x = 3 To 127 Step 4 For y = 2 To 48 Step 6 'Alimente les éléments du tableau ia = ia + 1 If ia > UBound(TbloLibel) Then Onglet.Cells(x, y) = "" Else Onglet.Cells(x, y).Font.ColorIndex = 10 Onglet.Cells(x, y) = retournListe(ia, TbloLibel) End If Next y Next x End Sub 'Fonction qui retourne le libelle du tableau Function retournLibelle(indice As Integer, ByRef varTab() As Variant) As Variant retournLibelle = varTab(indice, 2) End Function Function retournCode(indice As Integer, ByRef varTab() As Variant) As Variant retournCode = varTab(indice, 1) End Function Function retournListe(indice As Integer, ByRef varTab() As Variant) As Variant retournListe = varTab(indice, 5) End Function
Heliotte
Messages postés
1491
Date d'inscription
vendredi 26 octobre 2012
Statut
Membre
Dernière intervention
28 janvier 2013
92
Modifié par Heliotte le 1/11/2012 à 06:51
Modifié par Heliotte le 1/11/2012 à 06:51
Bonsoir Didoch54000,
Tu fait appel à plusieurs fonctions pour remplir ta 2ème feuille. Comme il ne s'agit que d'un seul et unique tableau, tu peux tout regrouper dans le code, sans même faire appel à un fonction (ou procédure) en utilisant deux boucles imbriquées :
Tu fait appel à plusieurs fonctions pour remplir ta 2ème feuille. Comme il ne s'agit que d'un seul et unique tableau, tu peux tout regrouper dans le code, sans même faire appel à un fonction (ou procédure) en utilisant deux boucles imbriquées :
Dim i as Integer, j as Integer ' For i =0 to Ubound(tablo,1) ....For j =0 to Ubound(tablo,2) ........If (Condition) ............Code pour remplir la feuille provenant des valeurs du tableau à 2 dim ........End if ....Next j Next i
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 303
1 nov. 2012 à 08:47
1 nov. 2012 à 08:47
Bonjour,
Décidément, tu persiste à donner les renseignements au goutte à goutte
Donc, je ne vais plus perdre mon temps d'autant plus que tu reprends ton code pratiquement en entier avec des fonctions et cascades de macros inutiles
Décidément, tu persiste à donner les renseignements au goutte à goutte
Donc, je ne vais plus perdre mon temps d'autant plus que tu reprends ton code pratiquement en entier avec des fonctions et cascades de macros inutiles
Didoch54000
Messages postés
308
Date d'inscription
vendredi 16 février 2007
Statut
Membre
Dernière intervention
27 décembre 2012
26
2 nov. 2012 à 19:56
2 nov. 2012 à 19:56
Bonsoir michel,heliotte,
Michel desole que tu le prenne comme ca le code publié precedement etait sans avoir vu le tien bien plus exlicite et performant. Pour les renseignements je pensait avoir été explicite mais non a priori.
Cela dit merci a vs 2 pour vos conseils et aide apporté.
Bonne continuation
Michel desole que tu le prenne comme ca le code publié precedement etait sans avoir vu le tien bien plus exlicite et performant. Pour les renseignements je pensait avoir été explicite mais non a priori.
Cela dit merci a vs 2 pour vos conseils et aide apporté.
Bonne continuation
30 oct. 2012 à 08:07
Merci d'avoir pris le temps de me lire et d'analyser mon problème.
Pour répondre a ta question oui il faut que je rentre les données exactement dans ce rectangle car en fait c'est pour envoyer à une reprographie donc je suis limité en terme de quantité/organisation des données.
tu ne lui demande que de te renvoyer la dernière valeur trouvée. En fait c'est la mon probleme il fraudai que je retourne valeur/valeur avant de continuer la boucle et c'est la ou mes connaissances me font défaut.
Pour resumer :
Entrée des données dans le premier onglet
Click sur le boutton 5
Mettre data dans array , trier en ordre croissant
Mettre les données du array dans des cellules bien spécifique dans un second onglet .
Au besoin je peux t'héberger le fichier.
Merci encore
Modifié par Heliotte le 30/10/2012 à 14:38
Entrée des données dans le premier onglet : ok
Click sur le boutton 5 : ok
Mettre data dans array : ok, les données sont bien dans le tableau. Données à partie de la ligne 2 jusqu'à la ligne (fin du tableau) et de la colonne "A" à la colonne "E" , trier en ordre croissant Je n'arrive pas a voir où tu as trié les données du tableau !!
Mettre les données du array dans des cellules bien spécifique dans un second onglet .
Reste donc à trier les données du tableau par ordre croissant
................... + Transferérer les données du tableau vers la feuille Excel
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Comment trier le tableau, car c'est un tableau à deux dimension : sur les lignes ou sur les colonnes .. car je pense que tu doit garder ces deux colonnes, n'est-ce-pas ?
- Le nombre de ligne ainsi que le nombre de colonnes (nombre d'éléments du tableau) ne correspondent en rien au moment de coller les valeurs du tableau dans le rectangle .. comment faut-il s'y prendre ?