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 :

Remplir un tableau excel avec programme VBA


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2017
    Messages : 17
    Points : 8
    Points
    8
    Par défaut Remplir un tableau excel avec programme VBA
    Bonjour,

    Comme le titre l'indique, je cherche à remplir un tableau (avec un programme VBA) à partir de deux valeurs (contenue dans deux cellules). Par un calcul (logique floue), ces deux valeurs me donnent un résultat qui s'affiche dans une troisième cellule.
    Pour me permettre de remplir ce tableau (en automatique bien sûr), mes deux premières valeurs s'incrémentent (de 1 à 10 pour le première et de 0 à 10 avec un STEP de 0.5 pour la seconde.
    J'ai essayé plusieurs choses, mais en vain. Si quelqu'un pouvait m'aider, ce serait super cool.
    Pour info, je suis complètement débutant en programmation. J'ai malgré tout compris comment fonctionnent les boucles (car j'en ai besoin dans ce cas).

    Je remercie d'avance les personnes qui pourront m’aider.

    Mika745

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Pas besoin de VBA pour ça.

    En supposant que tes données commencent en ligne 1, tu mets 1 et 0 dans A1 et B1.
    En A2, tu mets la formule :
    En B2, tu mets la formule :
    Tu copies A1:B1 vers le bas autant que nécessaire.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2017
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    Merci de ta réponse, mais je ne sais pas si je me suis fait comprendre avec ma question (surement pas assez clair!!) Donc je reformule:

    - j'ai un cellule A1 et une cellule A2
    - un calcul entre A1 et A2 me donne un résultat dans la cellule A3

    A partir de ça, je veux créer un tableau avec les valeurs que le cellule 3 me retourne, et faisant varier A1 et A2 avec un pas défini

    ex:
    --> A1=1 puis A2=1 donc A3=une valeur 1
    --> A1=1 puis A2=2 donc A3=une valeur 2
    --> A1=1 puis A2=3 donc A3=une valeur 3
    --> A1=2 puis A2=1 donc A3=une valeur 4
    --> A1=2 puis A2=2 donc A3=une valeur 5

    c'est avec les valeurs 1,2,3,3,.... que je veux alimenter mon tableau

    (au final je ne sais pas si je suis plus clair!!)

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub boucle()
        Dim i As Long, j As Single, k As Long, result(1 To 210, 1 To 3) As Double
        For i = 1 To 10
            For j = 0 To 10 Step 0.5
                ' écriture
                [A1] = i: [A2] = j
                'lecture
                k = k + 1
                result(k, 1) = i: result(k, 2) = j: result(k, 3) = [A3].Value
            Next j
        Next i
        ' Coller
        [E2].Resize(210, 3) = result
    End Sub
    Cependant tu ne dis pas comment est remplie A3.
    Si c'est par formule assez lourde elle risque d'être lue avant d'être évaluée. Tu dis...
    eric

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Quel est l'intérêt (je ne le vois vraiment pas) d'utiliser 3 cellules et (je le suppose) une formule ? ces cellules seront constamment modifiées et n'auront chacune qu'une seule valeur in fine ...
    On connaît la dimension à donner à la matrice M d'accueil.
    Il suffit dès lors d'une double boucle (for i, for j), d'une fonction "calcul_flou" à laquelle on envoie les paramètres i et j et qui retourne une valeur v dont on alimente l'index k (incrémenté de 1 à chaque itération) de la matrice M
    Non ?
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    C'est vrai que si le calcul est fait par une fonction vba autant se passer de transiter par la feuille.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2017
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    Tout d'abord merci pour vos réponses.
    Ce calcul me permet de renseigner d'autres tableaux et graphes sur ma feuille Excel.

    J'ai fait ce code, mais j'obtiens l'erreur suivante: erreur d'exécution 9 sur la ligne suivante: Tableau_sortie_temps(i, j) = Range("cf21").
    Voici mon code:

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Sub calcul_sortie_temps_FeuilleExcel()
     
    Dim x As Integer, y As Integer
    Dim i As Integer, j As Integer
    Dim Tableau_sortie_temps() As Single
     
     
     
        'Redéfinit la taille du tableau
     x = 21  'correspond au nb de valeur sur la ligne'
     y = 10   'correspond au nb de valeur sur une colonne'
        ReDim NomTableau(1 To x, 1 To y)
     
        Range("cf13") = 1  'la première valeur qui va s'incrémenter'
        Range("ci13") = 0   'la seconde valeur qui va s'incrémenter'
     
        'Alimente les éléments du tableau'
        For i = 0 To x Step 0.05
            For j = 1 To y
     
                Range("cf13").Value = i
                Range("ci13").Value = j
     
               Tableau_sortie_temps(i, j) = Range("cf21")        --> ça bloque là !!
     
            Next j
           Range("ci13") = Range("ci13") + 1
           Range("cf13") = 1
     
        Next i
        Range("c14") = 0
     
     
        'Transfère les éléments du tableau dans la feuille de calcul
        Range(Cells(10, 124), Cells(20, 145)) = NomTableau
    End Sub

  8. #8
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x = 21 'correspond au nb de valeur sur la ligne'
    y = 10 'correspond au nb de valeur sur une colonne'
    ReDim NomTableau(1 To x, 1 To y)
    Dimensionne ton tableau correctement.
    Avec un step de 0.05 (et non 0.5 comme annoncé) il faut un peu plus que 21 lignes.

    Pour une lecture agréable indente ton code et utilise la balise code (icone #)
    eric

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2017
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    qu'entends tu par balise code (je suis complètement débutant en VBA, désolé).

  10. #10
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    non, là c'est sur le forum.
    Sélectionne ton code et au-dessus du post que tu édites tu as des outils de mise en forme dont # (Ajouter la balise [CODE] pour l'avoir tel que je l'ai affiché dans mon post.

    Tu as quoi dans cf21, une fonction personnalisée ?

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2017
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    non, une simple division

  12. #12
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Ca c'est de la logique floue de pointe ;-)
    Et bien pourquoi tu ne la fais pas dans le code ? Plutôt que 90% du temps soit utilisé à écrire et lire sur la feuille

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2017
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    J'ai simplifié ma réponse.
    Il s'agit bien d'une division, mais relative au centre de gravité de mes sorties floues. Résultat donné par mon moteur d'inférence.

    A priori mon code fonctionne. J'ai effectivement repris la dim de mon tableau et modifié une autre ligne.
    De plus, j'avais plusieurs doc Excel ouverts, ce qui peut peut-être également expliqué mon pb.

    En tous les cas merci de vos réponses.
    Je pense que je reviendrai vite sur ce forum car il me reste encore des choses à faire, comme coder des graphes et autres. Mais bon je vais d'abord essayer de me débrouiller.

  14. #14
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Méfie-toi quand même des dé-synchronisations entre formules sur feuilles et vba, ce n'est pas une vue de l'esprit.
    Contrôle sérieusement que tu récupères correctement tous tes résultats avant de conclure que c'est ok.

  15. #15
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Je plussoie la remarque de eriiic
    Les formules Excel sont traitées dans un fil distinct de celui de VBA et rien ne garantit que leur calcul est terminé entre chaque itération des boucles dans VBA.
    Cette cohabitation de Excel (les formules) et de VBA est souvent source de problèmes et, dans certains cas, de conflits.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  16. #16
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Il me semblait bien qu'il y avait une propriété adéquate mais j'ai eu du mal à la retrouver, je me demandais si je l'avais rêvée...
    Insère quand même cette boucle avant la lecture sur feuille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Do
            DoEvents
        Loop Until Application.CalculationState = xlDone
    eric

  17. #17
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Tout-à-fait, eriiic, mais là, cela va ramer si la feuille est truffée de formules.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  18. #18
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Pourquoi ?
    Ca ne lance pas de calculs supplémentaires. Seules les formules à ré-évaluer le seront, et il faut bien attendre que le calcul soit fait.
    A cause du DoEvents tu crois ? A la limite on peut l'enlever, pas grave s'il ne fait que ça le temps du calcul. Et puis la feuille a tous les autres threads.

  19. #19
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour eriiic
    Pourquoi ?
    Ca ne lance pas de calculs supplémentaires.
    plus je relis son message N° 7 et moins j'en suis certain

    EDIT : cela me surprendrait par ailleurs énormément qu'un moteur d'inférence n'intervienne qu'à partir de deux données. Je ne sais pas pourquoi mon petit doigt (mais il est vrai qu'il devient lui aussi gâteux avec l'âge) me souffle que ces deux données-là ne sont là que pour définir en réalité un niveau de calculs faits dans d'autres cellules, dont le nombre ***** dépend probablement du niveau défini.
    Au passage : l'utilisation de Excel à une telle fin (assez complexe et nécessitant un thésaurus important de données, généralement stockées dans un système gestionnaire (SGBD) rapide, puissant et se prêtant le mieux possible à des requêtes diverses) me laisse assez dubitatif ...


    ***** et si c'est mon petit doigt, qui a raison, le temps des calculs progressera - de surcroît de manière non linéaire - au fur et à mesure de la progression des paramètres directeurs des deux boucles.
    Amitiés
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

Discussions similaires

  1. [Toutes versions] Ajouter une ligne en fin de tableau excel avec une vba
    Par Gordongekko dans le forum Macros et VBA Excel
    Réponses: 24
    Dernier message: 23/04/2017, 12h09
  2. [XL-2016] Ajouter une ligne en fin de tableau excel avec une vba
    Par Karkan dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/01/2017, 15h06
  3. Réponses: 6
    Dernier message: 10/03/2011, 09h37
  4. Réponses: 2
    Dernier message: 19/03/2008, 10h30
  5. [VBA-E] Construction d'un tableau EXCEL avec VBA
    Par oliver75 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 02/05/2007, 07h35

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