XL 2021 Création de tableau

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Alamyr

XLDnaute Nouveau
Supporter XLD
Bonjour,
J'ai l'impression que la solution doit être simple mais je ne la trouve pas
Voici ce que je souhaite faire:

Sur une feuille : des valeurs sont calculées au jour le jour
A1 B1 C1
date du jour valeur calculée 1 valeur calculée 2

Je voudrais remplir automatiquement le tableau mémorisant ces valeurs calculées jour par jour
D1 E1 F1
jour1 valeur 1 de B1 valeur 2 de C1
jour2
jour3
.....

Y a t'il une solution via les formules standards d'Excel ou faut il passer par une macro ?
Merci d'avance
 
Solution
Effectivement si la feuille est protégé, la macro ne peut écrire dedans !
Pas de chance, le code d'erreur dans ce cas est le même que quand le Match (EQUIV) ne trouve pas la date d'où le message.
Avec UserInterfaceOnly la feuille est protégée des utilisateurs mais pas du code de la macro.

With objWs2
.Protect UserInterfaceOnly:=True
lgLigne = Application.WorksheetFunction.Match(objWs1.[A4], .Range("A:A"), 0)
.Cells(lgLigne, 2) = objWs1.[B4]
.Cells(lgLigne, 3) = objWs1.[C4]
End With

Sinon pour le "problème" du code d'erreur une solution serait d'externaliser le calcul du EQUIV dans une cellule
Ex en D1 : =EQUIV(Journalier!A4;Liste1!A:A;0)

VB:
Sub EnregistreL1()
    Dim objWs1      As...
Voici ma proposition :

VB:
Sub EnregistreL1()
    Dim objWs1      As Worksheet, objWs2      As Worksheet
    Dim lgLigne     As Long
  
    On Error GoTo erreur
    Set objWs1 = ThisWorkbook.Worksheets("Journalier")
    Set objWs2 = ThisWorkbook.Worksheets("Liste1")
    With objWs2
        lgLigne = Application.WorksheetFunction.Match(objWs1.[A4], .Range("A:A"), 0)
        .Cells(lgLigne, 2) = objWs1.[B4]
        .Cells(lgLigne, 3) = objWs1.[C4]
    End With
    Exit Sub
erreur:
    If Err.Number = 1004 Then
        MsgBox "Date non trouvé"
    Else
        MsgBox "Erreur : " & Err.Description & " (" & Err.Number & ")"
    End If
End Sub
Pile poil ce qu'il me faut
J'adapte à mon fichier réel
Si je ne reviens pas, c'est que tout est ok et mérite un grand merci
Je reviens même si tout est définitivement ok pour dire que grâce à l'aide de ce forum, j'ai progressé dans la compréhension des macros même si je suis encore loin d'en créer une
Hasta luego
 
Dernière édition:
Voici ma proposition :

VB:
Sub EnregistreL1()
    Dim objWs1      As Worksheet, objWs2      As Worksheet
    Dim lgLigne     As Long
   
    On Error GoTo erreur
    Set objWs1 = ThisWorkbook.Worksheets("Journalier")
    Set objWs2 = ThisWorkbook.Worksheets("Liste1")
    With objWs2
        lgLigne = Application.WorksheetFunction.Match(objWs1.[A4], .Range("A:A"), 0)
        .Cells(lgLigne, 2) = objWs1.[B4]
        .Cells(lgLigne, 3) = objWs1.[C4]
    End With
    Exit Sub
erreur:
    If Err.Number = 1004 Then
        MsgBox "Date non trouvé"
    Else
        MsgBox "Erreur : " & Err.Description & " (" & Err.Number & ")"
    End If
End Sub
Voici ma proposition :

