Test Macro Excel - gestion de taches

Bonjour à toutes et à tous,

Je souhaite mettre en place une macro sur VBA pour organiser mon fichier de gestion de tâches (en PJ une version simplifiée). Votre coup de pouce sur la question sera grave appreciable. J'aimerai déjà savoir la possibilité de pouvoir créer une telle macro.

L'idée est la suivante :

Sur une feuille Excel du type (celui de dessus), je souhaiterais sélectionner tout le contenu à partir de la ligne 2 (A2 y compris) et le copier dans la cellule A2. Ensuite, je souhaiterais faire une recherche sur les mots ou groupes de mots "A faire" "En cours" "Terminé" pour renvoyer sur la ligne suivante chaque fois après l'apparition de l'un de ces mots tout le contenu dans la 1ère cellule de la ligne suivante et ainsi de suite pour continuer la boucle jusqu'à la fin.

Exemple 1

Initialement :

Ligne 2 (cellule A2) travailler sur

Ligne 3 (A3) Excel VBA

Ligne 4 (A4) en cours,

Ligne 5 (A5 => vide)

Ligne 6 (A6) travailler sur

Ligne 7 (A7 => vide)

Ligne 8 (A8) SAP à faire,

Ligne 9 (A9) travailler

Ligne 10 (A10 => vide)

Ligne 11 (A11) sur MySQL terminé,

Ligne 12 (A12) travailler sur MCD

Ligne 13 terminé,

