Remplacement de la valeur d'une cellule dans un autre classeur
Bonjour à toutes et à tous,
Je suis nouveau dans le monde du VBA donc n'hésitez pas à aller au bout des explications si nécessaire !
Pour résumer l'idée de ma fonction VBA, je dois envoyer des modifications effectuées dans un classeur A ("Database_Template") dans un classeur B ("Database"). Ces modifications sont stockées dans la feuille "Historiques" du classeur "Database_Template.xlsm" et il faut les envoyées dans la feuille "Plan de charge" du classeur "Database.xlsx" mais pas n'importe ou c'est là le problème.
Voici à quoi ressemble la feuille Historiques :
Voici un exemple de la feuille Plan de charge (je peux pas la partager ici c'est un document confidentiel) :
L'idée est de faire l'équivalent d'une fonction recherche afin de par la suite modifier une valeur en connaissant le projet ainsi que l'étape.
Voici mon code :
Private Sub oui_Click()
'code permettant d'envoyer les modifications dans la Database'
Dim i As Integer
Dim etape As String
Dim projet As String
Dim nouvelleValeur As String
Dim celluleModifiée As Variant
Dim celluleTemplate As String
Dim chemin As String
Dim nomFeuille As String
Dim feuille As Worksheet
Dim databaseTemplate As Workbook
Dim database As Workbook
Dim historiques As Worksheet
Dim pdc As Worksheet
'chemin = ActiveWorkbook.Path & "\Database.xlsx"'
Set databaseTemplate = Workbooks("Database_Templates.xlsm")
Set database = Workbooks("Database.xlsx")
Set historiques = databaseTemplate.Sheets("Historiques")
Set pdc = database.Sheets("Plan de charge")
For i = 2 To Range("A500000").End(xlUp).Row
'envoi des données dans la database'
projet = historiques.Range("B" & i).Value
etape = historiques.Range("C" & i).Value
nouvelleValeur = historiques.Range("E" & i).Value
nomFeuille = historiques.Range("A" & i).Value
Set feuille = databaseTemplate.Sheets(nomFeuille)
celluleModifiée = Application.WorksheetFunction.Index(pdc.Range("A2:JA200"), Application.WorksheetFunction.Match(projet, pdc.Range("A3:A200"), 0), Application.WorksheetFunction.Match(etape, pdc.Range("A2:JA2"), 0))
ERROR pdc.Range(celluleModifiée).Value = nouvelleValeur
pdc.Range(celluleModifiée).Interior.Color = RGB(255, 255, 255)
'remplacement des cellules modifiées par la formule'
celluleTemplate = Application.WorksheetFunction.Index(feuille.Range("A6:AZ200"), Application.WorksheetFunction.Match(projet, feuille.Range("A6:A200"), 0), Application.WorksheetFunction.Match(etape, feuille.Range("A6:AZ6"), 0))
feuille.Range("celluleTemplate").Formula = "=RECHERCHEH(" & etape & ";'Plan de charge éolien'!$A$4:$KA$200;LIGNE(B2);0)"
Next i
'Effacement de la feuille historique'
Worksheets("Historiques").Range("A2:E1000").Value = ""
MsgBox ("Le contenu de la feuille historiques a été envoyé")
End SubCependant j'ai une erreur d'exécution '1004' à l'endroit ou j'ai mis ERROR dans le code :
La méthode 'Range' de l'objet '_Worksheet' a échoué
Avez vous une idée de ou cela peut-il venir ?
Merci beaucoup pour votre aide, je vous souhaite une bonne journée
Thomas
Bonjour ThomasLgrge et
Une petite présentation ICI serait la bienvenue
Si vous ne l'avez pas encore fait, je vous invite à lire la charte du forum [A LIRE AVANT DE POSTER]
qui vous aidera dans vos demandes et réponses sur ce forum
Concernant votre problématique êtes vous certain que votre variable "CelluleModifiée" contient quelque chose
perso je ferais un test
celluleModifiée = Application.WorksheetFunction.Index(pdc.Range("A2:JA200"), Application.WorksheetFunction.Match(projet, pdc.Range("A3:A200"), 0), Application.WorksheetFunction.Match(etape, pdc.Range("A2:JA2"), 0))
If celluleModifiée = "" then
Msgbox "Cellule modifiée non trouvée"
Exit sub
End If
pdc.Range(celluleModifiée).Value = nouvelleValeurMerci de votre participation
Cordialement
Bonjour Bruno et merci pour ta réponse !
C'est bon je viens de me présenter sur le forum dédié
Je viens d'implémenter ton code et le message ne s'affiche pas. La cellule est donc bien non vide. Lorsque je passe la souris dessus dans mon code il est marqué celluleModifiée = "Commune"
C'est déjà une première erreur car dans le cas de l'exemple que j'ai montré plus bas, elle devrait être égale à "Test Commune" car c'est la valeur inscrite pour l'étape "Commune" et le projet "ABRB" dans le classeur Database.xlsx
MISE A JOUR,
L'erreur d'exécution 1004 est toujours présente mais j'ai la bonne valeur désormais dans "celluleModifiée" je m'tais juste trompé au niveau de la plage de recherche
match1 = Application.WorksheetFunction.Match(projet, pdc.Range("A3:A200"), 0)
match2 = Application.WorksheetFunction.Match(etape, pdc.Range("A2:JA2"), 0)
celluleModifiée = Application.WorksheetFunction.Index(pdc.Range("A3:JA200"), match1, match2)
If celluleModifiée = "" Then
MsgBox "Cellule modifiée non trouvée"
Exit Sub
End If
pdc.Range(celluleModifiée).Value = nouvelleValeur
pdc.Range(celluleModifiée).Interior.Color = RGB(255, 255, 255)match1 et match2 retourne les bonnes valeurs c'est bon.
J'ai l'impression que le problème se situe dans le fait que dans la ligne ou j'utilise la méthode Index, seulement la valeur de la cellule trouvée est affectée dans la variable celluleModifiée et non l'index.
C'est peut-être totalement autre chose mais je ne vois pas.
Bon je viens de trouver la solution tout seul !
Je la mets quand même ici, si jamais quelqu'un veut faire la même chose que moi par la suite.
Private Sub oui_Click()
'code permettant d'envoyer les modifications dans la Database'
Dim i As Integer
Dim etape As String
Dim projet As String
Dim nouvelleValeur As String
Dim chemin As String
Dim nomFeuille As String
Dim match1 As Double
Dim match2 As Double
Dim formule1 As Double
Dim formule2 As Double
Dim feuille As Worksheet
Dim databaseTemplate As Workbook
Dim database As Workbook
Dim historiques As Worksheet
Dim pdc As Worksheet
'chemin = ActiveWorkbook.Path & "\Database.xlsx"'
Set databaseTemplate = Workbooks("Database_Templates.xlsm")
Set database = Workbooks("Database.xlsx")
Set historiques = databaseTemplate.Sheets("Historiques")
Set pdc = database.Sheets("Plan de charge")
For i = 2 To Range("A500000").End(xlUp).Row
'envoi des données dans la database'
projet = historiques.Range("B" & i).Value
etape = historiques.Range("C" & i).Value
nouvelleValeur = historiques.Range("E" & i).Value
nomFeuille = historiques.Range("A" & i).Value
Set feuille = databaseTemplate.Sheets(nomFeuille)
match1 = Application.WorksheetFunction.Match(projet, pdc.Range("A1:A200"), 0)
match2 = Application.WorksheetFunction.Match(etape, pdc.Range("A2:JA2"), 0)
pdc.Cells(match1, match2).Value = nouvelleValeur
pdc.Cells(match1, match2).Interior.Color = RGB(255, 255, 255)
Next iBonne journée