Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/09/2011, 17h31   #1
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
Par défaut tableau a 2 dimensions

Bonjour,

je voudrais créer un tableau à deux dimensions. Le problème est que la taille du tableau n'est pas fixe. C'est facile me direz vous, il suffit de faire un tableau dynamique.

le problème c'est que voilà, j'ai des données qui change en fonction d'un bouton option:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
If (OptionButton_lot.Value = True) Then
        montant_ht = "lot 1 : " + TextBox_ht + "€"
    ElseIf (OptionButton_bon_commande.Value = True) Then
        montant_ht = "min : " + TextBox_ht + "€"
    Else
        montant_ht = TextBox_ht
    End If
------------------------------------------------
 
If (OptionButton_lot.Value = True) Then
        montant_ht_max = "lot 2 : " + TextBox_ht_max + "€"
    ElseIf (OptionButton_bon_commande.Value = True) Then
        montant_ht_max = "max : " + TextBox_ht_max + "€"
    End If
 
-----------------------------------------------------
 
montant_lot_3 = "lot 3 : " + TextBox_lot_3 + "€"
 
------------------------------------------------------
 
montant_lot_4 = "lot 4 : " + TextBox_lot_4 + "€"
Normalement que j'ai 1, 2, 3 ou 4 montant je devrais afficher les 4(ou les 2, ou les 3 selon les cas les une en dessous des autres avec ceci:
Code :
1
2
3
4
montant = IIf(montant_ht <> vbNullString, montant_ht & Chr(10), vbNullString) & _
      IIf(montant_ht_max <> vbNullString, montant_ht_max & Chr(10), vbNullString) & _
      IIf(montant_lot_3 <> vbNullString, montant_lot_3 & Chr(10), vbNullString) & _
      IIf(montant_lot_4 <> vbNullString, montant_lot_4 & Chr(10), vbNullString)
Cela me permettait en plus de les mettre en forme comme je le souhaite mais cela ne fonctionne pas.

D'où le post et la question comment faire un tableau à deux dimension qui me permettrait de faire ça? J'ai bien pensé à faire une ou quatre fonctions avec chaque fois un tableau mais n'étant pas un cador je souhaiterais avoir un (des) avis sur la solutions à employer.
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 11h07   #2
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Je n'ai pas exactement compris ce que tu veux.

