XL 2019 Projet Excel (VBA)

Olocsob

XLDnaute Nouveau
Bonjour à tous,
Je dois effectuer, via une feuille possédant différent libellés de facture et d'autres infos sur la même ligne, les trier et les séparer avec chaque libellé de facture différent dans une feuille. Par exemple :
  • Plusieurs Libellés A vont dans une feuille nommée Libellé A et les Libellés B vont dans une nouvelle feuille Libellé B. Cepndant en se basant sur cela, il faut que la ligne entière soit séléctionnée et transférée dans cette nouvelle feuille.
Le problème étant que je dois donc créer une macro permettant que ce soit fait de façon automatique et après plusieurs tests et recherches je ne trouve toujours pas de réponses.
Je n'arrive pas automatiser cela et le problème néanmoins important est que je ne suis pas du tout calé dans le langage VBA.

J'apprécierais grandement vos aides,
Cordialement,
 
Solution
Bonjour,
1-
Comment pourrais je faire pour sélectionner les 15 premiers et les 15 derniers caractères pour donner le nom de ma feuille.
Souvent XL et VBA utilisent les mêmes fonctions.
En XL vous feriez :
VB:
=GAUCHE(Libellé;15)&DROITE(Libellé;15)
En VBA c'est :
Code:
NomFeuille = Left(Libellé, 15) & Right(Libellé, 15)
Il y a un bug que j'ai vu en essayant ce Left Right.
A la ligne
Code:
For i = 2 To UBound(T)
mettre
For i = 1 To UBound(T)
sinon la première ligne n'est pas prise en compte.
2- L'ajustement des colonnes se fait avec :
Code:
Columns.AutoFit

Cette PJ est rectifiée sur ces trois points.

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Olocsob, et bienvenu sur XLD,
Vous comprendrez que vos explications sont pour le moins légères.
Pourriez vous fournir un fichier test avec quelques explications.
Où sont vos libellés ? Où doivent ils être dispatchés ? Quelle action doit déclencher le dispatch ? ( bouton, modification de cellule ... ) Sur quelle feuille doit on transférer ? ....
Sans cela on ne pourra pas faire grand chose de constructif. :)
 

Olocsob

XLDnaute Nouveau
Bonjour je pourrais effectivement fournir un fichier si je n'avais pas de close de confidentialité avec l'entreprise dans laquelle je travaille. Je peux tout de même fournir le code VBA.

VB:
Do          'les instructions sont exécutées jusqu'à ce que la condition devienne vraie
    If Range("F21").Value = Range("F20").Value Then
        Range("F20" & Row).Cut Range("A350" & Row)
        Range("A20").EntireRow.Delete
    Else
        Range("F20" & Row).Cut Range("A350" & Row)
        Range("A:L").Cut
        Sheets.Add After:=ActiveSheet
        ActiveSheet.xlPasteAll
        ActiveSheet.Previous.Select
    End If
If Range("F20") = Null Then Exit Do
Loop Until Range("F20") = Null
End Sub
Cependant, même ayant ce code là je n'arrive pas à faire en sorte que mes différents libellé soit listés les uns en dessous des autres. Le 350 signifie que c'est là que commence la coupage/collage de mes lignes (oui j'ai 340 lignes et quelques à traiter en tout avec ce programme).
C'est au niveau de mon premier ".cut" que je bloque car je ne trouve pas le moyen de faire en sorte qu'une fois que cette ligne (je parle de la ligne 350) a été utilisée on passe à celle d'en dessous.
De plus pour la partie "else" Comment puis-je sélectionner une plage des colonnes A à L à partir de la ligne 350 jusqu'à la ligne vide qui vient après toute cette extraction ?
Je ne sais pas si j'ai été clair mais merci de votre réponse précédente malgré tout.
 
Dernière édition:

Olocsob

XLDnaute Nouveau
Petite update ! Après avoir tenté plusieurs modifications j'ai réussi à faire tout fonctionner jusqu'au "else" mais après cela ca ne marche plus. Cela ne me crée qu'une seule nouvelle feuille alors que je devrais en avoir une dizaine et le coller dans cette nouvelle feuille ne fonctionne pas non plus. peut être que le fait d'avoir une seule nouvelle feuille vient du fait que le programme cesse de fonctionner quand il m'affiche une erreur vis-à-vis du collage qui ne fonctionne pas.
Mais il reste la question : Comment puis-je sélectionner une plage des colonnes A à L à partir de la ligne 350 jusqu'à la ligne vide qui vient après toute cette extraction ?
VB:
Do          'les instructions sont exécutées jusqu'à ce que la condition devienne vraie
    If Range("F21").Value = Range("F20").Value Then
        Range("A20:L20" & Row).Cut Range("A350:L350" & Row)
        Range("A20").EntireRow.Delete
    Else
        Range("A20:L20" & Row).Cut Range("A350:L350" & Row)
        Range("A:L").Cut
        Sheets.Add After:=ActiveSheet
        ActiveSheet.xlPasteAll
        ActiveSheet.Previous.Select
    End If
If Range("F20") = Null Then Exit Do
Loop Until Range("F20") = Null
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
fournir un fichier si je n'avais pas de close de confidentialité
De toute façon, c'est strictement interdit par le règlement XLD. ( Lien )
Un fichier test doit être un fichier représentatif du problème soulevé, mais ne contenant aucune donnée sensible, et totalement anonyme.
Ceci étant dit, votre morceau de code permet difficilement de cerner le problème. Trop succinct et hors contexte.
qu'une fois que cette ligne (je parle de la ligne 350) a été utilisée on passe à celle d'en dessous.
On obtient la première ligne vide en faisant :
VB:
DL = 1+ Range("A65500").End(xlUp).Row
Comment puis-je sélectionner une plage des colonnes A à L à partir de la ligne 350 jusqu'à la ligne vide qui vient après toute cette extraction ?
Peut être une piste au pif :
Code:
DL = 1 + Range("A65500").End(xlUp).Row
Range("A350:L" & DL).Select
Cela sélectionne de la ligne 350 à la première ligne vide à la fin.
 

Olocsob

XLDnaute Nouveau
Bonjour,

De toute façon, c'est strictement interdit par le règlement XLD. ( Lien )
Un fichier test doit être un fichier représentatif du problème soulevé, mais ne contenant aucune donnée sensible, et totalement anonyme.
Ceci étant dit, votre morceau de code permet difficilement de cerner le problème. Trop succinct et hors contexte.

On obtient la première ligne vide en faisant :
VB:
DL = 1+ Range("A65500").End(xlUp).Row

Peut être une piste au pif :
Code:
DL = 1 + Range("A65500").End(xlUp).Row
Range("A350:L" & DL).Select
Cela sélectionne de la ligne 350 à la première ligne vide à la fin.
Après des modifications importantes sur toute ma macro, Le problème du nombre de caractère se pose. Effectivement les libellés dépassant les 31 caractères, quel commande je dois insérer pour ne sélectionner que les 10 premiers et les 10 derniers caractères de ma cellule F ?
Ci joint le fichier avec mes macros et donc quel serait le paramètre à modifier pour pouvoir faire cela ? il me semble que c'est la variable i mais je n'en suis pas sûr
 

Pièces jointes

  • classeur1-1.xlsm
    27.8 KB · Affichages: 6
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir,
Qu'essayez vous de faire ?
Trier tous les libellés identiques et les ranger dans une feuille qui porte son nom ?
Et pourquoi ranger en ligne 350 ?

Et que fait on si le libellé existe déjà comme nom d'un onglet ?

Pour tronquer une chaine, c'est simple, il suffit de faire par ex :
VB:
NomOnglet = Left(Range("F20"), 31)
qui revient à prendre les 31 caractères à gauche.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Olocsob,
Un essai en PJ avec ce que j'ai compris.
Pour être rapide, il faut absolument éviter de travailler dans les cellules. Donc je passe par des tableaux, je filtre puis je restitue.
J'ai limité le nom onglet à 30 caractères. Si la feuille n'existe pas je la crée, si elle existe, je l'utilise.
VB:
Sub Transfert()
    Dim DL%, T, Tout, i%, j%, k%, IndMax, NomFeuille$, NbL%, Fin%
    Application.ScreenUpdating = False      ' Ecran figé
    DL = Range("F65500").End(xlUp).Row      ' Dernière ligne occupée
    T = Range("A20:K" & DL)                 ' On transfert lse données dans le tableau T
    Titres = Range("A19:K19").Value         ' On récupère les titres ( pour mettre dans les feuilles qui n'existent pas )
    For i = 2 To UBound(T)                  ' Pour toutes les lignes
        ReDim Tout(UBound(T), 10)           ' On redimensionne le tableau de sortie
        NbL = 0                             ' Init du pointeur du tableau de sortie
        Libellé = T(i, 6)                   ' On récupère le libellé
        If Libellé <> "" Then               ' Si non vide
            For j = 1 To UBound(T)          ' On parcourt toutes les lignes
                If T(j, 6) = Libellé Then   ' Si c'est le bon libellé
                    For k = 0 To 10         ' On tranefrt la ligne dans le tableau de sortie
                        Tout(NbL, k) = T(j, k + 1)
                    Next k
                    T(j, 6) = ""            ' On efface le libellé du tableau d'entrée car déjà traité
                    NbL = NbL + 1           ' On incrémente l'indice du tableau de sortie
                End If
            Next j
            ' Ici, la matrice Tindice contient toutes les N) de lignes correspondant à Libellé
            NomFeuille = Left(Libellé, 30)  ' On ne prend que les 30 premiers caractères car nom onglet limité à 31
            On Error Resume Next
            If IsError(Sheets(NomFeuille).Range("A1")) Then ' Si Sheets(NomFeuille).Range("A1") c'est que NomFeuille n'existe pas
                Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = NomFeuille   ' Alors on la créé
                Sheets(NomFeuille).Range("A1:K1") = Titres  ' On initialise la ligne des titres
            End If
            With Sheets(NomFeuille)         ' On transfert le tableau de sortie dans la feuille concernée
                Fin = 1 + .Range("F65500").End(xlUp).Row    ' Première ligne disponible
                .Range("A" & Fin).Resize(UBound(Tout, 1), 1 + UBound(Tout, 2)) = Tout   ' Transfert tableau
            End With
        End If
    Next i
    Sheets("Feuil1").Select                             ' On revient sur la page initiale
    Sheets("Feuil1").Range("A20:K" & DL).ClearContents  ' On l'efface
    Application.ScreenUpdating = True                   ' Ecran libéré
