Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2013 Ajouter des formules dans un tableau de dimensions variables

Ananas94

XLDnaute Junior
Bonjour,

Après maintes recherches sur le sujet (qui m'ont déjà pas mal aidées), je suis bloquée dans un programme.
En effet, 2 tableaux (construits et nommés) sont présents:
-le premier, nommé "Tab_Données_ORLI" recueille des données brutes recueillies dans un logiciel.
-Le second nommé "Tab_Calculs" effectue des calculs à partir de ces données.
Les dimensions de ces deux tableaux (en terme de nombre de lignes essentiellement) est variable à chaque utilisation.

Je souhaite effectuer les actions les suivantes :
1- Cliquer sur le bouton de la macro "calcul profil de puissance" -> OK
2- Une fois que j'ai cliqué sur le bouton, le second tableau doit se remplir avec des formules (celles de calculs) et s'arrêter à la dernière ligne remplie. -> NOK

Je suis bloquée en effet car :

1-J'ai un message d'erreur qui est le suivant :


Mon code est (l'erreur au débogage est en gras) :

VB:
Option Explicit
Sub Calcul_Profil_Puissance()

    Dim Jours_Stretch As Range, JEPP_stretch As Range, Puissance_corr As Range, Profil_theo As Range, Ecart_theo_exp As Range
    Dim LO1 As ListObject, LO2 As ListObject
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim cell_d
    Dim Formule_1 As String, Formule_2 As String, Formule_3 As String, Formule_4 As String, Formule_5 As String

    Set ws1 = Sheets("Données_ORLI")
    Set ws2 = Sheets("Résultats")

    Set LO1 = ws1.ListObjects("Tab_Données_ORLI")
    Set LO2 = ws1.ListObjects("Tab_Calculs")
    
    Formule_1 = "=" & "B9-$B$9"
    Formule_2 = "=" & "I10+(H10-H9)*J10/100"
    Formule_3 = "=" & "SI(OU(C10 > 101, 5, C10 < 80), J9, C10)"
    Formule_4 = "=" & "100-0,0584*I9-0,0054*I9*I9+3*I9*I9*I9*0,00001"
    Formule_5 = "=" & "K9-J9"

    
With LO2 'Pour la formule 1'
        .ListColumns("Jours de stretch").Range(2, 1).FormulaLocal = Formule_1 'La formule 1 est placée dans la 1ère case de la colonne'
       [B] .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).Select[/B]
        .ListColumns("Jours de stretch").Range(2, 1).Etirer_formules "H9:H" 'On étire la formule jusqu'à la fin du tableau, qui a des dimensions variables'
    End With
    
    With LO2 'Pour la formule 2'
        .ListColumns("JEPP de stretch").Range(3, 2).FormulaLocal = Formule_2 'La formule 1 est placée dans la 1ère case de la colonne'
        .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).Select
        .ListColumns("JEPP de stretch").Range(3, 2).Etirer_formules "I10:I" 'On étire la formule jusqu'à la fin du tableau, qui a des dimensions variables'
    End With
    
    With LO2 'Pour la formule 3'
        .ListColumns("Puissance corrigée").Range(3, 3).FormulaLocal = Formule_3 'La formule 1 est placée dans la 1ère case de la colonne'
        .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).Select
        .ListColumns("Puissance corrigée").Range(3, 3).Etirer_formules "J10:J" 'On étire la formule jusqu'à la fin du tableau, qui a des dimensions variables'
    End With
    
    With LO2 'Pour la formule 4'
        .ListColumns("Profil théorique NACRE").Range(2, 4).FormulaLocal = Formule_4 'La formule 1 est placée dans la 1ère case de la colonne'
        .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).Select
        .ListColumns("Profil théorique NACRE").Range(2, 4).Etirer_formules "K9:K" 'On étire la formule jusqu'à la fin du tableau, qui a des dimensions variables'
    End With
    
    With LO2 'Pour la formule 5'
        .ListColumns("Ecart puissance théorie-exp").Range(2, 5).FormulaLocal = Formule_5 'La formule 1 est placée dans la 1ère case de la colonne'
        .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).Select
        .ListColumns("Ecart puissance théorie-exp").Range(2, 5).Etirer_formules "L9:L" 'On étire la formule jusqu'à la fin du tableau, qui a des dimensions variables'
    End With
            
End Sub


Private Sub Etirer_formules(cell_d)
    Dim der_ligne As Long
    der_ligne = LO2.Cells(Rows.Count, 1).End(xlUp).Row 'Pour la colonne "Jours de stretch"
    Range(cell_d & der_ligne).FillDown
