Copie de lignes excel -->Feuille excel avec tests

DEBRAY JEROME

Nouveau membre
Bonjour à toutes & à tous,
Je suis nouveau sur ce forum et c'est avec grand plaisir que je post mon premier sujet.
Pour rentrer dans le vif du sujet:
J'ai un fichier excel qui comporte pour le moment 2 feuilles nommées: liste (Feuille 1) et HP (Feuille 2).
Feuille1:
cette feuille contient une liste de travaux à effectuer par des intervenants différents.
Colonne A: initiales des intervenants
Colonne B: Date de la demande
Colonne C: Machine
Colonne D: Nature de la tacheColonne
Colonnes E,F,G,H: ces colonnes servent à voir l'avancement (elles sont "coloriées" par le resp.maintenance au fur & à mesure de l'avancement).

Feuille2:
Elles sert de feuille de destination pour les taches d'une personne. Cette feuille est renommée aux initailes de l'intervenant manuellement.


Objectif:
J'ai commencer à créer un code vba (je débute donc pas facile malgré toutes les lectures.......) qui me permet de tester la valeur de la colonne A et, si celle ci est égale à mon test, je la copie puis la recopie dans la feuille 2.
Quand mon code sera OK pour cette page, je vais devoir l'appliquer pour tous les intervenants afin de pouvoir éditer en début de semaines les taches et suivre ainsi l'avacement de mes techniciens.

