XL 2010 Déplacer des lignes entières sous condition d'un tableau vers différents onglets

Djehnsr

XLDnaute Nouveau
Bonjour, je vais tenter d'être le plus clair possible quant à l'exposition de mon problème.

Je gère le pôle logistique d'une entreprise, nous avons entre 35 et 70 commandes à préparer par jour pour nos techniciens.
Notre WMS génère un tableau avec toutes les commandes triées par Techniciens, donc 1 commande = 1 technicien, pour lequel peuvent figurer plusieurs lignes à préparer.
Nous extrayons ce tableau en format Excel et imprimons manuellement chaque commande, donc 1 technicien = 1 impression.
Pour ce faire, nous sélectionnons une commande depuis l'extraction puis imprimons la sélection, opération à répéter pour chaque commande, ce qui peut prendre jusqu'à 20 min.

Dans le but d'optimiser le temps d'impression nécessaire avant la distribution des commandes aux préparateurs, je cherche une solution pour renvoyer rapidement chaque commande vers l'onglet qui lui correspond pour, à terme, imprimer tous les onglets en une fois. J'ai alors pensé à une macro.

Pour se faire j'ai créé une matrice sur Excel avec un onglet par technicien, chacun portant leur nom, noms qui figurent sur le tableau issu de l'extraction originale.
Chacun de ces onglets est mis en forme, mais vide.
Disons que j'ai 30 techniciens, ma matrice aura 30 onglets + 1 qui accueillera le tableau extrait du WMS et dans lequel nous implanterons notre macro.

L'idée serait de redistribuer des lignes entières sous condition vers les onglets souhaités.

Vous trouverez en PJ une sélection modifiée du tableau créé à partir de l'extraction, ce sont ces lignes que nous voulons déplacer.

Je suis arrivé au bout de mes compétences sur Excel face à ce problème, j'ai manifestement besoin d'aide.

Excellois, Excelloises, je vous remercie d'avance !
 

Pièces jointes

  • PREPA CDE EXCEL.xlsx
    11 KB · Affichages: 8
Solution
Hello
corrige la macro d'impression comme ceci
SANS la déclaration de ws comme une feuille...
d'ailleurs.. cette erreur me surprend.. et je ne comprend pas... faudra que je regarde, car si on déclare ws comme étant une feuille, la propriété name n'existe pas.... y a surement un truc... une subtilité qui m'échappe pour l'instant...

VB:
Sub impression()

For Each ws In ActiveWorkbook.Sheets
    If ws.Name <> "Feuil1" And ws.Range("B2") <> "" Then
        ws.PrintOut copies:=1, Collate:=True, IgnorePrintAreas:=False
    End If
Next ws

End Sub

vgendron

XLDnaute Barbatruc
Bonjour
une image ne sert à rien.. on ne pourra rien faire avec..
il est préférable de poster un fichier excel sans info confidentielle (nom, adresses, mais, téléphone..)
pas besoin d'avoir ton fichier entier, juste quelques lignes suffisent pour avoir une vue claire de la structure du fichier et du type de données présentes
 

vgendron

XLDnaute Barbatruc
Je viens d'ouvrir ton fichier excel

es tu sur d'avoir mis le bon?
tu dis que les onglets tech 1 2 3 sont mis en forme mais vide..
ils sont effectivement vide, mais je ne vois pas de mise en forme non plus..?

Dans ton onglet Feuil1
je ne comprend pas ce qu'il faut "exporter" vers les onglets tech
ligne 2: il est noté qu'il s'agit d'un dossier (numéor 512 419?) pour le tech1
mais dans les lignes 3 4 5, il s'agit des tech 1 2 3..

à partir de ta feuille 1, il faudrait faire la feuille pour le tech1 à la main pour qu'on voit ce que tu souhaites comme résultat
 

Djehnsr

XLDnaute Nouveau
Navré, je pensais avoir copié les cellules, au lieu de cela j'ai incrémenté une série.

Le fichier est mis à jour dans le post d'origine.

L'objectif c'est de déplacer les lignes de chaque Technicien dans l'onglet qui lui est attitré.
Les numéros de dossier n'ont pas d'incidence, ce qui m'intéresse c'est de repérer les lignes avec le même nom de technicien et les basculer automatiquement dans son onglet.

les lignes comprenant TECH 1 dans l'onglet TECH 1, idem pour TECH 2 et 3.

