IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[VBA-E]Gestion de tableaux


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut [VBA-E]Gestion de tableaux
    coucou,

    Je voudrais creer un tableau mais dont la taille peut etre modifiée.
    Je pensais que la syntaxe etait : Dim TabNom() As String

    mais lorsque je veux y mettre une valeur :
    TabNom(1) = "blabla"

    erreur : l'indice n'appartient pas à la selection


    Autre question, si je veux boucler sur tous les elements du tableau le code est bien : For Each i In TabNom()
    (je ne peux pas trop regarder à cause du souci precedent )

    Merci de vos réponses

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    Yop, (j'adore les monologues )

    Non mais tant que j'y suis, j'ai une autre question pratique à demander aux pros

    Je remplis 1 tableau comme je l'ai dit, mais j'aurais besoin de l'utiliser dans plusieurs Sub.

    Je voudrais biensur eviter de le declarer et de le remplir 2 fois...

    Je pensais faire une fonction du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Function tableau (byval num as integer) as string
    dans laquelle je declare mon talbeau et le remplis. puis je retourne NomTab(num).

    Est ce que ca semble une bonne idée? Y'a t'il une meilleur solution pour ce cas?

    j'attends vos propositions

  3. #3
    Membre émérite
    Avatar de Theocourant
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 618
    Par défaut
    Citation Envoyé par Elstak
    coucou,

    Je voudrais creer un tableau mais dont la taille peut etre modifiée.
    Je pensais que la syntaxe etait : Dim TabNom() As String

    mais lorsque je veux y mettre une valeur :
    TabNom(1) = "blabla"

    erreur : l'indice n'appartient pas à la selection


    Autre question, si je veux boucler sur tous les elements du tableau le code est bien : For Each i In TabNom()
    (je ne peux pas trop regarder à cause du souci precedent )

    Merci de vos réponses
    Salut,

    Alors pour les tableaux dynamiques, il faut leur donner qu'en même un dimension au début de ton appli mais pas dans la partie déclaration...

    Un exemple sera plus parlant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim monTab() as Integer
    Dim maMat() as Double
     
      ReDim monTab(2)
     
      'Et donc me voilà avec monTab avec une dimension de 2 valeurs
     
      monTab(1)=5
     
      ReDim Preserve monTab(6)
      'Et maintenant monTab à 6 valeurs mais j'ai gardé la valeur que je lui avait affecté ("Preserve")
     
      ReDim maMat(5,3)
      'Et voilà maMat à 2 dimensions de 5*3 valeurs... etc
    Enfin si tu as d'autres question, regarde l'aide en ligne de VB...

    +

    Théo

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    Ok,
    j'avais deja vu le redim mais je pensais qu'il existait une autre maniere pour qu'il trouve sa taille en fonction du nom d'elements qu'il contient.

    en fait là le redim me sert à rien car j'ai juste à definir la taille au debut...

    domage.

    Je suis toujours preneur pour des réponses à mon second post

  5. #5
    Membre émérite
    Avatar de Theocourant
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 618
    Par défaut
    Citation Envoyé par Elstak
    Ok,
    j'avais deja vu le redim mais je pensais qu'il existait une autre maniere pour qu'il trouve sa taille en fonction du nom d'elements qu'il contient.

    en fait là le redim me sert à rien car j'ai juste à definir la taille au debut...

    domage.

    Je suis toujours preneur pour des réponses à mon second post
    Je comprends pas ce que tu veux dire ????
    Je crois que tu n'as pas compris ce que sont les tableaux dynamiques.

    La taille d'un tableau dynamique est définie lors de l'exécution du programme.

    Sinon pour avoir la taille si tu ne la connais pas, tu utilises Ubound et Lbound et là je te renvoie à l'aide en ligne.

    +

    Théo

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Hello Théo,

    Je crois qu'en fait Erzats a besoin de savoir que la dimension fixée par Redim preserve peut être une variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub RedimPreserve()
    Dim MonTab(), i, dimension
        For i = 1 To 8 'Val(Quelquechose)
          ReDim Preserve MonTab(i)
          MonTab(i) = "tintin" & Str(i)
        Next
        dimension = UBound(MonTab)
        MsgBox dimension
    End Sub
    A tout hasard

    A+

  7. #7
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Citation Envoyé par Elstak
    en fait là le redim me sert à rien car j'ai juste à definir la taille au debut...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim TabNom(1) As String
    Te crée un tableau à 2 éléments ayant pour indices 0 et 1.

    Si tu préfères que tous tes tableaux commencent à l'indice 1, il faudra écrire dans la partie déclarations.

    Si tu veux avoir plus de souplesse concernant la limite inférieure, tu peux aussi déclarer comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim TabNom(1 To 2) As String
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    L'union fait la force ! Aussi, grâce à jmfmarques qui a pensé à utiliser Let, voici la solution avé la founectiônne...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Sub Tableau() 
    Dim NbIndices, i, LeTab
    NbIndices = 5
    Let LeTab = FabriquerTableau(NbIndices)
        For i = 1 To NbIndices
            MsgBox LeTab(i)
        Next
    End Sub
     
    Function FabriquerTableau(Num)
    Dim LeTab
    ReDim LeTab(Num)
    For i = 1 To Num
       LeTab(i) = i
    Next
    FabriquerTableau = LeTab
    End Function
    N'oublie pas de nous dire...

    A+

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    Oulala, je vois à peu pres ce que tu veux dire mais je vais mieux reexpliquer ce que je veux car j'ai un peu avancé (jai meme reussi à faire ce que je voulais mais c'est pas génial...)

    Peut etre que ce n'est pas la meilleur maniere pour faire ca mais à part avec des tableaux je ne vois pas comment faire..

    J'ai 2 types de fichiers textes. J'ai un traitement particulier pour chaque type donc j'ai créé 2 tableaux. Je souhaite les convertirs en fichiers excel donc j'ai recréé 2 tableaux avec les noms de sortie. (Pour chaque tableau j'ai une fonction qui me renvoit le nom du fichier, je fourni l'indice pour appeler la fonction).

    Le petit probleme est que le nombre de fichiers peut augmenter (ou diminuer) donc je trouve ma solution un peu "rigide". voici ce que j'ai pour le moment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Public Function RetourneNomOrig(ByRef Num As Integer) As String
     
    Dim TabNom(1 To 100) As String
     
        TabNom(1) = "Nom1.txt"
        TabNom(2) = "Nom2.txt"        
     
    RetourneNomOrig = TabNom(Num)
     
    End Function
    j'ai mis 100 au maximum pour ne pas avoir à rajouter 1 à chaque ajout de fichier.

    j'ai aussi une seconde fonction comme ca pour le second type de fichier texte et 2 du meme genre pour le nom de fichier excel qui correspond (par exemple dans ma fonction retournenomsortie, Tabsortie(1) correspond au nom du fichier excel qu'a Nom1.txt apres convertion). Si j'ai choisi de faire une fonction c'est parceque j'ai besoin de ces noms dans plusieurs procédures indépendantes donc ca m'evite de tout avoir à redeclarer...

    Citation Envoyé par ouskel
    Aussi, grâce à jmfmarques qui a pensé à utiliser Let
    Je dors encore ou jmf n'a pas posté de message ??

    Voilà j'ai essayé de voir le Ubound que theo m'a conseillé mais je comprend pas trop en quoi il peut m'aider.

Discussions similaires

  1. [VBA-E]Additionner des tableaux (matrices)
    Par Mut dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/04/2006, 20h18
  2. [VBA-E] Gestion d'une erreur #N/A
    Par Mut dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 07/04/2006, 20h17
  3. [VBA-E]Gestion d'erreur
    Par Mut dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 07/04/2006, 20h05
  4. [VBA-E] gestion des fichiers ouverts ...
    Par SpaceFrog dans le forum Macros et VBA Excel
    Réponses: 24
    Dernier message: 20/01/2006, 17h10
  5. Réponses: 5
    Dernier message: 04/04/2003, 15h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo