macro pour faire des calculs

loiclass

XLDnaute Occasionnel
Bonjour,

J'ai un fichier excel où je récupère des infos, avec ces infos je cherche à faire des calculs successifs.
Pour les tests simples il n'y a pas de problème.

Je cherche à faire un test sur des hauteurs.
Exemple: si valeur > 2300 alors je recopie la ligne en Feuil2
si 2000 < valeur > 2300 alors je cherche un complément pour atteindre 2300 et alors je recopie la ligne en Feuil2
si n x valeur > 2200 alors je recopie la ligne en Feuil2

etc

Je joint un fichier excel.

Merci d'avance.
 

Pièces jointes

  • essai_.xls
    40 KB · Affichages: 69

Gurgeh

XLDnaute Occasionnel
Re : macro pour faire des calculs

Le problème vient de ton test :
Code:
If 2200 < .Range("E" & i) > 2299 Then

Pour faire un test de ce type en VBA, il faut le décomposer en deux tests avec un lien de type and ou or. Dans ton cas, on va regarder si la valeur est supérieure à la borne inférieure ET inférieure à la borne supérieure
Code:
if (ValeuràTester > 2000) and (ValeuràTester < 2299)

Gurgeh
 

loiclass

XLDnaute Occasionnel
Re : macro pour faire des calculs

Bonjour Gurgeh,

J'ai modifié cette partie du code.
Par contre je veux, que si on est dans cet intervalle, on cherche une valeur dans le tableau pour arriver à un maximum de 2400.
Si cette valeur n'existe pas, il faut la créer.
Ensuite il faut recopier les résultats en page 2.
Merci
 

Gurgeh

XLDnaute Occasionnel
Re : macro pour faire des calculs

