Bonjour à tous,
Je débute en VBA et parfois il me manque quelques subtilités
Mon fichier est constitué d'une macro qui va me chercher un fichier source et copie des données (dites périmètre)
D'un onglet modèle qui doit être généré à chaque création d'un nouvel onglet.
A partir du périmètre, j'ai une macro qui crée des onglets : elle fonctionne très bien, c'est parfait sauf que les onglets se créent dans l'ordre inverse du tableau : dernière ligne du tableau = 1er onglet
Et j'ai besoin, pour pouvoir intégrer des éléments de synthèse à cette liste de départs:
- que le 1er onglet corresponde à la 2eme ligne de tableau (1er nom et non intitulé du tableau), que le 2e onglet corresponde à la ligne 3 du tableau donc au 2eme nom et ainsi de suite.
- qu'il ne crée pas d'onglet pour la dernière ligne du tableau qui est un "total" et qui n'est pas toujours sur la même ligne selon les fichiers sources (qui ne dépassent cependant pas 20 lignes)
Qu'est ce qu'il manque à mon code?!
je pense que c'est là : For ln = 20 To fb.Range("B" & Rows.Count).End(xlUp).Row (je triche en laissant une ligne vide pour que la ligne total ne soit pas prise en compte ) mais je ne comprends pas comment faire autrement, tout ce que je tente plante ou est trop complexe pour mon niveau
Et si je peux abuser , histoire d'apprendre et de comprendre, est ce que vous pouvez commenter vos réponses code ?!
Merci d'avance!
Je débute en VBA et parfois il me manque quelques subtilités
Mon fichier est constitué d'une macro qui va me chercher un fichier source et copie des données (dites périmètre)
D'un onglet modèle qui doit être généré à chaque création d'un nouvel onglet.
A partir du périmètre, j'ai une macro qui crée des onglets : elle fonctionne très bien, c'est parfait sauf que les onglets se créent dans l'ordre inverse du tableau : dernière ligne du tableau = 1er onglet
Et j'ai besoin, pour pouvoir intégrer des éléments de synthèse à cette liste de départs:
- que le 1er onglet corresponde à la 2eme ligne de tableau (1er nom et non intitulé du tableau), que le 2e onglet corresponde à la ligne 3 du tableau donc au 2eme nom et ainsi de suite.
- qu'il ne crée pas d'onglet pour la dernière ligne du tableau qui est un "total" et qui n'est pas toujours sur la même ligne selon les fichiers sources (qui ne dépassent cependant pas 20 lignes)
Qu'est ce qu'il manque à mon code?!
je pense que c'est là : For ln = 20 To fb.Range("B" & Rows.Count).End(xlUp).Row (je triche en laissant une ligne vide pour que la ligne total ne soit pas prise en compte ) mais je ne comprends pas comment faire autrement, tout ce que je tente plante ou est trop complexe pour mon niveau
VB:
Option Explicit
Dim fm As Worksheet, f As Worksheet, MSA As String, dico As Object
Dim fb As Worksheet
Dim i&, ln&, lgn&, col&
Sub Onglet()
Application.ScreenUpdating = False
Set fb = ActiveSheet ' fiche perimetre
Set fm = Sheets("Modele") 'fiche modele
Set dico = CreateObject("Scripting.Dictionary") ' liste du périmetre
For Each f In Worksheets
dico(f.Name) = ""
Next f
Sheets("Modele").Visible = True
For ln = 20 To fb.Range("B" & Rows.Count).End(xlUp).Row 'à partir de la ligne 20 prendre les données de la colonne B jusqu'à la cellule vide
MSA = fb.Range("B" & ln) 'une feuille par ligne du périmètre
If Not dico.exists(MSA & " ") Then
Sheets("Modele").Copy after:=Sheets("Périmètre") 'copie le modele du guide pour chaque onglet créée après périmètre
ActiveSheet.Name = MSA & " " ' la donnée MSA (colonn B) est le nom de l'onglet
Range("C10") = MSA 'Range la donnée en C10 de chaque onglet
Range("H10") = fb.Range("F" & ln) 'Range la donnée de la colonne F en N10 de chaque onglet
Range("K10") = fb.Range("G" & ln) 'Range la donnée de la colonne G en O10 de chaque onglet
End If
Next ln
Sheets("Modele").Visible = True 'passer en false quand tout est ok pour masquer la feuille modèle
End Sub
Et si je peux abuser , histoire d'apprendre et de comprendre, est ce que vous pouvez commenter vos réponses code ?!
Merci d'avance!