Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2013 Copier une formule dans un cellule depuis une cellule d'un onglet nouvellement crée en macro VBA

pascalou1

XLDnaute Nouveau
Bonjour, étant à la fois nouveau sur le forum et petit débutant en vba, je cherche une solution au problème que voici :
j'ai le code pour créer un nouvel onglet à partir d'une donnée située dans une cellule.
Sheets("yoriginal_fiche_salarie").Copy After:=Sheets(1)
ActiveSheet.Name = Range("B3")
je vais créer des onglets pour chacun de mes salarié en copiant une feuille type
Suite à la création de l'onglet salarié, je souhaite :
1/ dans un tableau récapitulatif situé dans un onglet nommé" aa_exercices" (déjà crée) (champ du tableau = A5:A153)
j'ai besoin de trouver la dernière cellule vide du tableau, pour copier le nom (situé en B3 de l'onglet crée) sans écraser un autre salarié existant
2/ créer une formule d'égalité dans une cellule (C5) de l'onglet "aa_exercices" pour rapatrier des données (futures) d'une cellule (D36) de l'onglet créé dans ce tableau récapitulatif

Vous m'avez compris la tâche est rude pour moi et je vous remercie par avance si vous avez la possibilité de m'aider !!!
Merci d'avance !
 

xUpsilon

XLDnaute Accro
Bonjour,

Une fois n'est pas coutume : joignez un fichier exemple (vidé de ses données confidentielles).
1/Pour trouver la dernière cellule pleine de la colonne A (faire +1 pour insérer une valeur à la ligne suivante) :
VB:
Range("A" & Rows.Count).end(xlUp).Row
2/Selon quel critère, quoi, qui, où, comment ?

Bonne journée,
 

pascalou1

XLDnaute Nouveau
Bonjour,
Voici le doc épuré pour une meilleure compréhension
2/ à la suite de la création du nouvel onglet, je souhaite que la cellule C5 de l'onglet exercice = la cellule D36 du nouvel onglet ; comme si manuellement, je saisissez dans la cellule C5 de l'onglet exercices : ="nouvel onglet"!D36
le contenu : soit des dates ou du texte....
Merci pour votre intérêt !
 

Pièces jointes

  • carto competences net.xlsm
    45.9 KB · Affichages: 7

xUpsilon

XLDnaute Accro
Bonjour,

Si j'ai bien compris, il faut utiliser ceci :
VB:
Sheets("aa_exercices").Range("C" & Sheets("aa_exercices").Range("C" & Rows.Count).End(xlUp).Row + 1).FormulaLocal = "=" & Chr(39) & ActiveSheet.Name & Chr(39) & "!D36"

En gros, on remplit dans la feuille "aa_exercices", dans la colonne C, la dernière cellule vide (partant du bas de la feuille) avec une formule qui sera =NomDeLaNvelleFeuille & "!D36".

Attention à l'indentation du code pour la lisibilité.

Bonne journée,
 

vgendron

XLDnaute Barbatruc
hello
edit (correction des fautes d'orthographe qui me font saigner les yeux)
hello @xUpsilon

une solution avec ton code modifié
1) j'ai sorti le code de tri onglet dans une macro séparée
ps: pas sur que le tri fonctionne correctement
2) j'ai ajouté une fonction qui vérifie si l'onglet existe déjà ou pas

VB:
Sub Creer_onglet()
NomSalarié = Range("B3")
If FeuilleExiste(CStr(NomSalarié)) Then
    MsgBox "La feuille existe déjà"
    Exit Sub
End If

'creation onglet avec nom selectionné dans la cellule de la feuille
Sheets("yoriginal_fiche_salarie").Copy After:=Sheets(1)
ActiveSheet.Name = Range("B3")
'copie des liens entre le nouvel onglet et les onglets de synthèse