Je ne suis pas sur de bien comprendre ce que tu veux (mais bon, le grand âge n'aide pas).

Prenons la première valeur, qui est 2299. On cherche une valeur dans le tableau pour arriver à un maximum de 2400, il n'y en a pas (à chaque fois on dépasse 2400). Tu veux donc que l'on crée une nouvelle entrée dans le tableau. Quelle valeur lui donner ? 101 pour arriver exactement à 2400 ? Dans ce cas, que met-on dans les colonnes longueur et quantité ?

Gurgeh
 

ROGER2327

XLDnaute Barbatruc
Re : macro pour faire des calculs

Bonsoir à tous


Bien que je ne sois pas certain d'avoir décrypté les explications, un essai :​
VB:
Sub Bouton1_Clic()
Dim i&, j&, k&, tmp#, Dat As Range
    With Feuil1.[E1]
        Set Dat = .Parent.Range(.Cells, .Parent.Cells(.Parent.Rows.Count, .Column).End(xlUp))
    End With
    With Feuil2.[E1]
        For i = 2 To Dat.Count
            k = k + 1
            .Offset(k).Resize(1, 3).Value = Dat(i).Resize(1, 3).Value
            If Dat(i).Value > 2200 And 2300 > Dat(i).Value Then
                tmp = 2400 - Dat(i).Value
                For j = 2 To Dat.Count
                    If Dat(j).Value = tmp Then Exit For
                Next
                If j > Dat.Count Then
                    k = k + 1
                    .Offset(k).Resize(1, 3).Value = Dat(i).Resize(1, 3).Value
                    .Offset(k).Value = tmp
                End If
            End If
        Next
    End With
End Sub


ROGER2327
#6217


Dimanche 22 Tatane 139 (Ubu ès Liens - fête Suprême Seconde)
17 Thermidor An CCXX, 7,1857h - lin
2012-W31-6T17:14:44Z
 

Gurgeh

XLDnaute Occasionnel
Re : macro pour faire des calculs

Salut Yaloo, salut ROGER2327,

.parent permet d'aller chercher l'objet qui se situe un niveau au-dessus, c'est à dire l'objet qui contient celui à qui tu as mis le .parent.

Par exemple, si tu prends un objet worksheet (appelons-le feuille), et que tu fais feuille.parent, tu vas obtenir le classeur.

Extrait de l'aide :

Cette propriété renvoie l'objet parent de l'objet spécifié

Exemple
Cet exemple montre comment afficher le nom du graphique qui contient myAxis.

Set myAxis = Charts(1).Axes(xlValue)
MsgBox myAxis.Parent.Name

Gurgeh
 

ROGER2327

XLDnaute Barbatruc
Re : macro pour faire des calculs

Re...


Bonjour à tous,

Une aparté pour Roger : j'ai regardé ton code avec intérêt, mais je n'ai pas compris le terme

Si l'on fait l'aide d'excel, on a juste en lecture seule. Donc, cela ne m'aide pas trop.

A te relire

Martial
Gurgeh a dit l'essentiel. Je complète en disant pourquoi j'utilise cette syntaxe. Au lieu de :​
VB:
    With Feuil1.[E1]
        Set Dat = .Parent.Range(.Cells, .Parent.Cells(.Parent.Rows.Count, .Column).End(xlUp))
    End With
j'aurais pu écrire :​
VB:
Set Dat = Feuil1.Range(Feuil1.[E1].Cells, Feuil1.Cells(Feuil1.Rows.Count, Feuil1.[E1].Column).End(xlUp))
ou :​
VB:
    With Feuil1
        Set Dat = .Range(.[E1].Cells, .Cells(.Rows.Count, .[E1].Column).End(xlUp))
    End With
ou :​
VB:
    With Feuil1.[E1]
        Set Dat = Feuil1.Range(.Cells, Feuil1.Cells(Feuil1.Rows.Count, .Column).End(xlUp))
    End With
et, certainement, bien d'autres choses.

Mais je préfère la première version qui est la plus facile à mettre à jour : Si on veut prendre les données ailleurs qu'en Feuil1.[E1], il suffit de modifier​
VB:
    With Feuil1.[E1]
Avec les autres versions, il faut faire des modifications à plusieurs endroits de la procédure, ce qui n'est guère pratique. Voilà pourquoi j'utilise ce style de programmation.​


Bonne nuit.


ROGER2327
#6218


Dimanche 22 Tatane 139 (Ubu ès Liens - fête Suprême Seconde)
17 Thermidor An CCXX, 9,3649h - lin
2012-W31-6T22:28:33Z
 

loiclass

XLDnaute Occasionnel
Re : macro pour faire des calculs

Merci, ça me calcule mon "additif" comme je le voulais.
Mais maintenant, comment faire si cette valeur existe déjà, dans mes données de départ. je n'ai pas besoin de la recréer.

Merci d'avance, je suis vraiment perdu dans ce code.
 

ROGER2327

XLDnaute Barbatruc
Re : macro pour faire des calculs

Re...


Merci, ça me calcule mon "additif" comme je le voulais.
(...)
Au poil !


(...)
Mais maintenant, comment faire si cette valeur existe déjà, dans mes données de départ. je n'ai pas besoin de la recréer.
(...)
Avez-vous un exemple à donner où le code recrée une donnée existante ? Pour ma part, je ne parviens pas à créer un tel exemple.


(...)
Merci d'avance, je suis vraiment perdu dans ce code.
Il n'est pourtant pas très compliqué ! En voici une version commentée qui devrait vous aider à le décortiquer :
VB:
Sub Bouton1_Clic()
Dim i&, j&, k&, tmp#, Dat As Range

'Sélection des données :
    With Feuil1.[E1]
        Set Dat = .Parent.Range(.Cells, .Parent.Cells(.Parent.Rows.Count, .Column).End(xlUp))
    End With

    With Feuil2.[E1]

'Pour chaque valeur sélectionnée...
        For i = 2 To Dat.Count

'...report de la ligne correspondante dans la feuille Feuil2...
            k = k + 1
            .Offset(k).Resize(1, 3).Value = Dat(i).Resize(1, 3).Value

'...contrôle de l'ordre de grandeur de la valeur sélectionnée.
            If Dat(i).Value > 2200 And 2300 > Dat(i).Value Then

'Si la valeur est entre 2200 et 2300, calcul de son complément à 2400.
                tmp = 2400 - Dat(i).Value

'Recherche de ce complément dans les valeurs existantes...
                For j = 2 To Dat.Count
                    If Dat(j).Value = tmp Then Exit For '...et sortie de la boucle si ce compléménr est trouvé.
                Next
                
'Si le complément n'a pas été trouvé, alors...
                If j > Dat.Count Then

'...création d'une ligne supplémentaire dans la feuille Feuil2, avec ce complément.
                    k = k + 1
                    .Offset(k).Resize(1, 3).Value = Dat(i).Resize(1, 3).Value
                    .Offset(k).Value = tmp
                End If

            End If
        Next
    End With
End Sub
S'il reste des points obscurs, n'hésitez pas à les signaler.​


Bonne journée.


ROGER2327
#6222


Lundi 23 Tatane 139 (Saint Pissembock, oncle - fête Suprême Quarte)
18 Thermidor An CCXX, 3,2625h - amande
2012-W31-7T07:49:48Z
 

loiclass

XLDnaute Occasionnel
Re : macro pour faire des calculs

bonjour,

J'ai une dernière question, après j'essaye de me débrouiller seul.

Comment faire si il existe déjà dans le tableau, un sous multiple de l'additif ou une combinaison de valeur égale à cet additif?

exemple 1:
valeur à tester: 2200, logiquement il faut un additif de 200, mais dans le tableau il existe un valeur de 100.
Je n'ai pas besoin de créer la valeur 200, il suffit de prendre en compte 2X100 et réduire la quantité initiale de moitié de 100.

exemple 2:
Valeur à tester 2250, logiquement il faut un additif de 150, mais dans le tableau il existe une valeur de 100 et une de 50.
Il suffit de prendre la somme de 100 et 50, et j'ai bien mon additif de 150.

J'espère que c'est compréhensible.

Merci.
 

Discussions similaires

Réponses
16
Affichages
983

Statistiques des forums

Discussions
311 733
Messages
2 082 019
Membres
101 872
dernier inscrit
Colin T