Toujours est-il que tu peux effectivement utiliser un tableau dynamique à plusieurs dimensions et que tu peux garder le contenu lorsque tu le redimensionnes avec 'Preserve' (mais je ne dois rien t'apprendre)...quel est donc ton problème?
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 11h25   #3
Membre Expert
 
Avatar de hunteshiva
 
Homme eric Maitre
Étudiant
Inscription : février 2010
Messages : 954
Détails du profil
Informations personnelles :
Nom : Homme eric Maitre
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 954
Points : 1 166
Points : 1 166
Bonjour,

je ne vois pas le contenue de ton tableau 2D...
si ton tabealu s'arréte a 4-5 valeurs tu peux sans probléme créer un tableau de dimensions 10*10

c'est qu'a partir de plusieurs centaines voir miliers de lignes qu'on va essayer de faire attention à la taille d'un tableau, l'appli risque de saturer

voial ça c'est la méthode bourin

aprés tu a effectivement la possibilité de faire ça proprement mais c'est pplus long

Citation:
Si la première déclaration est :
Dim MonTableau(10,10)

On peut redimensionner le tableau et en gardant les données stockés par :
Dim Preserve MonTableau(10,50)

Par contre, on ne peut pas faire :
Dim Preserve MonTableau(50,50)
Pour un tableau 1 dimension c'est plus simple
Code :
1
2
3
4
5
6
7
Dim MonTableau() As String
 
'On dimensionne le nombre d'élément
ReDim MonTableau(50)
 
'Puis on redimensionne à 100 éléments en gardant les anciennes
ReDim Preserve MonTableau(100)
hunteshiva est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 11h36   #4
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
Effectivement mon tableau ne fait pas une taille de (10000*10000).

En fait, je rempli un maximum de 4 textbox avec un montant du style 123.00 ou 123.59 ou encore 158.50.

Le fait est que si j'en ai qu'un pas besoin de tableau, mais à partir de deux (ou quatre selon l'option choisie) la dénomination du premier se fait et apparait ainsi que la valeur qu'il contient mais pas les autres. D'où le tableau.

Donc dans mon tableau d'un coté je vais me retrouve avec min (ou lot 1 selon l'option),max (ou lot2), lot3, lot 4. et de l'autre coté une valeur numérique correspondant à un prix et en cherchant un peu le symbole monétaire €.

J'espère avoir été plus clair.
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 14h51   #5
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Toujours pas compris ...j'ai du mal à comprendre le lien entre ton tableau et les TextBox.

Mais je rejoins hunteshiva...pour un tableau de dimension au plus 4, pas besoin de se prendre la tête, fais un tableau statique.
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 16h20   #6
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
Juste pour l'explication. J'ai plusieurs texbox qui doivent afficher ce qu'elle contiennent dans une seule cellule de ma feuille ( 4textbox au max dans une seule cellule)

Comme ce que j'ai fait ne fonctionne pas, je vais passer mes données dans un tableau puis mettre mon tableau dans un string et affiché mon string dans ma cellule.

Si je merde pas dans ce que je fais je devrais avoir mes données les unes sous les autres avec en faces de chaque valeur un intitulé du style
max: valeur €
min: valeur €...

A y être autant mettre ceci pour voir si cela marcherait ou pas (juste une verif sur le code)
Code :
1
2
3
4
5
6
7
8
9
10
Sub min_max()
 
    Dim tableau1(1, 1) As String, montant As String
 
    tableau1(0, 0) = "min : "
    tableau1(0, 1) = montant_ht + " €"
    tableau1(1, 0) = "max : "
    tableau1(1, 1) = montant_ht_max + " €"
    montant = tableau1() 'je suis pas sur ici
End Sub
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 17h21   #7
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Pour ce qui est de ton code, je ne pense pas que cela fonctionnerait...bien que ça n'existe pas vraiment en VB (enfin, à ma connaissance), tableau1 - mais pas tableau1() - doit être un pointeur constant vers la première case du tableau donc aucune chance de pouvoir l'assigner à une variable de type string.

Par contre, je pense que ce code là doit fonctionner:

Code :
1
2
3
4
5
For i=0 To 4
 
montant = montant & tableau1(Floor(i/2), i%2)
 
Next i
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 10h25   #8
Membre Expert
 
Avatar de hunteshiva
 
Homme eric Maitre
Étudiant
Inscription : février 2010
Messages : 954
Détails du profil
Informations personnelles :
Nom : Homme eric Maitre
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 954
Points : 1 166
Points : 1 166
effectivement ça ne marchera pas
Code :
montant = tableau1() 'je suis pas sur ici
si j'ai bien compris tu veux mettre tes données à la suite
la encore tu a plusieurs possibilités *tout dépend le résultat que tu veux*

perso je ne voit pas l’intérêt de passer par un tableaux... *surtout de string*
si tu veux afficher ta donnée à la suite:
Code :
1
2
3
4
Dim montant as string
montant = "min : " & montant_ht & " €" & "max : " & montant_ht_max & " €"
' si c'est pour afficher dans une texBox un retour à la ligne serrait le bienvenu
montant = "min : " & montant_ht & " €" & vbCrLf & "max : " & montant_ht_max & " €"
tu peux séparer min et max avec un tableaux *pourquoi pas*
Code :
1
2
3
Dim montant(1) as string
montant(0) = "min : " & montant_ht & " €" 
montant(1) = "max : " & montant_ht_max & " €"
mais passer par un tableau 2D pour ça je ne vois pas....
hunteshiva est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 13h29   #9
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
Je veux afficher mes donner à la suite (les unes en dessous des autres avec une ligne vide entre elles) mais vu qu'elles ne sont pas situés au même endroit et vu ce que j'ai déjà tenté avant ça ne passe pas.

Le tableau en 2D c'était pour mettre le texte min, max, lot3, lot 4 d'un coté et de l'autre les valeurs correspondantes.

Mais actuellement mon souci est de savoir ou placer mon sub tableau (module ou dans ma feuille) ainsi que l'appeler. Ou si je doit plutôt faire une fonction.
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2011, 11h34   #10
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
Finalement je suis passé sur un tableau à une dimension.

Mais comment le renvoyer pour alimenter la variable qui appelle ma fonction?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public Function tableau_montant(montant_ht As String, montant_ht_max As String, Optional montant_lot_3 As String, Optional montant_lot4 As String) As String

    Dim montant(3) As String
    
    If (montant_lot_3 = montant_lot_4 = "") Then
        montant(0) = "min : " & montant_ht & " €"
        montant(1) = Chr(10) & "max : " & montant_ht_max & " €"
    ElseIf (montant_lot_4 = "") Then
        montant(0) = "lot 1 : " & montant_ht & "€"
        montant(1) = Chr(10) & "lot 2 : " & montant_ht_max & "€"
        montant(2) = Chr(10) & "lot 3 : " & montant_lot_3 & "€"
        Else
           montant(0) = "lot 1 : " & montant_ht & "€"
           montant(1) = Chr(10) & "lot 2 : " & montant_ht_max & "€"
           montant(2) = Chr(10) & "lot 3 : " & montant_lot_3 & "€"
           montant(3) = Chr(10) & "lot 4 : " & montant_lot_4 & "€"
    End If
        
    tableau_montant = montant(4)  'aucune erreur de compilation mais est-ce autorisé en vba
    
End Function
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2011, 12h11   #11
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Pourquoi ce détour par un tableau?
Il suffirait de concaténer les divers possibilités.
Exemple:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function Tableau_Montant(Montant_HT As String, Montant_HT_Max As String, Optional Montant_lot_3 As String, Optional Montant_lot_4 As String) As String
Dim RES As String
 
If Montant_lot_3 = "" And Montant_lot_4 = "" Then
    RES = "Min : " & Montant_HT & " €"
    RES = RES & Chr(10) & "Max : " & Montant_HT_Max & " €"
Else
    RES = "Lot 1 : " & Montant_HT & "€"
    RES = RES & Chr(10) & "Lot 2 : " & Montant_HT_Max & "€"
    RES = RES & Chr(10) & "Lot 3 : " & Montant_lot_3 & "€"
    If Montant_lot_4 <> "" Then RES = RES & Chr(10) & "Lot 4 : " & Montant_lot_4 & "€"
End If
Tableau_Montant = RES
End Function
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 10/09/2011, 13h06   #12
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
Tout simplement parce que je n'y ai même pas songé un instant. Mais effectivement c'est plus simple que ce que j'ai essayé de faire.


Merci pour le coup de main
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h04.


 
 
 
 
Partenaires

Hébergement Web