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 :

image

Voici un exemple de la feuille Plan de charge (je peux pas la partager ici c'est un document confidentiel) :

image

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 Sub

Cependant 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 = nouvelleValeur

Merci 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é C'est un plaisir de vous rejoindre.

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

image

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.

Thomas,

Sans fichier anonymisé, cela va être compliqué maintenant

A+

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 i

Bonne journée

Rechercher des sujets similaires à "remplacement valeur classeur"