End Sub
 

Pièces jointes

  • Olocsob.xlsm
    28.1 KB · Affichages: 5

Olocsob

XLDnaute Nouveau
Bonjour sylvanu,
Tout fonctionne parfaitement j'ai juste eu à adapter les lignes au vrai fichier et c'est réglé. Pour savoir, sur ta ligne :
VB:
NomFeuille = Left(Libellé, 30)  ' On ne prend que les 30 premiers caractères car nom onglet limité à 31
Comment pourrais je faire pour sélectionner les 15 premiers et les 15 derniers caractères pour donner le nom de ma feuille.
Et si possible adapter la taille des colonnes d'une feuille à l'autre.
Ce sera ma dernière demande et mon problème sera entièrement résolu.
Après cela tout sera bon et tu m'auras été d'une grande aide pour trouver une solution à mon problème. Encore merci beaucoup.
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
1-
Comment pourrais je faire pour sélectionner les 15 premiers et les 15 derniers caractères pour donner le nom de ma feuille.
Souvent XL et VBA utilisent les mêmes fonctions.
En XL vous feriez :
VB:
=GAUCHE(Libellé;15)&DROITE(Libellé;15)
En VBA c'est :
Code:
NomFeuille = Left(Libellé, 15) & Right(Libellé, 15)
Il y a un bug que j'ai vu en essayant ce Left Right.
A la ligne
Code:
For i = 2 To UBound(T)
mettre
For i = 1 To UBound(T)
sinon la première ligne n'est pas prise en compte.
2- L'ajustement des colonnes se fait avec :
Code:
Columns.AutoFit

Cette PJ est rectifiée sur ces trois points.
 

Pièces jointes

  • Olocsob2.xlsm
    28.5 KB · Affichages: 4

Olocsob

XLDnaute Nouveau
Bonjour sylvanu, Le programme fonctionne parfaitement et j'ai pu compiler mes différentes macros en une seule sans encombre !!! Ce projet est donc en bonne voie et je ne vous remercierais jamais assez pour l'aide incroyable que vous avez réussi à m'apporter.
 

Discussions similaires

Réponses
25
Affichages
603
Réponses
4
Affichages
168