Microsoft 365 Extraire des valeurs avec une macro

Xyzka

XLDnaute Nouveau
Bonjour,

Je cherche à extraire des valeurs aprés avoir remplacer automatique 2 valeurs. J'ai déjà fais une macro mais elle est trop lourde et ne convient pas au nombre de valeurs à extraire (excel me dit qu'il y a trop de ligne) 1 tableau a extraire = 1500 lignes et il faut que j’extrais 4 tableaux ...

Pour mieux comprendre j'avais fait ça :

Sub Mise_A_Jour_Prix_Revient()

Sheets("V1 lames L").Range("largeur_L").Value = Sheets("Synthèse").Range("E14").Value --> remplace la valeur de 'largeur_L" dans la feuille "V1 lames" suivant la valeur en E14 dans la feuille "synthèse"
Sheets("V1 lames L").Range("avancee_L").Value = Sheets("Synthèse").Range("D15").Value --> remplace la valeur de 'avancées_L" dans la feuille "V1 lames" suivant la valeur en D15 dans la feuille "synthèse"
Sheets("Synthèse").Range("E15").Value = Sheets("V1 lames L").Range("Prix_revient_L").Value --> extrait la valeur "prix de revient_L" dans la feuille "V1 lames L" et l'écrit en E15 dans la feuille "Synthèse"

Sheets("V1 lames L").Range("largeur_L").Value = Sheets("Synthèse").Range("E14").Value
Sheets("V1 lames L").Range("avancee_L").Value = Sheets("Synthèse").Range("D16").Value
Sheets("Synthèse").Range("E16").Value = Sheets("V1 lames L").Range("Prix_revient_L").Value

Sheets("V1 lames L").Range("largeur_L").Value = Sheets("Synthèse").Range("E14").Value
Sheets("V1 lames L").Range("avancee_L").Value = Sheets("Synthèse").Range("D17").Value
Sheets("Synthèse").Range("E17").Value = Sheets("V1 lames L").Range("Prix_revient_L").Value

End Sub

avec cette macro j’extrais les prix de reviens qui est calculé dans une cellule, en fonction de l'avancé et de la largeur de ma pièce.

Est-ce qu'il y a une façon moins "bourrine" de faire ça ?

Merci beaucoup !
 
Solution
Re,
Je ne suis pas sur d'avoir tout compris. Mon hypothèse :
- Je dispose d'une matrice en Synthèse avec des valeurs de Avancées et Largeurs,
- Avec chaque couple de valeurs je calcule le prix de revient en utilisant la feuille Données.
J'ai fait ça avec :
Code:
Option Explicit
Sub Remplit()
    Dim Ligne%, Colonne%, Ligne0%, Colonne0%
    Application.ScreenUpdating = False
    Ligne = 4: Colonne = 2                      ' Ligne colonnes initiales, cellule en haut à gauche du tableau Synthèse
    Ligne0 = Ligne: Colonne0 = Colonne          ' Ligne colonnes de travail pour valeurs Avancées Largeur
    While Cells(Ligne0, Colonne + 1) <> ""      ' Tant que le contenu de la colonne n'est pas vide
        While Cells(Ligne + 1, Colonne0) <>...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Xyzka, et bienvenu sur XLD,
Un petit fichier test serait infiniment le bienvenu pour mieux comprendre le problème.
Ensuite 1500 lignes pour XL c'est peanuts. Le pb doit venir d'autre part.
Enfin, pour le code utilisez les balises </> ( à droite de l'icone GIF ) cela rend le code beaucoup plus lisible.
 

Xyzka

XLDnaute Nouveau
Bonjour, Merci !

J'ai fais un mini fichier exemple, j’espère que ça sera plus compréhensible ...

Je sais que c'est rien pour excel 1500 lignes ... mais il me disait quand même qu'il y avait trop de lignes de code (et c'est vraiment pas mon domaine donc je sais pas trop comment faire).

Et merci pour le conseil, je ferais ça la prochaine fois :)
 

Pièces jointes

  • Exemple.xlsm
    17.5 KB · Affichages: 5

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Je ne suis pas sur d'avoir tout compris. Mon hypothèse :
- Je dispose d'une matrice en Synthèse avec des valeurs de Avancées et Largeurs,
- Avec chaque couple de valeurs je calcule le prix de revient en utilisant la feuille Données.
J'ai fait ça avec :
Code:
Option Explicit
Sub Remplit()
    Dim Ligne%, Colonne%, Ligne0%, Colonne0%
    Application.ScreenUpdating = False
    Ligne = 4: Colonne = 2                      ' Ligne colonnes initiales, cellule en haut à gauche du tableau Synthèse
    Ligne0 = Ligne: Colonne0 = Colonne          ' Ligne colonnes de travail pour valeurs Avancées Largeur
    While Cells(Ligne0, Colonne + 1) <> ""      ' Tant que le contenu de la colonne n'est pas vide
        While Cells(Ligne + 1, Colonne0) <> ""  ' Tant que le contenu de la ligne n'est pas vide
            [Avancées_L] = Cells(Ligne + 1, Colonne0)           ' On transfert Avancées et Largeur
            [Largeur_L] = Cells(Ligne0, Colonne + 1)
            Cells(Ligne + 1, Colonne + 1) = [Prix_revient_L]    ' On récupère le prix de revient
            Ligne = Ligne + 1                                   ' On passe à la ligne suivante
        Wend
        Colonne = Colonne + 1: Ligne = Ligne0                   ' On passe à la colonne suivante
    Wend
    Application.ScreenUpdating = True
End Sub
L'avantage de ce code est qu'il est indépendant du nombre de lignes colonnes de la matrice Synthèse, puisqu'il s'arrête à la première ligne vide et la première colonne vide.
 

Pièces jointes

  • Exemple (2).xlsm
    20.6 KB · Affichages: 3

Xyzka

XLDnaute Nouveau
Merci beaucoup !

Je vais essayer de transférer ça dans mon "vrai" fichier 🤞

Juste comme ça (parce que je maîtrise pas du tout) à quoi sert les deux premières lignes ?
VB:
Dim Ligne%, Colonne%, Ligne0%, Colonne0%
    Application.ScreenUpdating = False

J'ai pas écris toutes les unités :rolleyes:
Le poids est en kg/m, d'où le calcul longueur (m) * poids (kg/m) * prix (€/kg) :)
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Dim déclare les variables qu'on va utiliser.
En VBA c'est facultatif, mais fortement recommandé car si vous utilisez MaVariable puis ensuite par erreur MaVarriable ( deux r ) alors pour le VBA ce sont deux variables différentes et vous vous poserez beaucoup de questions sur le pourquoi ça marche pas. Et le VBA ne donnera pas d'erreur.
Application.ScreenUpdating = False permet de figer l'écran pendant qu'on écrit sur la feuille. Cela permet d'accélérer les calculs.
 

Discussions similaires

Statistiques des forums

Discussions
298 770
Messages
1 971 601
Membres
203 412
dernier inscrit
elrico22