Aussi, ce fichier est une ébauche, la mise en forme est optionnelle et n'apporterait rien.
Pour des raisons légales je ne peux pas partager le tableur sur lequel je vais travailler.

Je me rends compte que je n'ai pas fait un très bon travail en voulant être clair au départ !
Merci pour votre patience.
 

Djehnsr

XLDnaute Nouveau
Je viens d'essayer la commande mais j'ai une
"erreur d'exécution '9'
L'indice n'appartient pas à la sélection"

En ouvrant le débogueur, j'ai la ligne "With Sheets(TabData(i, 3)) 'avec la feuille du tech" en surbrillance.
Je suppose que c'est là que se trouve l'erreur en question.

Aussi j'aime ton idée de créer un onglet pour chaque Tech automatiquement, même si ma matrice possède déjà un onglet pour chacun d'entre eux, je pense que ça simplifiera la tâche pour mon équipe.
 

Djehnsr

XLDnaute Nouveau
Super, c'est exactement ce que je cherchais.

Serait-il possible d'adapter la recherche 'TECH*' aux noms des Techniciens ?
La colonne "Tech x" présentera Nom et Prénom de chaque technicien, ce qui complique un peu le code, quoique j'imagine que c'est de la routine pour toi.

En PJ le tableau avec des noms factices.
 

Pièces jointes

  • PREPA CDE EXCEL (1).xlsm
    22 KB · Affichages: 4

vgendron

XLDnaute Barbatruc
essaie avec ce code à la place

VB:
Sub Macro1()
Dim TabData() As Variant
Application.ScreenUpdating = False
With Sheets("Feuil1") 'on récupère tout le tableau de la feuille dans un tableau vba
    TabData = .UsedRange.Value
End With

For i = LBound(TabData, 1) + 1 To UBound(TabData, 1) 'pour chaque ligne du tableau hors ligne d'entete
    If InStr(1, TabData(i, 2), "Dossier") = 0 Then 'si la colonne B ne contient pas le mot "Dossier"
        If Not FeuilleExiste(CStr(TabData(i, 3))) Then 'si la feuille n'exite pas
            Sheets.Add after:=Sheets(Sheets.Count) 'on créé la feuille
            ActiveSheet.Name = CStr(TabData(i, 3)) 'on lui donne le nom du Tech
        End If
        If InStr(1, TabData(i, 2), "Dossier") = 0 Then 'si la colonne B ne contient pas le mot "Dossier"
            With Sheets(TabData(i, 3)) 'avec la feuille du tech
                fin = .Range("B" & .Rows.Count).End(xlUp).Row + 1 'première ligne vide en colonne B
                For j = LBound(TabData, 2) To UBound(TabData, 2) 'pour chaque colonne du tableau
                    .Cells(fin, j) = TabData(i, j) 'on colle l'info
                Next j
            End With
        End If

    End If
Next i
Application.ScreenUpdating = True
End Sub


Function FeuilleExiste(NomFeuille As String) As Boolean 'fonction qui retourne vrai ou faux selon que la feuille "NomFeuille" existe dans le classeur
FeuilleExiste = False

For Each ws In ActiveWorkbook.Sheets
    If ws.Name = NomFeuille Then
        FeuilleExiste = True
        Exit Function
    End If
Next ws
End Function
 

Djehnsr

XLDnaute Nouveau
Ca fonctionne, je rencontre juste un problème à cause de la présence de caractères spéciaux (voir en PJ) qui sont présents dans le nom de certains tech (leurs spécialisations individuelles).
Exemple: DUVAL C AT/TV/VE

Je vais voir avec mon service info si c'est modifiable, mais ta macro fonctionne, c'est excellent.

Grace à toi mon équipe va gagner du temps quotidiennement, je te remercie en son nom et clôture le thread.
 

Pièces jointes

  • Erreur 1004.png
    Erreur 1004.png
    6 KB · Affichages: 30

vgendron

XLDnaute Barbatruc
Sans changer la façon de nommer le personnel
il faut juste que le nom soit toujours: "Nom PremièrelettePrénom xxxxxxx")
avec UN espace entre le nom et la Première lettre du prénom (une seule lettre pour le prénom)

VB:
Sub Macro1()
Dim TabData() As Variant
Application.ScreenUpdating = False
With Sheets("Feuil1") 'on récupère tout le tableau de la feuille dans un tableau vba
    TabData = .UsedRange.Value
