Insérer formules de calculs dans un TCD qui s'ajustent à la taille TCD

Bonjour,

j'ai avancé dans la programmation d'un TCD en programmant en VBA depuis access

j'ai le résultat que je souhaite mais je dois insérer des calculs dans le tableau et je ne trouve pas le bon algorithme

en effet, le TCD est produit automatiquement à partir d'une base et en fonction de critère choisi (funder/Organisation name), le CTD produit ser différent (donc de taille différente)

une fois le TCD produit, des utilisateurs vont saisir des données dans la colonne G (cf fichier joint)

je veux ajouter des formules de calcul automatique (sommes) dans la colonne H

il s'agit de sous-totaux du TCD

donc les niveaux hiérarchique 1 du TCD sont la somme des niveaux hiérarchiques 2, eux même la somme des niveaux hiérarchique 3, etc...

j'ai inséré des exemples de formules de calcul dans le fichier joint

mais je n'arrive pas à concevoir l'algorithme qui permet de faire çà dans la mesure ou en fonction des critères sélectionnés, le TCD aura une taille différente

je dois donc insérer les formules de calcul en fonction des niveaux hiérarchiques

quelqu'un aurait-il une piste d'algorithme pour démarrer ?

d'avance merci

22report-tests.xlsm (12.93 Ko)

quelqu'un aurait une piste d'algorithme ?

d'avance merci

Bonjour,

un vrai fichier serait plus utilise je pense....

P.

Bonjour

D'autant que l'on t'a déjà répondu sur ce fil https://forum.excel-pratique.com/viewtopic.php?f=2&t=108084&p=640335#p640335 sur lequel il aurait été plus simple de continuer

De plus

il est fort probable voire même certain que nombre des tes calculs puissent être intégrés dans le TCD (conversion de monnaie et division par une constante notamment, y compris les sous-totaux)

il est préférable, quand on juxtapose des calculs, d'utiliser LIREDONNEESTABCROISDYNAMIQUE

Tu parles de saisie mais on a majoritairement des formules qui dans ton exemple sont circulaires...

Bonjour,

merci à vous 2 pour vos réponses

je pensais au contraire que ce serait plus simple de reprendre un autre post, vu que le problème était différent

et désolé, j'ai mal exposé mon problème

en fait, je souhaite éditer des fichiers excel dont une partie des informations est issue de la base et me permet de faire directement de nombreux calculs comme vous le suggérez

ensuite, ces fichiers seront transmis à des utilisateurs qui devront saisir des données dans certaines cellules de la colonne H (fond jaune)

les autres cellules de la colonne H sont calculées (sous-totaux) à partir de ce qui aura été saisi par les utilisateurs

ci-joint un vrai fichier généré avec le code joint ayant permis de le générer

alors je sais bien me code est loin d'être optimisé, on peut même dire qu'il est "crade"

Option Compare Database

Sub EXPORT()

'Dim appexcel As Excel.Application
'Dim wbexcel As Excel.Workbook
Dim rs1, rs2 As DAO.Recordset
Dim Lig As Long

'http://forum.excel-pratique.com/excel/copier-fichiers-xls-vers-repertoire-t26489.html#p150986
Dim fso As Object, Src$, Dest$, Fich1$, Fich2$

'récupération de la date du merger
'Dat_merger = Format(dat_point, "yyyymmdd")
Date_report = Format(Now(), "yyyymmdd")

Set fso = CreateObject("Scripting.FileSystemObject")
Src = "D:\Users\jl3\2_ETUDES\10_TB\Template financier\"
Dest = "D:\Users\jl3\2_ETUDES\10_TB\Template financier\"
Fich1$ = "Report.xlsm"
Fich2$ = "Report_" & Date_report & ".xlsm"
fso.CopyFile Src & Fich1, Dest & Fich2

