Partage
  • Partager sur Facebook
  • Partager sur Twitter

VBA tableau automatisé

Sujet résolu
4 juillet 2024 à 17:12:05

.

-
Edité par BobyMister 5 juillet 2024 à 17:19:16

  • Partager sur Facebook
  • Partager sur Twitter
4 juillet 2024 à 19:56:19

Bonjour, Merci de lire les règles du forum AVANT de créer un sujet.

Le message qui suit est une réponse automatique activée par un membre de l'équipe de modération. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

Pour plus d'informations, nous vous invitons à lire les règles générales du forum

Merci de colorer votre code à l'aide du bouton Code </>

Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton  </> de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: php;">Votre code ici</pre>.

Merci de modifier votre message d'origine en fonction.

Liens conseillés

  • Partager sur Facebook
  • Partager sur Twitter
5 juillet 2024 à 16:10:52

Tes tableaux sont définis avec des références fixes ? ils incluent les lignes "TOTAL" ? 

pourquoi passer par une plage nommée pour le calcul de la somme ?

pourquoi tu fais un cell.Row+1 pour la ligne "TOTAL" de ta seconde plage ? 

Pourquoi tu passes par un OFFSET pour définir ta plage utilisée par la somme ? et ne pas utiliser la plage initiale comme base de modification?

Pourquoi rechercher la cellule TOTAL alors que tu l'as déjà fait au début (il suffit de rajouter 1 à la ligne trouvée au début vu que l'on a insérer une ligne)

Normalement, ça ne devrait servir à rien de redéfinir la formule de la cellule TOTAL.

Le code ci-dessous fonctionne (les tableaux et plages sont définis au niveau de la feuille et non du classeur) et aucun besoin de modifier la formule de la somme.

    Dim ws As Worksheet
    Dim totalRow As Integer
    Dim c As Range
    
    Set ws = ThisWorkbook.Worksheets(Feuil4.Name)
    
    For Each c In ws.Range("Tableau1")
        If c.Value = "TOTAL" Then
            totalRow = c.Row
            Exit For
        End If
    Next c
    
    ws.Rows(totalRow).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    ws.Names("plage1").RefersTo = ws.Range(ws.Range("plage1").Cells(1, 1), ws.Cells(totalRow, ws.Range("plage1").Column))


La dernière ligne définit la range commençant par la 1ère cellule de la plage définie initialement, à la cellule de la colonne de la plage et de la ligne totalRow (qui correspond depuis l'insertion de ligne à la dernière ligne du tableau).

  • Partager sur Facebook
  • Partager sur Twitter
5 juillet 2024 à 18:31:17

Bonjour, on n'efface pas ses messages après avoir reçu de l'aide. Je recopie le message d'origine pour archive et ferme ce sujet.

BobyMister a écrit:

J'essaie d'améliorer la fonctionnalité de mon classeur Excel en ajoutant une nouvelle ligne à un tableau et en veillant à ce qu'un calcul de somme inclue cette nouvelle ligne, le tout déclenché par un clic de bouton associé à une macro VBA.

Je parviens à ajouter les lignes mais je n'arrive pas à prendre en compte ces dernières dans une formule de Somme qui additionne tous les cellules d'une colonne. J'ai pourtant essayé de créer une plage de donnée dans la formule mais elle ne se met pas à jour automatiquement.

Pour l'instant j'ai une partie du code qui fonctionne : 

Sub AjoutLigne()

Dim ws As Worksheet

    Dim totalRow1 As Long, totalRow2 As Long

    Dim cell As Range

    ' Définir la feuille de calcul active (ou spécifier une feuille en particulier)

    Set ws = ActiveSheet

    ' Définir les plages nommées par leur nom

    Dim plageTableau1 As Range

    Dim plageTableau2 As Range

    Set plageTableau1 = ws.Range("Tableau1")

    Set plageTableau2 = ws.Range("Tableau2")

    ' Initialisation des lignes "TOTAL" à une valeur invalide (0)

    totalRow1 = 0

    totalRow2 = 0

    ' Recherche de "TOTAL" dans la première plage

    For Each cell In plageTableau1.Columns(1).Cells

        If cell.Value = "TOTAL" Then

            totalRow1 = cell.Row ' Assignation du numéro de ligne contenant "TOTAL"

            Exit For ' Sortir de la boucle une fois "TOTAL" trouvé

        End If

    Next cell

    ' Recherche de "TOTAL" dans la deuxième plage

    For Each cell In plageTableau2.Columns(1).Cells

        If cell.Value = "TOTAL" Then

            totalRow2 = cell.Row + 1 ' Assignation du numéro de ligne contenant "TOTAL"

            Exit For ' Sortir de la boucle une fois "TOTAL" trouvé

        End If

    Next cell

    ' Vérifier si "TOTAL" a été trouvé dans la première plage

    If totalRow1 > 0 Then

        ' Insérer une nouvelle ligne avant la ligne "TOTAL" dans la première plage

        ws.Rows(totalRow1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

    Else

        MsgBox "Merci de créer une ligne 'TOTAL' à la fin de chaque tableau"

    End If

    ' Vérifier si "TOTAL" a été trouvé dans la deuxième plage

    If totalRow2 > 0 Then

        ' Insérer une nouvelle ligne avant la ligne "TOTAL" dans la deuxième plage

        ws.Rows(totalRow2).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

    Else

        MsgBox "Merci de créer une ligne 'TOTAL' à la fin de chaque tableau"

    End If

End Sub

Mais je n'arrive pas à trouver la solution pour la suite. Pour l'instant j'ai ceci :

  ' Mettre à jour la définition de la plage nommée Matière_Sèche_Ingérée__kg_VL_J après l'insertion de ligne

    Dim newRowCount As Long

    newRowCount = ws.Range("I87", ws.Range("I87").End(xlDown)).Rows.Count

    newRowCount = newRowCout - 1

    ' Mettez à jour la plage nommée pour qu'elle tienne compte de la nouvelle ligne insérée

    ws.Names("Matière_Sèche_Ingérée__kg_VL_J").RefersTo = "=OFFSET('1. Analyse Minérale Ration'!$I$87, 0, 0, " & newRowCount & ", 1)"

    ' Mettre à jour la formule dans la cellule "TOTAL" pour prendre en compte la nouvelle plage

    Dim totalCell1 As Range

    Set totalCell1 = ws.Range("I87").End(xlDown) ' Trouver la dernière cellule de la colonne I

    If Not totalCell1 Is Nothing Then

        totalCell1.Offset(1, 0).Formula = "=SI(SOMME(Matière_Sèche_Ingérée__kg_VL_J)=0;"""";SOMME(Matière_Sèche_Ingérée__kg_VL_J))"

    Else

End Sub

Je bloque depuis plusieurs jour dessus. Je ne connais pas bien le langage VBA et je n'arrive pas à trouver la documentation nécessaire.
Je vous remercie par avance pour votre aide,
Belle soirée,
Boby


  • Partager sur Facebook
  • Partager sur Twitter