End With

For i = LBound(TabData, 1) + 1 To UBound(TabData, 1) 'pour chaque ligne du tableau hors ligne d'entete
    If InStr(1, TabData(i, 2), "Dossier") = 0 Then 'si la colonne B ne contient pas le mot "Dossier"
        NomTech = TabData(i, 3)
        NomTech = Left(NomTech, InStr(1, NomTech, " ") + 1)
       
        If Not FeuilleExiste(CStr(NomTech)) Then 'si la feuille n'exite pas
            Sheets.Add after:=Sheets(Sheets.Count) 'on créé la feuille
            ActiveSheet.Name = CStr(NomTech) 'on lui donne le nom du Tech
        End If
        If InStr(1, TabData(i, 2), "Dossier") = 0 Then 'si la colonne B ne contient pas le mot "Dossier"
            With Sheets(NomTech) 'avec la feuille du tech
                fin = .Range("B" & .Rows.Count).End(xlUp).Row + 1 'première ligne vide en colonne B
                For j = LBound(TabData, 2) To UBound(TabData, 2) 'pour chaque colonne du tableau
                    .Cells(fin, j) = TabData(i, j) 'on colle l'info
                Next j
            End With
        End If

    End If
Next i
Application.ScreenUpdating = True
End Sub


Function FeuilleExiste(NomFeuille As String) As Boolean 'fonction qui retourne vrai ou faux selon que la feuille "NomFeuille" existe dans le classeur
FeuilleExiste = False

For Each ws In ActiveWorkbook.Sheets
    If ws.Name = NomFeuille Then
        FeuilleExiste = True
        Exit Function
    End If
Next ws
End Function
 

Djehnsr

XLDnaute Nouveau
Encore une solution au problème, merci, mais j'en ai un nouveau.

J'ai créé un onglet pour chaque technicien avec comme libellé "Nom PremièrelettePrénom".
La macro déplace les lignes correspondantes dans ces onglets.
Ces onglets sont mis en page préalablement avec un tableau censé accueillir les éléments renvoyés par la macro, ainsi que des cellules colorées, ce qui fonctionne à l'heure actuelle.

Jamais nous n'aurons tous nos techniciens d'actifs le même jour, il y aura donc toujours des onglets mis en page, mais vides.

Problème, cette mise en page provoque l'impression des onglets la contenant même si aucun tech n'a de commande ce jour, autrement dit j'ai des onglets qui s'impriment malgré l'absence absolue d'éléments "écrits".

La seule solution que je vois c'est d'incorporer l'application d'une mise en page dans la macro que tu m'as envoyé, en gros créer un onglet au nom du tech, y appliquer une mise en page et déplacer les éléments.
Est-ce que c'est quelque chose qui se fait ?
 

vgendron

XLDnaute Barbatruc
Re
Tout est possible en fait
suffit de choisir la meilleure solution: soit tu imprimes uniquement les onglets qui contiennent des données, meme s'ils sont mis en forme
soit, tu appliques ta mise en forme uniquement aux onglets remplis

en fait. ca dépend de ce qui déclenche ton impression..

Tu peux aussi créer un onglet "Modèle" avec toute la mise en forme qui sera dupliqué à chaque nouveau technicien
 

Djehnsr

XLDnaute Nouveau
L'idée du modèle me plait bien étant donné que j'en ai déjà un.

Cela dit, étant donné que tous mes onglets sont déjà mis en forme à l'identique, le plus simple serait sans doute de n'imprimer que les onglets qui contiennent des données, mais si je suis là c'est parce que je n'ai pas trouvé comment faire.

Tu trouveras en PJ ma matrice adapté à ta macro avec les onglets prévus pour chaque technicien et leur mise en page commune, ça sera certainement plus clair comme ça.

Tu remarqueras le premier onglet nommé "Explo". Il a pour but d'accueillir le tableau Excel des commandes du jour et joue le rôle de base de données pour la macro. J'y ai collé une section de ce tableau.


Ca fait beaucoup de services demandés, je m'en excuse.
 

Pièces jointes

  • Matrice Explo Prepa TEST MACRO.xlsm
    210.6 KB · Affichages: 4

Statistiques des forums

Discussions
311 725
Messages
2 081 949
Membres
101 851
dernier inscrit
vaiata