(ainsi de suite jusqu'à la ligne n )

Résultat attendu 1 :

Ligne 2 (cellule A2) travailler sur Excel VBA en cours, travailler sur SAP à faire, travailler sur MySQL terminé, travailler MCD terminé, (ainsi de suite)

Exemple 2 :

Initialement :

Ligne 2 (cellule A2) travailler sur Excel VBA en cours, travailler sur SAP à faire, travailler sur MySQL terminé, travailler MCD terminé, (ainsi de suite...)

Résultat attendu 2 :

Ligne 2 (cellule A2) travailler sur Excel VBA en cours,

Ligne 3 (A3) travailler sur SAP à faire,

Ligne 4 (A4) travailler sur MySQL terminé,

Ligne 5 (A5) travailler sur MCD terminé,

(ainsi de suite jusqu'à la ligne n)

Hello,

Pour le premier exemple :

Sub Premier_Resultat()

Dim L_Ligne As Long
Dim Col_Taches As Byte, Row_ET As Byte
Dim Rg_Res As Range
Dim Resultat_txt As String, La_Tache As String
Dim i As Long

Col_Taches = 1
Row_ET = 1
L_Ligne = Sheets(1).Cells(Rows.Count, Col_Taches).End(xlUp).Row

Set Rg_Res = Sheets(2).Range("A3")

With Sheets(1)
    For i = Row_ET + 1 To L_Ligne
        La_Tache = .Cells(i, Col_Taches)
        Select Case La_Tache
            Case Is <> ""
                Resultat_txt = Resultat_txt & La_Tache & " "
        End Select
    Next i
End With

Rg_Res = Resultat_txt

Set Rg_Res = Nothing

End Sub

En revanche le deuxieme est + compliqué.

Si tu ne veux pas a avoir une usine à gaz à monter,

soit tu mets un délimiteur à la fin de chaque mots ou groupes (travailler; excel vba;)

soit tu fais une table de correspondance avec une colonne où tu indiques toutes les taches, une autre tous les outils ...

Slt Rag02700,

Merci pour le premier résultat.

J'aurais aimé mettre le résultat directement sur la feuille 1 (la feuille 2 et 4 c'était juste pour montrer l'exemple).

En gros, Set Rg_Res = Sheets(1).Range("A2") mais si je fais ça, les lignes restantes de la feuille 1 doivent être nettoyé (comment faire du coup?).

Pour le résultat 2 justement, je pensais au séparateur virgule (mais le problème c'est si j'ai d'autres virgules qui se glisse dans le texte ça peut être compliqué). J'aimerais bien voir comment tu procèderais toi selon cette logique.

Pour la table de correspondance, ce n'est pas envisageable je pense parce que l'idée c'est d'avoir un nombre de colonne (illimité, non figé, différent selon les besoin donc pas uniquement taches ou outils )

Merci d'avance du retour !

Hello,

En gros, Set Rg_Res = Sheets(1).Range("A2") mais si je fais ça, les lignes restantes de la feuille 1 doivent être nettoyé (comment faire du coup?).

tu peux utiliser la méthode :

.ClearContents
Sheets(1).Range("A3:XX5000").ClearContents
Rg_Res = Resultat_txt

Pour le résultat 2 justement, je pensais au séparateur virgule (mais le problème c'est si j'ai d'autres virgules qui se glisse dans le texte ça peut être compliqué). J'aimerais bien voir comment tu procèderais toi selon cette logique.

En utiliser une autre , le point virgule par exemple.

Si tu tiens à garder la virgule, une solution de contournement serait de mettre 2 virgules les unes à la suite

Yes c'est good pour le 1er résultat, je vais pouvoir l'adapter au fichier original bcp plus volumineux, merci !

Sinon t'aurais un pattern pour le 2ème résultat. Si je décidais de prendre comme séparateur le ; dois-je passer par un text to column (auquel Cason fait comment pour le renvoi à la ligne inférieure) ou bien ce serait quoi ?

C'est quoi un pattern pour toi ? un exemple ?

Oui exactement, parce qu'en gros si tu veux le fichier brut que je traite, il ressemble pas du tout à ça?

Hello,

Voici un code qui fait la visu souhaitée selon ton fichier, en ajoutant le ; comment séparateur de cellule

Sub Split_txt()

Dim Tab_Split, Valeur
Dim rg_Data As Range
Dim Data_split As String, separateur As String
Dim nb_col As Integer, i As Integer
Dim First_Col_Resti As Integer, First_Ligne_Resti As Integer

Set rg_Data = Sheets(5).Range("A2") 'Cellule contenant les données

Data_split = rg_Data.Value 'Récupération des valeurs
separateur = ";" 'Def du séparateur
nb_col = 3 'Nombre de colonne de restitution ==> 3 pour taches/outils/statuts
First_Col_Resti = 1 'Premiere colonne de restitution
First_Ligne_Resti = 5 'Premiere ligne de restitution

Tab_Split = Split(Data_split, separateur) 'Dissocie les data en fonction du separateur

i = First_Col_Resti
y = First_Ligne_Resti
For Each Valeur In Tab_Split 'Boucle sur toutes les valeurs
    If i > nb_col Then 'Gestion de la colonne de restitution + la ligne de restitution
        i = 1
        y = y + 1
    End If
    Cells(y, i).Value = Valeur 'Affectation de la valeur
    i = i + 1 'Colonne suivante
Next Valeur 'Valeur suivante

End Sub

Le code marche super. Merci mais c'est un peu embêtant que t'aies pas tout le contexte. Ici dans la logique le renvoi à la ligne se fait après les 3 colonnes mais cette logique ne peut pas être appliqué si c'est aléatoire comme dans mon fichier brut.

Tu penses qu'il est possible plutôt de partir sur une double logique de séparation du genre "," pour les colonnes et ";" pour le renvoi à la ligne. je pense que celle-ci peut être plus adaptée.

Dans ton fichier tu as quand même un nombre de colonnes définies en ligne 1 ? (Taches/outil/statuts)

Si tu suis cette logique c'est à dire aujourd'hui c'est 3, demain c'est 40 tu peux adapter comme ceci

nb_col = sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column

Astucieux, j'étais entrain de tester pour voir et on va dire que ça règle le problème du nb de colonnes mais pas de leurs valeurs. Il reste un petit problème qui est celui des champs vides. Il peut pas y en avoir et ça, ça fausse l'emplacement des contenus comme ci-dessous (j'ai rajouté 2 autres colonnes en prenant le soin de pas vouloir remplir certaines cellules)

capture d ecran 2021 06 01 a 23 22 58

VS le résultat attendu ci-dessous

capture d ecran 2021 06 01 a 23 26 47

voir nveau fichier xls

Ah ah une autre astuce pour contourner les vides, tu peux mettre un espace entre 2 ; comme ça "; ;"

Je note celle-ci aussi dans ma besace. Mais j'ai peur que ça soit une usine à gaz parce qu'il y a trop d'utilisateurs et chacun peut créer des colonnes supplémentaires. Je tente dans la semaine et je vois ce que ça donne mais je pense qu'il faut que je puisse distinguer 2 séparateurs selon les deux conditions cellules suivantes ou lignes suivantes.

J'ai testé la macro avec un fichier beaucoup plus étoffé et des colonnes qui sont vides pour certaines lignes. Tu penses que l'on pourrait envisager une macro avec une logique en cascade avec ";" pour faire le renvoi à la ligne après chaque ";" et faire pour le séparateur "," un renvoi sur la cellule suivante?

Je pense que c'est faisable.

Tu saurais faire ?

Nan pas du tout justementet aucun semblant de debut d'idée

Je crois qu'on est bon

Sub Split_txt()

Dim Tab_Split_Ligne, Valeur_Ligne, Tab_Split_Colonne, Valeur_Colonne
Dim rg_Data As Range
Dim Data_split As String, separateur_Colonne As String, separateur_Ligne As String
Dim i As Long, nb_col As Integer, y as Long
Dim First_Col_Resti As Integer, First_Ligne_Resti As Integer

Set rg_Data = Sheets(1).Range("A2") 'Cellule contenant les données

Data_split = rg_Data.Value 'Récupération des valeurs
separateur_Colonne = "," 'Def du séparateur colonne
separateur_Ligne = ";" 'Def du séparateur Ligne
Tab_Split_Ligne = Split(Data_split, separateur_Ligne) 'Dissocie les data en fonction du separateur

First_Col_Resti = 1 'Premiere colonne de restitution
First_Ligne_Resti = 5 'Premiere ligne de restitution
nb_col = Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column 'Nombre de colonne de restitution ==> 3 pour taches/outils/statuts

i = First_Col_Resti
y = First_Ligne_Resti
For Each Valeur_Ligne In Tab_Split_Ligne 'Boucle sur toutes les valeurs d'un ligne
    Tab_Split_Colonne = Split(Valeur_Ligne, separateur_Colonne) 'Dissocie les data en fonction du separateur
    For Each Valeur_Colonne In Tab_Split_Colonne
        If i > nb_col Then 'Gestion de la colonne de restitution + la ligne de restitution
            i = 1
            y = y + 1
        End If
        Cells(y, i).Value = Valeur_Colonne 'Affectation de la valeur
        i = i + 1 'Colonne suivante
    Next Valeur_Colonne
Next Valeur_Ligne

Set rg_Data = Nothing

End Sub

Ah, ça marche pas très bien on dirait

capture d ecran 2021 06 04 a 20 15 33

Tu veux que à partir du moment ou tu as un ; alors on change de ligne ?

Si tu as "toto,tata;tutu;" alors 2 lignes ==> ligne 1 = toto tata / ligne 2 = tutu

Si tu as 50 colonnes derrière elles restent vides ?

oui un peu dans cette idée

en gros si j'ai toto, tata; tutu; tete

ça va être toto (A1 par exemple), tata (B1),

tutu (A2)

tete (A3)

Rechercher des sujets similaires à "test macro gestion taches"