End Sub


2-Lorsque j'ai étiré la formule, des nombre négatifs apparaissent alors que les données corrélées sont vides. Le tableau est systématiquement entièrement rempli alors que ce n'est pas le cas.

Vous trouverez ci-joint le fichier.

Auriez-vous une idée pour me dire où est l'erreur s'il vous plaît ?
Je vous remercie vivement par avance,
Excellente journée,

Anna
 

Pièces jointes

  • Profil stretch PMOX.xlsm
    69.1 KB · Affichages: 22
Solution
Bonjour le fil, Anna

Comment est-ce possible?
Toujours la même réponse
L'inattention

Fais ce test sur une feuille vierge, et observe le contenu des formules
VB:
Sub Test()
Cells(2, 3).FormulaR1C1 = "=SI(OU(C10>101,C10<80),J9,C10)"
Cells(3, 3).Formula = "=SI(OU(C10>101,C10<80),J9,C10)"
Cells(4, 3).FormulaLocal = "=SI(OU(C10>101;C10<80);J9;C10)"
Cells(5, 3).Formula = "=IF(OR(C10>101,C10<80),J9,C10)"
Cells(6, 3).FormulaR1C1 = "=IF(OR(R[7]C>101,R[7]C<80),R[6]C[7],R[7]C)"
End Sub

Sinon, étant pour un usage normal d'un tableau structuré, je m’abstiendrai de commentaire sur tout dévoiement illogique de la chose

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re le fil,
Au début je regarde combien de cellules de DateOrli sont occupées, puis je copie les formules sur toute la matrice Calculs.
et avec : nb_lignes = Application.CountA([Tab_Données_ORLI])
j'efface toutes les lignes inutiles.
Je pense qu'un effacement de plage est plus rapide que le redimmensionnement d'un tableau structuré.
 

Staple1600

XLDnaute Barbatruc
Re

Sinon pour effacer un tableau, autant utiliser la syntaxe dédiée, non ?
VB:
Sub Effacer() 'ce n'est qu'un test (donc faire adaptations idoines)
Dim LO As ListObject
Set LO = ActiveSheet.ListObjects(1)
LO.DataBodyRange.ClearContents
End Sub

Ou plus radical
VB:
Sub Raz_LO()
Dim LO As ListObject
Set LO = ActiveSheet.ListObjects(1)
LO.DataBodyRange.Delete
End Sub
 

Staple1600

XLDnaute Barbatruc
Re

[philosophie de confinement à deux balles]
Et l'optimum est-t-il toujours souhaitable?
Nous avons optimisé notre monde (globalisation/mondalisation etc...)
Nous nous sommes affranchis des distances, des frontières.
Et l'omnipotence optimale, c'est au final le COVID-19 qui nous l'a chipé, à nous autres bipèdes accros au silicium.
[/philosophie de confinement à deux balles]
Oui, je sais...Infirmier !
 

Ananas94

XLDnaute Junior
Sylvanu,

J'adopte votre méthode "supprimer des lignes au lieu d'en ajouter" ; je teste votre essai et je ne comprends pas les phénomènes suivants :
1-pourquoi, l'ordi laisse le double de lignes avant d'en supprimer?
Exemple ci-joint: j'ai 10 lignes de données d'entrées, et le tableau Tab_Calculs a 20 lignes de calculs..

2-Je souhaite redimensionner le tableau, donc pas juste supprimer les valeurs des cellules, mais supprimer des cellules entières (je souhaite que les tableaux fassent la même taille); je ne sais pas si j'ai été claire ..?

En tout cas votre idée est meilleure que la mienne visiblement,
je vous remercie
Anna
 

Pièces jointes

  • Profil stretch PMOX_V3.xlsm
    47.6 KB · Affichages: 3

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Philosophie effectivement à deux balles.
Si vous considérez le Dieu $ comme référence alors effectivement vous avez raison.
Si maintenant vous considérez l'optimum comme le bien être humain sur une planète propre, rien ne vous empêche d'acheter des fraises d'ici et non d'Espagne, et du poisson de Bretagne et non de Thailande.
Et même pour vos slips, avec quelques euros de plus, il ne prendra pas le bateau pour vous être livré. https://www.leslipfrancais.fr/
On est quand même en partie maître de notre destion, et cela commence lentement à changer.
 

Ananas94

XLDnaute Junior
tu es infirmier ?
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…