Set appexcel = CreateObject("Excel.Application")
appexcel.Visible = False
Set wbexcel = appexcel.Workbooks.Open("D:\Users\jl3\2_ETUDES\10_TB\Template financier\" & Fich2 & "")

'******************Ajouter des onglets au rapport********************************************************************
'
'on ajoute autant d'onglet que de table Tablei (table Report) + un onglet pour le bilan des rapports
'on met en forme les en-tête du TCD
'
'appexcel.Sheets.Delete.Name = "Feuil1"
appexcel.Sheets.Add.Name = "Feuil1"
appexcel.Columns("A:C").Select
appexcel.Selection.ColumnWidth = 3
appexcel.Columns("D:D").Select
appexcel.Selection.ColumnWidth = 48

appexcel.Range("A1:E2").Select
appexcel.Selection.Interior.Color = RGB(83, 141, 213)
appexcel.Selection.Font.Color = RGB(255, 255, 255)
appexcel.Selection.Font.FontStyle = "Bold"

appexcel.Range("A4:P4").Select
appexcel.Selection.Interior.Color = RGB(83, 141, 213)
appexcel.Selection.Font.Color = RGB(255, 255, 255)
appexcel.Selection.Font.FontStyle = "Bold"

'***********************************************************************************************************************

'******************en-tête du tableau croisé dynamique (TCD)*********************************************************
'
appexcel.Sheets("Feuil1").Select

appexcel.Cells(1, 1) = "Funder"
appexcel.Cells(2, 1) = "Organisation name"

appexcel.Cells(1, 8) = "Exchange rate USD - local currency"
appexcel.Cells(2, 8) = "Exchange rate local currency - USD"

appexcel.Cells(1, 11) = 0.815
appexcel.Cells(2, 11) = 1.227

appexcel.Cells(4, 1) = "Output"
appexcel.Cells(4, 2) = "Expense Group"
appexcel.Cells(4, 3) = "Expense Description"
appexcel.Cells(4, 4) = "Travel / staff description"
appexcel.Cells(4, 5) = "2017 (USD)"
appexcel.Cells(4, 6) = "Budget 2017 (local currency)"
appexcel.Cells(4, 7) = "Actuals 2017 (USD)"
appexcel.Cells(4, 8) = "Actuals 2017 (local currency)"
appexcel.Cells(4, 9) = "Staff : Salary (all taxes)"
appexcel.Cells(4, 10) = "Staff: men/month"
appexcel.Cells(4, 11) = "Variances (USD)"
appexcel.Cells(4, 12) = "Variance adjusted (USD)"
appexcel.Cells(4, 13) = "Variance local currency"
appexcel.Cells(4, 14) = "%"
appexcel.Cells(4, 15) = "Justification"
appexcel.Cells(4, 16) = "Ref.Receipt"

'***********************************************************************************************************************

'******************Remplissage TCD*****************************************************************************************************
'
'Table1 à passer en paramètre pour boucler sur l'ensemble des Table1 à n créées
Set rs1 = CurrentDb.OpenRecordset("SELECT Table1.Output, Table1.[Expense group], Table1.[Expense description], Table1.[Travel / staff description], Sum(Table1.[Total Cost]) AS [SommeDeTotal Cost] " _
                                & "FROM Table1 " _
                                & "GROUP BY Table1.Output, Table1.[Expense group], Table1.[Expense description], Table1.[Travel / staff description];")

If Not rs1.EOF Then rs1.MoveFirst

i = 0
x = 5
y = 1
Output = ""
Group = ""

Do While Not rs1.EOF

appexcel.Sheets("Feuil1").Select
If Output = rs1.Fields(0).Value And Group = rs1.Fields(1).Value And Description = rs1.Fields(2).Value Then
    'Test sur le contenu de Travel / Staff : quand vide, on n'insère pas de ligne (évite d'avoir des lignes (vide) dans le TCD)
        If IsNull(rs1.Fields(3).Value) Then
            appexcel.Cells(x, y + 3) = rs1.Fields(3).Value
            appexcel.Cells(x, y + 4) = rs1.Fields(4).Value
        Else
            appexcel.Cells(x + 1, y + 3) = rs1.Fields(3).Value
            appexcel.Cells(x + 1, y + 4) = rs1.Fields(4).Value
        End If

ElseIf Output = rs1.Fields(0).Value And Group = rs1.Fields(1).Value Then
    appexcel.Cells(x, y + 2) = rs1.Fields(2).Value
    'Test sur le contenu de Travel / Staff : quand vide, on n'insère pas de ligne (évite d'avoir des lignes (vide) dans le TCD)
        If IsNull(rs1.Fields(3).Value) Then
            appexcel.Cells(x, y + 3) = rs1.Fields(3).Value
            appexcel.Cells(x, y + 4) = rs1.Fields(4).Value
        Else
            appexcel.Cells(x + 1, y + 3) = rs1.Fields(3).Value
            appexcel.Cells(x + 1, y + 4) = rs1.Fields(4).Value
        End If

ElseIf Output = rs1.Fields(0).Value Then
    appexcel.Cells(x + 1, y + 1) = rs1.Fields(1).Value
    appexcel.Cells(x + 2, y + 2) = rs1.Fields(2).Value
    'Test sur le contenu de Travel / Staff : quand vide, on n'insère pas de ligne (évite d'avoir des lignes (vide) dans le TCD)
        If IsNull(rs1.Fields(3).Value) Then
            appexcel.Cells(x + 2, y + 3) = rs1.Fields(3).Value
            appexcel.Cells(x + 2, y + 4) = rs1.Fields(4).Value
        Else
            appexcel.Cells(x + 3, y + 3) = rs1.Fields(3).Value
            appexcel.Cells(x + 3, y + 4) = rs1.Fields(4).Value
        End If

Else
    appexcel.Cells(x, y) = rs1.Fields(0).Value
    appexcel.Cells(x + 1, y + 1) = rs1.Fields(1).Value
    appexcel.Cells(x + 2, y + 2) = rs1.Fields(2).Value
    'Test sur le contenu de Travel / Staff : quand vide, on n'insère pas de ligne (évite d'avoir des lignes (vide) dans le TCD)
        If IsNull(rs1.Fields(3).Value) Then
            appexcel.Cells(x + 2, y + 3) = rs1.Fields(3).Value
            appexcel.Cells(x + 2, y + 4) = rs1.Fields(4).Value
        Else
            appexcel.Cells(x + 3, y + 3) = rs1.Fields(3).Value
            appexcel.Cells(x + 3, y + 4) = rs1.Fields(4).Value
        End If
End If

Output = rs1.Fields(0).Value
Group = rs1.Fields(1).Value
Description = rs1.Fields(2).Value
Travel = rs1.Fields(3).Value

i = 4

rs1.MoveNext
x = x + i
Loop
'Debug.Print x
'***********************************************************************************************************************

'*********Suppression des lignes dont les colonnes A:D sont vides****************************************************
'
'x : fin du tableau
For n = x To 5 Step -1
If appexcel.Cells(n, 1) = "" And appexcel.Cells(n, 2) = "" And appexcel.Cells(n, 3) = "" And appexcel.Cells(n, 4) = "" Then
appexcel.Rows(n).Delete
End If
Next n
'***********************************************************************************************************************

'******************Calcul totaux par catégorie*******************************************************************************
'
'Set rs2 = CurrentDb.OpenRecordset("Requête4")
Set rs2 = CurrentDb.OpenRecordset("SELECT Table1.Output, Sum(Table1.[Total Cost]) AS [SommeDeTotal Cost] " _
                                & "FROM Table1 " _
                                & "GROUP BY Table1.Output " _
& "UNION " _
& "SELECT Table1.[Expense group], Sum(Table1.[Total Cost]) AS [SommeDeTotal Cost] " _
                                & "FROM Table1 " _
                                & "GROUP BY Table1.[Expense group] " _
& "UNION " _
& "SELECT Table1.[Expense description], Sum(Table1.[Total Cost]) AS [SommeDeTotal Cost] " _
                                & "FROM Table1 " _
                                & "GROUP BY Table1.[Expense description];")

If Not rs2.EOF Then rs2.MoveFirst
Do While Not rs2.EOF
'Debug.Print rs2.Fields(0).Value
appexcel.Sheets("Feuil1").Select
For n = x To 5 Step -1
'Output
If appexcel.Cells(n, 1) = rs2.Fields(0).Value Then
appexcel.Cells(n, 5) = rs2.Fields(1).Value

'Expense group
ElseIf appexcel.Cells(n, 2) = rs2.Fields(0).Value Then
appexcel.Cells(n, 5) = rs2.Fields(1).Value

'Expense description
ElseIf appexcel.Cells(n, 3) = rs2.Fields(0).Value Then
appexcel.Cells(n, 5) = rs2.Fields(1).Value

'Travel / Staff
ElseIf appexcel.Cells(n, 4) = rs2.Fields(0).Value Then
appexcel.Cells(n, 5) = rs2.Fields(1).Value

End If
Next n

rs2.MoveNext
Loop
'***********************************************************************************************************************

'*******Mis en forme du TCD*******************************************************************************************
'
'on met en forme les en-tête de ligne du TCD
'

For n = x To 5 Step -1
'Expense group
If appexcel.Cells(n, 1) <> "" Then
appexcel.Rows(n).Select
appexcel.Selection.Interior.Color = RGB(141, 180, 213)
'Expense description
ElseIf appexcel.Cells(n, 2) <> "" Then
appexcel.Rows(n).Select
appexcel.Selection.Interior.Color = RGB(197, 217, 241)
End If
Next n

'***********************************************************************************************************************

'******************Formules de calcul tableau croisé dynamique (TCD)*****************************************************************************************************
'

Lig = 5 'première ligne à vérifier
Do While Not IsEmpty(appexcel.Range("E" & Lig))
'Budget 2017 (local currency)
appexcel.Range("F" & Lig).Formula = "=E" & Lig & "*K$1"

'Actual 2017 (USD)
appexcel.Range("G" & Lig).Formula = "=G" & Lig & "/K$2"

'variances (USD)
appexcel.Range("K" & Lig).Formula = "=E" & Lig & "-G" & Lig

'Variance local currency
appexcel.Range("M" & Lig).Formula = "=F" & Lig & "-H" & Lig

'%
appexcel.Range("N" & Lig).Formula = "=G" & Lig & "/E" & Lig

    Lig = Lig + 1
Loop

'Lig = 5 'première ligne à vérifier
'Do While Not IsEmpty(appexcel.Range("B" & Lig))
'Actual 2017 (local currency)
'appexcel.Range("F" & Lig).Formula = "=E" & Lig & "*K$1"
'appexcel.Range("H5").Formula = "="
'Lig = Lig + 1
'Loop

'***********************************************************************************************************************

'repositionner le curseur sur le premier onglet avant enregistrement pour le classeur s'ouvre dessu
appexcel.Sheets("Financial report").Select
appexcel.Cells(1, 1).Select

wbexcel.Close True 'en mettant true tu enregistres en fermant (false si tu ne veux pas le faire)
Set wbexcel = Nothing
Set appexcel = Nothing

End Sub

Re

En fait ce n'est pas un TCD mais un succédané de TCD.

Ton code insère une référence circulaire en colonne G : tu ne peut mettre une formule qui multiplie la cellule elle-même par quoi que ce soit

Tu peux faire le calcul en VBA et écraser le contenu précédent.

Je n'ai pas détaillé ton code d'autant que sans la base on a peu de repère

Si ton remplissage tient bien compte des niveaux hiérarchiques, je ne vois pas trop où s epose le problème

Sinon a postériori, dans la mesure où ton tableau est très hiérarchisé il est assez facile de trouver chaque niveau hiérarchique en fonction du contenu de la colonne A pour N1, B ou pour N2, C pour N3 etc

Donc à partir de boucles find tu dois pouvoir trouver d'une part les lignes où mettre les totaux, d'autre part les lignes où puiser les valeurs à totaliser...

Merci

Simple pour un bon programmeur peut-être mais moi je suis pas très fort

Merci pour l'info sur la référence circulaire je l'avais noté mais pas encore corrigé

RE

Dans la 1ère partie de ton code tu as les variables x et y (que j'inverserais pour ma part ou renommerais) qui gèrent respectivement les lignes et colonnes où tu inscris tes valeurs.

Après cela change dans la partie qui repère les lignes par niveau pour la mise en forme : on utilise n pour les lignes...

Il faudrait donc profiter de la mise en forme qui repère les niveaux pour faire les formules en même temps ou prendre des repères.

Une fin de tableau peut se déterminer par une colonne sans trous, ici E :

soit en comptant ses valeurs et en tenant compte du décalage de 4 lignes au-dessus,

soit en partant de E1000000 (ou plus proprement du nombre de lignes possibles dans Excel avec rows.count) et en remontant avec .end(xlup) :

fin = Range("E" & Rows.Count).End(xlUp).Row

Donc ensuite il suffit de stocker dans des variables (un tableau) les numéros de lignes où se trouvent des niveaux et le type de niveau en même temps que le code parcourt le tableau pour la mise en forme puis de réutiliser ces variables pour les formules.

Utilise tous les outils de débogage à ta dispo : pas à pas, expressions espionnes, codes d'arrêts... c'est le meilleur moyen d'apprendre...

merci, je vais essayer de faire çà

même si je vois pas trop une fois que j'aurais ces infos comment je ferai mais chaque chose en son temps

je pense qu'il faut que j'intègre également dans les données que je recueille, le lien entre les niveaux

je m'explique

Ligne 5 (niveau 1) liée avec les lignes 6, 23 et 28 (niveaux 2) mais pas les lignes 35 et 52 qui sont liées à la ligne 34 (également niveau 1)

Ligne 6 (niveau 2) liée avec les lignes 7, 10, 12,14,17, 19 et 21 (niveaux 3) mais pas les lignes 36, 39, 41, etc.

Bonjour

Le plus simple avant de coder est déjà de prendre un papier et un crayon et de noter comment on s'y prendrait si on devait le faire manuellement.

Exemple

je pars du bas,

je regarde ce que contient la colonne D :

une info ? donc cette ligne est eu niveau 4.

Pas d'info donc je regarde la colonne C et je fais le même contrôle.

Ainsi pour chaque ligne tu as le niveau.

Tu vas voir ensuite qu'on n'a pas besoin de noter chaque ligne mais seulement celles ou se fait un changement de niveau...

De là la logique doit s'imposer sur la façon de traiter

Quand la logique est claire, ce n'est pas compliqué de l'automatiser...

oui, j'avais bien compris la logique que tu expliques mais au moins c'est bien clair, merci

par contre, j'ai direct une erreur sur la ligne de code qui permet de compter le nombre de ligne

erreur d'exécution '1004':

erreur définie par l'application ou par l'objet

je comprends pas

fin = appexcel.Range("E" & appexcel.Rows.Count).End(xlUp).Row

je me rends compte que j'avais désactivé la déclaration Dim appexcel as Excel.application car çà plante mon code également

Bonjour

Il manque une référence à une feuille avant Range, pas gênant pour rows.count

Edit : tu ferais bien de regarder la possibilité d'utiliser With et End With pour la référence à l'application, cela allégérait le code et sa lecture

Tu pourrais aussi ainsi tester depuis Excel avant de réintégrer dans Access

EDIT : afin de tester, j'ai créé une table access TCD sur laquelle je teste ma requête SQL et ma fonction

quand j'obtiendrai le résultat que je souhaite, je baserai ma requête sur ma variable Tableau et non plus sur ma table TCD

Bonjour,

j'ai avancé sur mon programme grace à ton aide 78chris

j'ai désormais une variable Tableau à 2 dimensions, dans lequel je stock l'architecture de mon TCD pour pouvoir m'en servir dans l'écriture des formules par la suite (code 1)

ensuite, j'ai écrit une fonction RecupFormule() qui doit me servir à récupérer les cellules que je souhaite additionner, en fonction de l'architecture de mon TCD (code 2)

je pensais utiliser ma fonction dans la requête suivante :

SELECT TCD.Ligne, TCD.Niveau_Txt, TCD.Niveau_Num, RecupFormule([Niveau_Num],[Hierarchie_Num])
FROM TCD;

j'obtiens le résultat ci-dessous :

capture d ecran 2018 04 16 15 02 44

le problème est que comme le montre la capture d'écran, en ligne 6, la formule somme tous les niveaux 3 alors qu'elle ne devrait sommer que les niveaux 3 <= à la ligne 21

j'ai tenté de corriger le problème en intégrant un critère sur le niveau hiérarchique dans ma requête (ci-dessous) mais je n'ai alors plus rien dans ma

colonne Formule

sql = "SELECT TCD.Ligne FROM TCD WHERE TCD.Niveau_Num = " & (Niveau_Num + 1) & " AND TCD.Hierarchie_Num = " & Mid([Hierarchie_Num], i, 1) & ";"

une idée plus simple à proposer ?

Code 1

'a,b,c,d : indice pour compter les niveaux hiérarchiques identiques
a = 1
b = 1
c = 1
d = 1

'boucle sur le TCD en partant de la ligne 5 et on descend d'une ligne à chaque boucle
'33 est le nombre de lignes du tableau (à recalculer pour chaque TCD)

For n = 5 To 33 Step 1

'tableau(colonne 1,colonne 2)
'(colonne 1 ' numéro de ligne ; colonne 2 ' niveau TCD)

If appexcel.Cells(n, 1) <> "" Then
Tableau(n, 1) = n
Tableau(n, 2) = "niveau 1"
Tableau(n, 3) = 1
Tableau(n, 4) = a
a = a + 1
b = 1
ElseIf appexcel.Cells(n, 2) <> "" Then
Tableau(n, 1) = n
Tableau(n, 2) = "niveau 2"
Tableau(n, 3) = 2
Tableau(n, 4) = (a - 1) & b

b = b + 1
c = 1
ElseIf appexcel.Cells(n, 3) <> "" Then
Tableau(n, 1) = n
Tableau(n, 2) = "niveau 3"
Tableau(n, 3) = 3
Tableau(n, 4) = (a - 1) & (b - 1) & c
c = c + 1
d = 1
ElseIf appexcel.Cells(n, 4) <> "" Then
Tableau(n, 1) = n
Tableau(n, 2) = "niveau 4"
Tableau(n, 3) = 4
Tableau(n, 4) = (a - 1) & (b - 1) & (c - 1) & d
d = d + 1

End If
MsgBox Tableau(n, 1) & " - " & Tableau(n, 2) & " - " & Tableau(n, 3)

Next n

Code 2

Public Function RecupFormule(Niveau_Num As Integer, Hierarchie_Num As String) As String

Dim res As DAO.Recordset
Dim sql As String
i = Niveau_Num
Debug.Print i
'sql = "SELECT TCD.Ligne FROM TCD WHERE TCD.Niveau_Num = " & (Niveau_Num + 1) & " AND TCD.Hierarchie_Num = " & Mid([Hierarchie_Num], i, 1) & ";"
sql = "SELECT TCD.Ligne FROM TCD WHERE TCD.Niveau_Num = " & (Niveau_Num + 1) & ";"
Debug.Print sql

Set res = CurrentDb.OpenRecordset(sql)
'Concatene les différents enregistrement
While Not res.EOF
RecupFormule = RecupFormule & "+G" & res.Fields(0).Value
res.MoveNext
Wend
'libere la mémoire
Set res = Nothing

End Function

je viens de trouver

ci-dessous la requête :

sql = "SELECT TCD.Ligne FROM TCD WHERE TCD.Niveau_Num = " & (Niveau_Num + 1) & " AND Mid(Hierarchie_Num," & i & ",1) = " & Mid([Hierarchie_Num], i, 1) & ";"

nouveau problème, je ne sais pas comment utiliser les données que j'ai stocké dans ma variable Tableau

ou plutôt, comment j'applique ce que j'ai fait avec une table Access TCD en utilisant ma fonction RecupFormule ?

peut-on faire une requête sur un tableau (variable) comme sur une table ?

Bonjour

Pas facile de t'aider sachant que tes données sont dans Access et qu'on ne peut reproduire pour tester

Il est possible que l'on puisse dès le départ dans le code "Remplissage TCD" gérer cela voire même dans la requête initiale.

Il faudrait un exemple de la table Table1 pour bien voir le meilleur moyen de repérer.

Si on reste au niveau Excel en fin de parcours (à adapter si plusieurs colonnes à formuler)

Option Base 1
Sub Formulation()
Dim Tablo()
Fin = Cells(Rows.Count, 5).End(xlUp).Row
i = 5
ReDim Tablo(Fin, 3)
For Each cellule In Range("A5:A" & Fin)
    If cellule <> "" Then
        Tablo(i, 1) = 1
    ElseIf cellule.Offset(0, 1) <> "" Then
        Tablo(i, 1) = 2
    ElseIf cellule.Offset(0, 2) <> "" Then
        Tablo(i, 1) = 3
    Else
        Tablo(i, 1) = 4
    End If
    Tablo(i, 2) = cellule.Row
    i = i + 1
Next
For i = 5 To UBound(Tablo)
    Select Case Tablo(i, 1)
        Case 1
            If N1 = 0 Then
                Tablo(i, 3) = "=G"
            End If
            N1 = i
            Tablo(i, 3) = "=G"
        Case 2
            If N2 = 0 Then
                Tablo(i, 3) = "=G"
            End If
            N2 = i
            Tablo(i, 3) = "=G"
            Tablo(N1, 3) = Tablo(N1, 3) & i & "+G"
        Case 3
            If N3 = 0 Then
                Tablo(i, 3) = "=G"
            End If
            N3 = i
            Tablo(i, 3) = "=G"
            Tablo(N2, 3) = Tablo(N2, 3) & i & "+G"
        Case 4
            Tablo(N3, 3) = Tablo(N3, 3) & i & "+G"
    End Select

Next i
Dim Formule()
ReDim Formule(Fin - 4)
For i = 1 To UBound(Formule)
    If Tablo(i + 4, 3) <> "" And Tablo(i + 4, 3) <> "=G" Then
        If Right(Tablo(i + 4, 3), 2) = "+G" Then Formule(i) = Left(Tablo(i + 4, 3), Len(Tablo(i + 4, 3)) - 2)
    Else
        If (Tablo(i + 4, 3) = "=G" Or Tablo(i + 4, 3) = "") And Range("H" & i + 4).Value <> "" Then Formule(i) = Range("H" & i + 4).Value
    End If
Next i
Range("H5:H" & Fin) = Application.Transpose(Formule)
End Sub

Edit : légère modification faite

Bonjour,

ta solution à l'air plus propre que la mienne

j'aimerais utiliser Cells(Rows.Count) mais j'ai une erreur de compilation Sub ou Fonction non définie

Fin = Cells(Rows.Count, 5).End(xlUp).Row

j'ai tenté en ajoutant appexcel mais là j'ai une erreur d'exécution '424' Objet recquis

Fin = appexcel.Cells(Rows.Count, 5).End(xlUp).Row

Bonjour

Essaie en déplacant devant Rows.Count ou bien en le dupliquant

D'où ma remarque sur un précédent post d'utiliser With afin de le mettre en paramètre et pouvoir le remplacer par un . et alléger ...

rien à faire, je n'arrive pas à passer ce code

fin = Cells(.Rows.Count, 5).End(xlUp).Row

j'ai essayé d'ajouter appexcel. un peu partout dans la formule mais çà ne fonctionne pas

je simplifierai mon code avec des with à la fin selon tes conseils

RE

Testé depuis Access

Fin = appexcel.Worksheets("Feuil1").Cells(Rows.Count, 5).End(xlUp).Row

Bonjour 78Chris

çà ne fonctionne pas toujours pas mais j'ai contourné le problème

j'ai finalisé mon outil qui fonctionne

un grand merci à toi qui m'a bien aidé !

Rechercher des sujets similaires à "inserer formules calculs tcd qui ajustent taille"