With Sheets("aa_exercices")
    LastLine = WorksheetFunction.Max(5, .Range("A" & .Rows.Count).End(xlUp).Row + 1) 'première ligne VIDE de la colonne A
    .Range("A" & LastLine) = NomSalarié
    .Range("C" & LastLine).Formula = "=" & NomSalarié & "!D36"
End With

'verif cellule vide tableaux destination avant coller
'Range("A5:A153").End(xlUp).Offset(1, 0) = Sheets("FicheB203").Range("T14").Value
'    'copie du nom dans les tableaux recap
'Sheets(1).Range("B3").Copy
'Sheets("aa_exercices_surete").Paste
'Sheets("aaudit_ost").Paste


TriOnglet
End Sub

Sub TriOnglet() 'tri des onglets par ordre alphabétique
Dim X As Variant
Dim I As Variant

For Each X In ActiveWorkbook.Sheets
    For I = 2 To ActiveWorkbook.Sheets.Count
        If Sheets(I - 1).Name > Sheets(I).Name Then
            Sheets(I - 1).Move After:=Sheets(I)
        End If
    Next I
Next X
End Sub


Function FeuilleExiste(NomFeuille As String) As Boolean
FeuilleExiste = False
For Each ws In ActiveWorkbook.Sheets
    If ws.Name = NomFeuille Then
        FeuilleExiste = True
        Exit Function
    End If
Next ws
End Function
 
Dernière édition:

xUpsilon

XLDnaute Accro
Salut @vgendron !

J'ai une interrogation sur la ligne suivante quand même :
VB:
Sheets("yoriginal_fiche_salarie").Copy After:=Sheets(1)
ActiveSheet.Name = Range("B3")
Le fait d'ouvrir une nouvelle feuille lui donne le focus (en l'occurence, ça nous permet d'ailleurs d'utiliser la priorité ActiveSheet.Name), mais du coup le fait d'attribuer la valeur Range("B3") ne va t'elle pas attribuer la valeur ActiveSheet.Range("B3") (qui serait vide pour le coup) plutôt que la valeur NomSalarié, qui correspond en fait à Sheets("yoriginal_fiche_salarie").Range("B3") ?

Bonne journée,
 

vgendron

XLDnaute Barbatruc
d'ailleurs, le cas d'un salarié vide n'est pas traité

d'ou le code corrigé suivant
VB:
Sub Creer_onglet()
NomSalarié = Range("B3")
If NomSalarié = "" Then
    MsgBox "Veuillez saisir un nom de salarié avant de cliquer"
    Exit Sub
End If

If FeuilleExiste(CStr(NomSalarié)) Then
    MsgBox "La feuille existe déjà"
    Exit Sub
End If

'creation onglet avec nom selectionné dans la cellule de la feuille
Sheets("yoriginal_fiche_salarie").Copy After:=Sheets(1)
ActiveSheet.Name = Range("B3")
'copie des liens entre le nouvel onglet et les onglets de synthèse

With Sheets("aa_exercices")
    LastLine = WorksheetFunction.Max(5, .Range("A" & .Rows.Count).End(xlUp).Row + 1) 'première ligne VIDE de la colonne A
    .Range("A" & LastLine) = NomSalarié
    .Range("C" & LastLine).Formula = "=" & NomSalarié & "!D36"
End With

'verif cellule vide tableaux destination avant coller
'Range("A5:A153").End(xlUp).Offset(1, 0) = Sheets("FicheB203").Range("T14").Value
'    'copie du nom dans les tableaux recap
'Sheets(1).Range("B3").Copy
'Sheets("aa_exercices_surete").Paste
'Sheets("aaudit_ost").Paste


TriOnglet
End Sub
 

pascalou1

XLDnaute Nouveau
Magnifique !
le code fonctionne nickel !!
effectivement, je pensais saisir le nom AVANT de cliquer mais la précaution proposée peut servir !!!!
un très grand merci à vous, et en plus avec célérité !!!
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…