Problemes: lors de la recopie sur la feuille 2, j'ai des lignes blanches qui s'insèrent entre les lignes recopiées (je suis sur que c'est normal vu mon code mais je ne sais pas comment faire commencer la recopie de mes lignes apres la derniere ligne écrite....)
De plus, je n'arrive pas à faire recopier les couleurs de mes cases E,F,G,H donc pas d'avancement. :cry:


Voici mon code:
------------------------------------------------------------------------------------------------------------------------------
Sub MAIN()

Dim i As Double
Dim Rw As Range

For i = 1 To 65536
'TEST TACHES HP
If Worksheets("Liste").Cells(i, 1).Value = "HP" Then

Range("A" & i & ":H" & i).Copy
Worksheets("HP").Range("A" & i & ":D" & i).Value = Worksheets("Liste").Range("A" & i & ":D" & i).Value
Worksheets("HP").Range("A" & i & ":H" & i).Interior.ColorIndex = Worksheets("Liste").Range("E" & i & ":H" & i).Interior.ColorIndex
End If

Next i

End Sub
-------------------------------------------------------------------------------------------------

PS: J'ai déja essayé de reprendre certains codes qui étaint sur ce forum mais sans résultats.

Pourriez vous m'aider??
Je ne demande pas que l'on m'écrive le code, je cherche plutot à comprendre.
Je vous remercie par avance.
Jerome DEBRAY
 

chonos

Helper
Jérôme,

bon c'est la 1er fois on vas pas geuler, mais peut tu utilise le bouton pour le code quand tu copie un bout de code (merci)

pour ce qui est de ton projet :

il y a une chose que je ne comprend pas !
pourquoi ne pas utilise une feuille par intervenants et ne recopier que les elements dont tu as besoins !
je te dit cela car j'ai fait quelque chose de similaire pour le suivie des inter par les prestataire de service sur les moyens d'édition /impression en fonction de la marque et du model !
une fiche par marque dans mon cas qui dans le tien serai une personne !
a+
 

DEBRAY JEROME

Nouveau membre
Bonjpour Chronos,
OK pour l bouton code, je viens de le trouver mais pas facile quand tu écris ton premier message.
Concernant ta réponse:
Je vais moi ausii faire une feuille par intervenants mais je ne te suis pas, comment fais tu l'attribution des taches par page?
Pour ma part, je souhaite utiliser un peu les macros--> 2 raisons:
1-J'apprends en meme temps que je "programme" (si on peut parler de programation.....)
2-C'est une demande d'un collègue qui veut lui aussi apprendre les macros.

[cpp]
Sub MAIN()

Dim i As Double
Dim Rw As Range

For i = 1 To 65536
'TEST TACHES HP
If Worksheets("Liste" ).Cells(i, 1).Value = "HP" Then

Range("A" & i & ":H" & i).Copy
Worksheets("HP" ).Range("A" & i & ":D" & i).Value = Worksheets("Liste" ).Range("A" & i & ":D" & i).Value
Worksheets("HP" ).Range("A" & i & ":H" & i).Interior.ColorIndex = Worksheets("Liste" ).Range("E" & i & ":H" & i).Interior.ColorIndex
End If

Next i

End Sub
[/cpp]

Donc voila
Est ce que quelqu'un peux m'aider...............
Merci d'avance
Jerome DEBRAY
 

chonos

Helper
j'ai fait une feuille de saissie ou je tape les infos dans les 1ers colones
dans cette même feuille j'ai une table en type bouléen :

Marque : model : date : ....... test1 ; test 2 ; test3
HP truc 27/07/2010

dans test1 (j'ai un test "si A1 est = "HP" alors test1 =1 si non =0

dans test2 (j'ai un test "si A1 est = " Zebra"alors test1 =1 si non =0
puis j'ai crée une fiche "HP" ;"zebra"......
et depuis cette fiche par marque je reprend les info que j'ai besoin pour les présenter comme je veus pour une impression !
a+

 

DEBRAY JEROME

Nouveau membre
OK pour cette solution mais le probleme c'est que cela va me laisser les espaces en blanc et je vais devoir aller sélectionner via un filtres, toutes les fiches de mes techniciens pour ensuite les imprimer.....
plutot long comme démarche sachant que j'ai qq technciens.....
C'est pour cela que je m'oriente vers une macro. et pour apprendre en plus donc double avantag
Mais merci encore pour ton aide
Cdlt,
J.DEBRAY
 

chonos

Helper
J'ai une autre solution a te proposé :

tu crée une 3ème fiche la strict copie de ta 1ère fiche


tu definie que l'une des fiches soit une destination de la sélection cette selection est ensuite mis dans la feuille2 puis imprimer je suppose

ta selection est egale a ton filtre !


puis tu cree une icone/bouton et y colle cela (c'est copie colle des zone )

[cpp]Sub Macro1()


'
Range("A2:H2").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Feuil1").Select
Range("A2").Select
ActiveSheet.Paste
ActiveSheet.Paste
Application.CutCopyMode = False
End Sub[/cpp]


 

chonos

Helper


C'est l'élément qui manque sur se Forum !
la possibilité de faire des échange de fichier !
 

chonos

Helper
juste pour info ce n'est pas excel qui conveint le mieux pour cela !

le mieux pour cela c'est une base de donnée car tu as beaucoup plus de choix !
mais je comprend que excel soit utilisé pour une petit base !
 

DEBRAY JEROME

Nouveau membre
Je suis OK avec cela mais je n'ai pas le droit (entreprise) d'avoir access!!
Donc je dois passer par Excel.
Je suis sur que cela est possible mais je n'arrive pas à le faire et je ne peux pas pas passer de fichier......c'est dur dur :cry:
 

chonos

Helper
on serais pas dans la même Ets !
nous non plus pas de access ! (mais je suis le seul qui a désobéi !) pour une bonne raison !
 

DEBRAY JEROME

Nouveau membre
Peut etre....moi aussi j'ai désobéi mais mon collègue ne l'a pas Access!!!!!

Mais cela ne resoud pas moin pb....il faut que je trouve
A l'aide..........svp
 

DEBRAY JEROME

Nouveau membre
J'ai essayé avec Access mais pas d'avenir pour moi car pas les autorisations!!!!
J'essaie de complèter mon code mais en vain.
Le voici au cas ou une personne veux bien m'aider.

[cpp]

Sub MAIN()

Dim i As Double
Dim n As Integer

Dim Rw As Range

For i = 1 To 65536
'TEST TACHES HP

If Worksheets("Liste").Cells(i, 1).Value = "HP" Then

Range("A" & i & ":H" & i).Copy

Worksheets("HP").Activate

Do While Not IsEmpty(Sheets("HP").Cells(n, 2))
n = n + 1
Loop

Worksheets("HP").Range("A" & n & ":D" & n).Value = Worksheets("Liste").Range("A" & i & ":D" & i).Value
'Worksheets("HP").Range("A" & n & ":H" & n).Interior.ColorIndex = Worksheets("Liste").Range("E" & i & ":H" & i).Interior.ColorIndex
End If


Next i

End Sub
[/cpp]


merci à vous
 

zeb

Modérateur
Salut,

Ce sont les vacances, mais comme je passais par là... ;)

Rhooooo, Solaris, comment oses-tu proposer de pourrir le presse-papier de l'utilisateur !
Dans une macro bien faite, point de copy/paste, ni de select/activate.

Jérôme, passons ton code en revue.
i doit contenir des numéros de lignes. Il faut donc définir un entier, pas un réel. Par ailleurs, integer ne dépasse pas 32768, alors qu'une feuille possède 65536 lignes. Un integer ne convient effectivement pas. Le type qui convient est l'entier long.
Tu définis Rw pour rien, car tu ne l'utilises pas.
Ligne 13, tu remplis le presse-papier, mais tu ne t'en sers pas. En plus tu ne précises pas la feuille en question !
Pourquoi activer la feuille, ligne 15 ?
Attention, ligne 17 tu utilises n alors que sa valeur n'a pas été définie. Reste cohérent et utilise Worksheets plutôt que Sheets.
Indente correctement ton code, il sera plus lisible et tu n'auras pas besoin de mettre de valeur de rappel après tes Next.

Ça fait :
Code:
Sub MAIN()
    Dim i As Long
    Dim n As Long

    n = 1
    For i = 1 To 65536
        ' // TEST TACHES HP
        If Worksheets("Liste" ).Cells(i, 1).Value = "HP" Then
            Do While Not IsEmpty(Sheets("HP" ).Cells(n, 2))
                n = n + 1
            Loop
            Worksheets("HP" ).Range("A" & n & ":D" & n).Value = Worksheets("Liste" ).Range("A" & i & ":D" & i).Value
        End If
    Next
End Sub

Sinon, c'est pas mal. par contre, c'est un peu lourd comme écriture. Mais comme il y a deux feuilles distinctes, on est bien obligé. Pour alléger tout ça, on peut utiliser des variables. Soit f_HP et f_Lst les feuilles Hp et Liste :

Code:
Sub MAIN()
    Dim i As Long
    Dim n As Long
    Dim f_HP  As Worksheet
    Dim f_Lst As Worksheet

    sset f_HP  = Worksheets("HP" )
    Set f_Lst = Worksheets("Liste" )

    n = 1
    For i = 1 To 65536
        ' // TEST TACHES HP
        If f_Lste.Cells(i, 1).Value = "HP" Then
            Do While Not IsEmpty(f_HP.Cells(n, 2))
                n = n + 1
            Loop
            f_HP.Range("A" & n & ":D" & n).Value = f_Lst.Range("A" & i & ":D" & i).Value
        End If
    Next
End Sub

Les adresses Range sont difficiles à écrire (pas trop en fait ;) ) et à lire (surtout pour la macro). Donc, on va les proscrire et préférer la fonction Cells. Or Range("Xm:Yn") équivaut quand même à Range(Cells(m, x), Cells(n, y)). Difficile de croire que c'est plus efficace ! Mais tu travailles sur les deux tiers d'une centaine de milliers de lignes.

Code:
Sub MAIN()
    Dim i As Long
    Dim n As Long
    Dim f_HP  As Worksheet
    Dim f_Lst As Worksheet

    Set f_HP  = Worksheets("HP" )
    Set f_Lst = Worksheets("Liste" )

    n = 1
    For i = 1 To 65536
        ' // TEST TACHES HP
        If f_Lst.Cells(i, 1).Value = "HP" Then
            Do While Not IsEmpty(f_HP.Cells(n, 2))
                n = n + 1
            Loop
            f_HP.Range(f_HP.Cells(n, 1), f_HP.Cells(n, 4)).Value = f_Lst.Range(f_Lst.Cells(i, 1), f_Lst.Cells(i, 4)).Value
        End If
    Next
End Sub

Ça, c'est pour reprendre ton code. Maintenant, voilà ce que je te propose, dis-moi si c'est clair :
Code:
Dim f_hp  As Worksheet
Dim f_ls As Worksheet
Dim c_hp As Range
Dim c_ls As Range
dim i    As integer

Set f_hp = Worksheets("HP" )
Set f_ls = Worksheets("Liste" )

Set c_hp = f_hp.Cells(65536, 1).End(xlUp)
If c_hp.Value <> "" Then Set c_hp = c_hp.Offset(1)

For Each c_ls In f_ls.Range(f_ls.Cells(1,1), f_ls.Cells(65536, 1).End(xlUp))
    If c_ls.Value = "HP" Then
        For i = 0 To 3
            c_hp.Offset(0, i).Value = c_ls.Offset(0, i).Value
            c_hp.Offset(0, i).Interior.ColorIndex = c_ls.Offset(0, i).Interior.ColorIndex
        Next
    End If
Next
 

chonos

Helper
Zeb tu es en vacance et bien moi non l'ans passé oui et la règle qui c'est imposer a moi c'est une fois tout les 9-10 ans un peut de vacances !

 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 058
Membres
1 586 285
Dernier membre
LeFront
Partager cette page
Haut