Créer et nommer un onglet avec une variable

titi0685

Nouveau membre
Bonjour,

Je souhaite créer des onglets et les nommer différemment pour pouvoir y coller les infos.
J'explique je récupère un export excel qui contient les différentes UP de production : 6C, 6D,...
je souhaite créer une variable nommée UP qui balayera chaque ligne et a chaque changement d'UP créera un onglet qu'il nommera par le nom de l'UP concerné et dans lequel je viendrai y coller toutes les lignes du dit UP.

Ma macro est la suivante mais elle ne fonctionne pas :

'Sub CREERONGLET()
'
' CREERONGLET Macro
' Macro enregistrée le 17/09/2010 par Interforum
'
'Dim UP As String

'For i = 2 To 300

'
' If Range("A" & i).Value = "" Then
' Range("W" & i).Select
'If ActiveCell.Value = "6C" Then
' FOURNISSEURS = Range("C" & i).Value
' On Error Resume Next
' Sheets("SOURCE").Select
'Sheets("SOURCE").Copy after:=Sheets(2)
'S'heets("SOURCE").Range("AE" & i).Value = "X"
'toutes les op de collage et de mise en forme
'If Range("A" & i).Value = "6D" Then
'Sheets.Add.Name = UP
'Sheets("SOURCE").Select
'Sheets("SOURCE").Copy after:=Sheets(2)
'Active Sheet.Name = "6D"
'On Error Resume Next
'End If
'End If
'End Sub

Quelqu'un peut il m'aider
 

chonos

Helper
J'en connais un, s'il passe par là il vas te redonner les règles pour poster du code !

voir le règlement !
 

titi0685

Nouveau membre
Excusez moi j'ai du commetre une erreur mais je ne sais pas laquelle je suis peut être maladroit.

 

titi0685

Nouveau membre
Bonjour,

Je souhaite créer des onglets et les nommer différemment pour pouvoir y coller les infos.
J'explique je récupère un export excel qui contient les différentes UP de production : 6C, 6D,...
je souhaite créer une variable nommée UP qui balayera chaque ligne et a chaque changement d'UP créera un onglet qu'il nommera par le nom de l'UP concerné et dans lequel je viendrai y coller toutes les lignes du dit UP.

Ma macro est la suivante mais elle ne fonctionne pas :

[cpp]

Sub CreerOnglet()

Dim UP As String

For i = 2 To 300

If Range("A" & i).Value = "" Then
Range("W" & i).Select
If ActiveCell.Value = "6C" Then
UP = Range("C" & i).Value
On Error Resume Next
Sheets("SOURCE" ).Select
Sheets("SOURCE" ).Copy after:=Sheets(2)
Sheets("SOURCE" ).Range("AE" & i).Value = "X"
If Range("A" & i).Value = "6D" Then
Sheets.Add.Name = UP
Sheets("SOURCE" ).Select
Sheets("SOURCE" ).Copy after:=Sheets(2)
Active Sheet.Name = "6D"
On Error Resume Next
End If
End If
End Sub

[/cpp]

Quelqu'un peut il m'aider ?

 

zeb

Modérateur
Maladresse réparée ;)

Ouh quelle horreur ce code !
Alors d'abord, tu vas méditer sur la nécessaire indentation du code. Allez hop :

Ca y est ? C'est promis, tu n'écriras plus le moindre bout de code sans l'indenter ?
Si c'est oui, c'est bien, on continue.

Dis-donc, ce code ne peut rien faire, il n'est même pas complet !
Où est le Next du For ? Je vois trois If ... Then mais seulement deux End If ! Et que sont ces On Error .. qui se baladent partout.

Bon, je te demanderais bien de me réécrire tout ça, mais je préfère que tu lâches le code pour te concentrer sur ton explication. Voudrais-tu recommencer, en essayant d'être plus clair ?

A te lire.
 

titi0685

Nouveau membre
Tout d'abord merci de prêter attention à ma demande. Je vais t'expliquer quel est mon besoin exactement et peut être pourras tu me guider pour le code.

Dans un premier temps :

Le premier onglet de mon fichier excel est nommé "SOURCE", c'est dans cet onglet que je viens coller un état de ma production actualisé par unité de production (état des colis en temps réel).

La première colonne de mon tableau est l'unité de production UP, au nombre de 5 : 6C, 6D, 6G, 6U, 6V.