VB:
Sub EnregistreL1()
    Dim objWs1      As Worksheet, objWs2      As Worksheet
    Dim lgLigne     As Long
   
    On Error GoTo erreur
    Set objWs1 = ThisWorkbook.Worksheets("Journalier")
    Set objWs2 = ThisWorkbook.Worksheets("Liste1")
    With objWs2
        lgLigne = Application.WorksheetFunction.Match(objWs1.[A4], .Range("A:A"), 0)
        .Cells(lgLigne, 2) = objWs1.[B4]
        .Cells(lgLigne, 3) = objWs1.[C4]
    End With
    Exit Sub
erreur:
    If Err.Number = 1004 Then
        MsgBox "Date non trouvé"
    Else
        MsgBox "Erreur : " & Err.Description & " (" & Err.Number & ")"
    End If
End Sub
Bonsoir
Un petit problème m'est arrivé
La macro adaptée au fichier réel marchait impec puis tout d'un coup j'ai le message "Date non trouvé" résultat d'une erreur 1004.
je n'arrivais pas à localiser le problème car toutes les cellules de la macro correspondent bien à celles de mes feuilles et je n'avais rien modifié.
En essayant de me remémorer quels changements j'avais pu effectuer, un seul m'est venu à l'esprit, j'ai verrouillé la feuille "suivi"
J'ai déverrouillé et tout est rentré dans l'ordre.
J'en déduis qu'il est impossible de verrouiller des cellules adressées par des macros.
Est-ce bien exact ? Si oui, ça peut poser des problèmes dus une erreur manuelle sur la zone. Mais bon....
 
En essayant de me remémorer quels changements j'avais pu effectuer, un seul m'est venu à l'esprit, j'ai verrouillé la feuille "suivi"
J'ai déverrouillé et tout est rentré dans l'ordre.
Sauf erreur de ma part, on ne verrouille pas une feuille, on la protège.
Ce sont les cellules qu'on verrouille.

J'en déduis qu'il est impossible de verrouiller des cellules adressées par des macros.
Là aussi, sauf erreur de ma part, on peut lire des cellules verrouillées, mais on ne peut pas écrire dedans, sauf si on protège la feuille uniquement pour l'utilisateur (et donc pas pour VBA).
 
Sauf erreur de ma part, on ne verrouille pas une feuille, on la protège.
Ce sont les cellules qu'on verrouille.


Là aussi, sauf erreur de ma part, on peut lire des cellules verrouillées, mais on ne peut pas écrire dedans, sauf si on protège la feuille uniquement pour l'utilisateur (et donc pas pour VBA).
Mais les cellules verrouillées ne le sont que si la feuille est protégée et dans la protection de la feuille, je ne vois aucune option qui donne passe droit pour VBA
Mais bon tout ceci n'est pas grave puisque mon fichier Excel ne sera a priori utilisé que par moi
Merci pour ces précisions
 
Effectivement si la feuille est protégé, la macro ne peut écrire dedans !
Pas de chance, le code d'erreur dans ce cas est le même que quand le Match (EQUIV) ne trouve pas la date d'où le message.
Avec UserInterfaceOnly la feuille est protégée des utilisateurs mais pas du code de la macro.

With objWs2
.Protect UserInterfaceOnly:=True
lgLigne = Application.WorksheetFunction.Match(objWs1.[A4], .Range("A:A"), 0)
.Cells(lgLigne, 2) = objWs1.[B4]
.Cells(lgLigne, 3) = objWs1.[C4]
End With

Sinon pour le "problème" du code d'erreur une solution serait d'externaliser le calcul du EQUIV dans une cellule
Ex en D1 : =EQUIV(Journalier!A4;Liste1!A:A;0)

VB:
Sub EnregistreL1()
    Dim objWs1      As Worksheet, objWs2      As Worksheet
    Dim lgLigne     As Long
   
    On Error GoTo erreur
    Set objWs1 = ThisWorkbook.Worksheets("Journalier")
    Set objWs2 = ThisWorkbook.Worksheets("Liste1")
    If Not IsNumeric(objWs2.[D1].Value) Then MsgBox "Date non trouvée": Exit Sub
    With objWs2
        .Protect UserInterfaceOnly:=True
        lgLigne = objWs2.[D1]
        .Cells(lgLigne, 2) = objWs1.[B4]
        .Cells(lgLigne, 3) = objWs1.[C4]
    End With
    Exit Sub
