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
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 :
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é !