Mon besoin est le suivant :

Je souhaite que ma macro balaye ma colonne UP et quelle créée un onglet à chaque nouvel UP qu'elle le nomme avec le nom de l'UP et qu'elle y colle toutes les colonnes concernées.

Dans un deuxième temps :

Le deuxième onglet de mon fichier est nommé "SUIVI DES RAFALES", c'est dans cet onglet que je viens coller un état global des commandes avec les dates de fin de préparation.

Je souhaite croiser les deux fichiers excel UP et SUIVI DES RAFALES afin d'avoir une UP actualisée par onglet et trier par dates et heures de fin de preparation.

SVP Dites moi que je suis un peu plus explicite dans les mots que dans le code ;)

merci d'avance pour votre aide précieuse

 

zeb

Modérateur
Salut,

Tu as deux problèmes. On va tâcher dans régler un seul à la fois.
Commençons par le premier si tu veux bien.


La première colonne de mon tableau est l'unité de production UP, au nombre de 5 : 6C, 6D, 6G, 6U, 6V.
Bon.
Je souhaite que ma macro balaye ma colonne UP et quelle créée un onglet à chaque nouvel UP qu'elle le nomme avec le nom de l'UP et qu'elle y colle toutes les colonnes concernées.
Or ta colonne UP ne contient que 6C, 6D, 6G, 6U, 6V. C'est ça ? Donc il faut créer chaque onglet si on le trouve dans ta colonne.

Ça me paraît tellement saugrenu que je me dis que je n'ai pas compris. Mais bon...
Code:
Option Explicit

Enum type_UP
    UP_6C
    UP_6D
    UP_6G
    UP_6U
    UP_6V
End Enum

Dim nom_UP(UP_6C To UP_6V) As String

Sub Init()
    nom_UP(UP_6C) = "UP_6C"
    nom_UP(UP_6D) = "UP_6D"
    nom_UP(UP_6G) = "UP_6G"
    nom_UP(UP_6U) = "UP_6U"
    nom_UP(UP_6V) = "UP_6V"
End Sub

Sub CreationFeuillesUP()
    Dim cell As Range
    Dim i As Integer
    Dim sh As Worksheet
    Dim UP_vu(UP_6C To UP_6V) As Boolean
    
    For i = UP_6C To UP_6V
        UP_vu(i) = False
    Next
    
    For Each cell In Columns(1).Cells
        For i = UP_6C To UP_6V
            If cell.Value = nom_UP(i) Then UP_vu(i) = True
        Next
    Next
    
    For i = UP_6C To UP_6V
        If UP_vu(i) Then
            Set sh = Worksheets.Add(, Sheets(Sheets.count))
            sh.Name = nom_UP(i)
        End If
    Next
End Sub
EDIT!
Il faut appeler Init() avant CreationFeuillesUP() bien sûr.
 

RedSux

Grand Maître
Bonjour,

En plus des réflexions sur l'indentation, j'ajouterai une réflexion sur les termes Excel ...
Traduire ton texte n'est pas évident !

Déjà c'est pas des onglets mais des feuilles (problème linguistique mais qu'il faut saisir pour trouver les commandes VBA correspondant à la création/suppression etc.).

Ensuite, tu dis que tu as une feuille "SOURCE" et une feuille "SUIVI DES RAFALES" ... Après tu parles de 2 fichiers "UP" et "SUIVI DES RAFALES" ...
Je suppose que la dernière est une simple erreur.

Voici ce que je comprends de ton texte :

Tu souhaites une macro (un script VBA) qui a les actions suivantes :
■ Pour chaque ligne de la feuille "SOURCE", on crée une feuille de titre 'VALEUR DE LA COLONNE A'
■ Dans chacune de ces feuilles, tu souhaites qu'une copie des informations des colonnes B à ? de la feuille "SOURCE" soit effectué (pour la ligne correspondante bien sur)
■ Tu souhaites que les informations de chaque onglet ainsi créé soient trié en fonction des données de la feuille "SUIVI DES RAFALES"

Si c'est pas ça je pense qu'il va falloir être beaucoup plus explicite ;)