erreur:
    MsgBox "Erreur : " & Err.Description & " (" & Err.Number & ")"
End Sub
 
Effectivement si la feuille est protégé, la macro ne peut écrire dedans !
Pas de chance, le code d'erreur dans ce cas est le même que quand le Match (EQUIV) ne trouve pas la date d'où le message.
Avec UserInterfaceOnly la feuille est protégée des utilisateurs mais pas du code de la macro.

With objWs2
.Protect UserInterfaceOnly:=True
lgLigne = Application.WorksheetFunction.Match(objWs1.[A4], .Range("A:A"), 0)
.Cells(lgLigne, 2) = objWs1.[B4]
.Cells(lgLigne, 3) = objWs1.[C4]
End With

Sinon pour le "problème" du code d'erreur une solution serait d'externaliser le calcul du EQUIV dans une cellule
Ex en D1 : =EQUIV(Journalier!A4;Liste1!A:A;0)

VB:
Sub EnregistreL1()
    Dim objWs1      As Worksheet, objWs2      As Worksheet
    Dim lgLigne     As Long
   
    On Error GoTo erreur
    Set objWs1 = ThisWorkbook.Worksheets("Journalier")
    Set objWs2 = ThisWorkbook.Worksheets("Liste1")
    If Not IsNumeric(objWs2.[D1].Value) Then MsgBox "Date non trouvée": Exit Sub
    With objWs2
        .Protect UserInterfaceOnly:=True
        lgLigne = objWs2.[D1]
        .Cells(lgLigne, 2) = objWs1.[B4]
        .Cells(lgLigne, 3) = objWs1.[C4]
    End With
    Exit Sub
erreur:
    MsgBox "Erreur : " & Err.Description & " (" & Err.Number & ")"
End Sub
Solution adoptée et effective
merci
 
Effectivement si la feuille est protégé, la macro ne peut écrire dedans !
Pas de chance, le code d'erreur dans ce cas est le même que quand le Match (EQUIV) ne trouve pas la date d'où le message.
Avec UserInterfaceOnly la feuille est protégée des utilisateurs mais pas du code de la macro.

With objWs2
.Protect UserInterfaceOnly:=True
lgLigne = Application.WorksheetFunction.Match(objWs1.[A4], .Range("A:A"), 0)
.Cells(lgLigne, 2) = objWs1.[B4]
.Cells(lgLigne, 3) = objWs1.[C4]
End With

Sinon pour le "problème" du code d'erreur une solution serait d'externaliser le calcul du EQUIV dans une cellule
Ex en D1 : =EQUIV(Journalier!A4;Liste1!A:A;0)

VB:
Sub EnregistreL1()
    Dim objWs1      As Worksheet, objWs2      As Worksheet
    Dim lgLigne     As Long
 
    On Error GoTo erreur
    Set objWs1 = ThisWorkbook.Worksheets("Journalier")
    Set objWs2 = ThisWorkbook.Worksheets("Liste1")
    If Not IsNumeric(objWs2.[D1].Value) Then MsgBox "Date non trouvé": Exit Sub
    With objWs2
        .Protect UserInterfaceOnly:=True
        lgLigne = objWs2.[D1]
        .Cells(lgLigne, 2) = objWs1.[B4]
        .Cells(lgLigne, 3) = objWs1.[C4]
    End With
    Exit Sub
erreur:
    MsgBox "Erreur : " & Err.Description & " (" & Err.Number & ")"
End Sub
Je pren
Solution adoptée et effective
merci

De rien. 😉
J'ajoute admirer la maxime qui est un indice subtil sur les activités de son porteur
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
4
Affichages
191
Retour