(un exemple serait le bien venue dans ton cas ... 2 ou 3 petites capturent d'écran avec des valeurs fictives)

Après, comme zeb, c'est quoi tous ces "on error" ???
Lien utile :


@ zeb : tu en fais quoi de UP_vu ???


Code:
Sub CreationFeuillesUP()
    '.......

    For i = UP_6C To UP_6V
        If UP_vu(i) Then
            Set sh = Worksheets.Add(, Worksheets(Worksheets.count))
            sh.Name = nom_UP(i)
        End If
    Next
End Sub

Non ??? :heink:
 

titi0685

Nouveau membre
C'est exactement ça :

Mais je précise juste une chose, la macro ne créée pas une feuille par ligne, en fait à la fin il y a 5 feuilles nommées "6C", "6D", "6G", "6U", "6V" dans lesquelles vont se coller les lignes qui correspondent à l'UP.

je vais faire une capture d'écran, par contre comment je l'insère ?




 

zeb

Modérateur
En relisant tout ça, je me dis qu'on s'est bien embêter pour pas grand chose.
Titi, t'es qu'un boulet qui ne sait même pas nous dire que tu veux juste copier les lignes de telle feuille qui commencent par 6C dans la feuille 6C.

Je comprends onglet comme feuille de calcul ou feuille graphique. En général, on ne traite que des feuilles de calcul, que l'on abrège volontiers en feuilles. Soit. Je fais correspondre onglet à Sheet, feuille de calcul à Worksheet et feuille graphique à Chart. Ça ne pose pas de problème tant qu'on utilise les bons objets en programmation.

Code:
Dim ws_UP(UP_6C To UP_6V)   As Worksheet
Dim i                       As Integer
Dim b                       As Boolean
Dim cell_source             As Range
Dim cell_UP(UP_6C To UP_6V) As Range

' // Création de toutes les feuilles UP, si elles n'existent pas encore
For i = UP_6C To UP_6V
    b = False
    For Each ws In Worksheets
        If ws.Name = nom_UP(i) Then
            b = True
            Exit For
        End If
    Next
    If Not b Then
        Set ws_UP(i) = Worksheets.Add(, Sheets(Sheets.count))
        ws_UP(i).Name = nom_UP(i)
        ' // Création d'un pointeur sur la prochaine ligne à remplir
        Set cell_UP(i) = ws_UP(i).Range("A1")
    Else
        ' // Initialisation du pointeur sur la prochaine ligne à remplir
        Set cell_UP(i) = ws_UP(i).Range("A65536").End(xlUp)
        If cell_UP(i).text <> "" Then Set cell_UP(i) = cell_UP(i).Offet(1)
    End If
Next

For Each cell_source In Worksheets("SOURCE").Columns(1).Cells
    For i = UP_6C To UP_6V
        If cell_source.Value = nom_UP(i) Then
            cell_source.EntireRow.Copy Destination:=cell_UP(i)
            Set cell_UP(i) = cell_UP(i).Offet(1)
        End If
    Next
Next
 

RedSux

Grand Maître


You're welcome ...

(jolie code en passant ... connaissait pas Range("A65536" ).End(xlUp) )
 

zeb

Modérateur
:merci:
Si tu as toi-aussi de jolies choses à proposer, je t'invite à participer à ce topic :


Je m'y sens un peu seul :(
 

RedSux

Grand Maître


J'ai visité, et les seules petites astuces que j'avais sont déjà listé... :pt1cable:
Après il y a "astuce" et "bonne pratique" ... (genre Option Explicit, la gestion des erreurs, etc.) ...

Mais je ne suis pas un pro du VBA ... Je le manipule un peu (à force d'avoir des *$~%£ de documents bizarres ...) mais c'est pas vraiment ma tasse de thé !
Je peux te faire un topic similaire en Java, ADA95 et Fortran77 si tu veux (mais j'ai la flemme).
 

RedSux

Grand Maître
Bof ... Pour java la FAQ de "developpez.com" est excellente.
ADA95 et Fortran77 ne sont utilisé que par des puristes qui connaissent déjà tout ...

Si j'ai un peu de temps je ferais un petit truc ... Mais bon ...
A la limite, plus intéressant, la mise en place d'une Architecture EDSOA ... Et encore, on trouve tout sur google ...
 

titi0685

Nouveau membre
Merci mais je ne comprend pas tout et surtout je n'arrive pas à l'exécuter ?

elle me dit "erreur de compilation "constante requise""

[cpp]
Dim ws_UP(UP_6C To UP_6V) As Worksheet
Dim i As Integer
Dim b As Boolean
Dim cell_source As Range
Dim cell_UP(UP_6C To UP_6V) As Range

' // Création de toutes les feuilles UP, si elles n'existent pas encore
For i = UP_6C To UP_6V
b = False
For Each ws In Worksheets
If ws.Name = nom_UP(i) Then
b = True
Exit For
End If
Next
If Not b Then
Set ws_UP(i) = Worksheets.Add(, Sheets(Sheets.Count))
ws_UP(i).Name = nom_UP(i)
' // Création d'un pointeur sur la prochaine ligne à remplir
Set cell_UP(i) = ws_UP(i).Range("A1")
Else
' // Initialisation du pointeur sur la prochaine ligne à remplir
Set cell_UP(i) = ws_UP(i).Range("A65536").End(xlUp)
If cell_UP(i).Text <> "" Then Set cell_UP(i) = cell_UP(i).Offet(1)
End If
Next

For Each cell_source In Worksheets("SOURCE").Columns(1).Cells
For i = UP_6C To UP_6V
If cell_source.Value = nom_UP(i) Then
cell_source.EntireRow.Copy Destination:=cell_UP(i)
Set cell_UP(i) = cell_UP(i).Offet(1)
End If
Next
Next
[/cpp]

je dois te sembler bête mais je suis novice même si je suis quand même un boulet :sol:

ma feuille source contient les infos suivantes pour illustrer :

A B C D E...
1 UP RAFALE LOT ...
2 6C 21008 25
3 6C 22541 42
4 6D 69874 52
5 6G 45412 64
... 6V 25136 84

Merci d'avance même si je te parait bêbête. :sleep:


 

RedSux

Grand Maître


Normal, il ne t'a donné que la dernière partie du code ... Il faut reprendre le reste :

Code:
Option Explicit

Enum type_UP
    UP_6C
    UP_6D
    UP_6G
    UP_6U
    UP_6V
End Enum

' le = False est inutile puisque c'est la valeur par défaut, mais ça ne gâche rien
Dim nom_UP_init As Boolean = False
Dim nom_UP(UP_6C To UP_6V) As String

Sub Init()
    nom_UP(UP_6C) = "6C"
    nom_UP(UP_6D) = "6D"
    nom_UP(UP_6G) = "6G"
    nom_UP(UP_6U) = "6U"
    nom_UP(UP_6V) = "6V"
    nom_UP_init = True
End Sub


Sub CreationFeuillesUP()
    Dim ws_UP(UP_6C To [color=ff001d]UP_6V)[/color]  As Worksheet
    Dim i                      As Integer
    Dim b                      As Boolean
    Dim cell_source            As Range
    Dim cell_UP(UP_6C To UP_6V) As Range

    ' init nom_UP
    If nom_UP_init = False Then Init()

    ' // Création de toutes les feuilles UP, si elles n'existent pas encore
    For i = UP_6C To UP_6V
        b = False
        For Each ws In Worksheets
            If ws.Name = nom_UP(i) Then
                b = True
                Exit For
            End If
        Next
        If Not b Then
            Set ws_UP(i) = Worksheets.Add(, Sheets(Sheets.Count))
            ws_UP(i).Name = nom_UP(i)
            ' // Création d'un pointeur sur la prochaine ligne à remplir
            Set cell_UP(i) = ws_UP(i).Range("A1")
        Else
            ' // Initialisation du pointeur sur la prochaine ligne à remplir
            Set cell_UP(i) = ws_UP(i).Range("A65536").End(xlUp)
            If cell_UP(i).Text <> "" Then Set cell_UP(i) = cell_UP(i).Offet(1)
        End If
    Next

    For Each cell_source In Worksheets("SOURCE").Columns(1).Cells
        For i = UP_6C To UP_6V
            If cell_source.Value = nom_UP(i) Then
                cell_source.EntireRow.Copy Destination:=cell_UP(i)
                Set cell_UP(i) = cell_UP(i).Offet(1)
            End If
        Next
    Next
End Sub


Tu n'as plus qu'à appeler "CreationFeuillesUP()" au bon moment !
 

titi0685

Nouveau membre
Désolé mais je dois être vraiment idiot, mais je n'arrive toujours pas à l'executer
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 123
Messages
6 717 725
Membres
1 586 356
Dernier membre
TommyStam
Partager cette page
Haut