[VBA] recopier informations

Fermé
edi - 16 juil. 2008 à 16:01
 edi - 19 juil. 2008 à 13:27
Bonjour,

Je souhaiterais, par VBA, recopier des informations de cellules d'un onglet A vers un onglet B

Dans mon onglet A
Colonne A - Colonne B - Colonne C
TARTEMPION - Prénom - Numéro
MACHIN - Prénom2 - Numéro

Dans mon onglet B
Colonne A Colonne D
Numéro
TARTEMPION Numéro
Prénom MACHIN
Prénom

L'identifiant est le numéro
Les numéros de la colonne C de l'onglet A ne sont pas triés.

Merci de votre aide.
ed

22 réponses

eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 240
17 juil. 2008 à 11:38
Bonjour,

je n'ai pas dit impossible, mais que le traitement risquait d'être long...
J'ai optimisé pour que la feuille répartition ne soit parcourue qu'une fois :
http://www.cijoint.fr/cjlink.php?file=cj200807/cijARJ821G.xls

eric
1
j ai pas trop compri la disposition de ton onglet B peux tu continuer ton exemple et separer chaque colone par des |
0
Hello Vautour,

Je m,apercois que ma question n'est pas très claire en fait.
Je recommence


Onglet A
Colonne A | Colonne B | Colonne C
NOM | Prénom | Numéro

Cet onglet comporte environ 20.000 noms. Certains ont des numéros dans la colonne C, d'autres pas.


Onglet B
Dans cet onglet, je veux disposer certains noms qui ont des numéros dans l'onglet A (colonne C non triée) dans un ordre pré-défini

Colonne B | Colonne C | Colonne D | Colonne E | Colonne F....
Numéro | Numéro | Numéro | Numéro | Numéro |....
TARTEMPION | MACHIN |(vide) | TRUCMUCHE | DUPONT
Prénom| Prénom |(vide) | Prénom | Prénom

L'identifiant est le numéro. C'est à dire que dans mon onglet B, j'ai le numéro à une place donnée et fixe.
et je voudrais ratacher à ce numéro les informations de l'onglet A.

En espérant être plus clair (pas certain... lol)
Un gros merci d'avance.
ed
0
lol donc si j ai bien compris, tu prend un nom et prenom de l onglet A qu'y n'a pas de numero et tu trouve ce numero dans l onglet B? c'est bien ca?
0
En fait, je prends le nom et le prénom de l'onglet A
en fonction du numéro qu'il a en colonne C(ongletA), je place le nom et le prénom dans l'onglet B à ll'endroit où se trouve le numéro en onglet B

Sur les 20.000 noms, j'ai environ 5.000 noms à distribuer dans l'onglet B.
Merci.
ed
0
Onglet A
Colonne A | Colonne B | Colonne C
NOM | Prénom | Numéro


Colonne B | Colonne C | Colonne D | Colonne E | Colonne F....
Numéro | Numéro | Numéro | Numéro | Numéro |....
TARTEMPION | MACHIN |(vide) | TRUCMUCHE | DUPONT
Prénom| Prénom |(vide) | Prénom | Prénom

je ve appele les onglet des feuille pour utiliser les mot correct

a=1 'remplace le 1 par le numero de la premiere ligne de la feuille A
do while worksheets("NOMFEUILLEA").cells(a,1).value <> ""
b=1 'remplace le 1 par le numero de la premiere ligne de la feuille B
do while worksheets("NOMFEUILLEB").cells(1,b).value <> worksheets("NOMFEUILLEA").cells(a,3).value
'j espere que sur ta feuille B les numero son a la ligne 1, sinon il siffu de remplacer le 1 de .cells(1,b). ci dessu par le bon numero
b=b+1
loop
'pour les nom
if worksheets("NOMFEUILLEB").cells(2,b).value = "" then
worksheets("NOMFEUILLEB").cells(2,b).value=worksheets("NOMFEUILLEA").cells(a,1).value
elseif worksheets("NOMFEUILLEB").cells(2,b).value=worksheets("NOMFEUILLEA").cells(a,1).value then
worksheets("NOMFEUILLEA").cells(a,1).interior.colorindex=4
elseif worksheets("NOMFEUILLEB").cells(2,b).value<>worksheets("NOMFEUILLEA").cells(a,1).value then
worksheets("NOMFEUILLEA").cells(a,1).interior.colorindex=3
endif
'pour les prenom
if worksheets("NOMFEUILLEB").cells(3,b).value = "" then
worksheets("NOMFEUILLEB").cells(3,b).value=worksheets("NOMFEUILLEA").cells(a,2).value
elseif worksheets("NOMFEUILLEB").cells(3,b).value=worksheets("NOMFEUILLEA").cells(a,2).value then
worksheets("NOMFEUILLEA").cells(a,2).interior.colorindex=4
elseif worksheets("NOMFEUILLEB").cells(3,b).value<>worksheets("NOMFEUILLEA").cells(a,2).value then
worksheets("NOMFEUILLEA").cells(a,2).interior.colorindex=3
endif
a=a+1
loop

pour les couleur qui von apparaitre dans la feuille A, vert = identique, rouge= pas identique, blanc = normalement copier
0
edi > vautour88
16 juil. 2008 à 18:50
Merci Vautour pour ce coup de main. Je vais tester.
cordialement
ed
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
16 juil. 2008 à 17:00
Bonjour,
En fait je veux pas me meler à la discution mais si tu mettais un exemple de fichier avec une feuille du résulat souhaiter sur ci-joint ca aiderait fortement vautour à te comprendre.
https://www.cjoint.com/
et mettre le lien dans un poste suivant... A+
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 240
16 juil. 2008 à 22:58
Bonjour,

Sans vouloir m'en meler non plus, tu parles de 5000 à 20000 noms à répartir dans des colonnes selon un numéro.
Mais dans excel 2003 tu n'as que 256 colonnes (16384 dans excel 2007)...
Va falloir être plus explicite : plusieurs noms pour le même numéro et faut les écrire en colonne ?
Les numéros sont déjà inscrits dans l'onglet B ?
Certains ont des numéros dans la colonne C, d'autres pas. Ceux qui n'en ont pas faut en faire quoi ?

eric
0
Merci pour votre intérêt.

Voici le fichier test

https://www.cjoint.com/?hqxzEjdJte

Dans l'onglet Repartition, les numéros sont déjà inscrits.
Comment insérer les données issues de l'onglet DONNEES?

Est-ce faisable?

ed
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 240
16 juil. 2008 à 23:41
Sans vouloir vexer personne, il ne ressemble pas à grand chose ton onglet Repartition...
Te rends tu compte qu'il faut balayer TOUTES les cellules pour trouver un numéro ?
Et ça 5000 à 20000 fois... Ca risque de prendre un temps énorme.

Et quand tu écris [ici Date], il faut comprendre date reconstituée avec jour-mois- année ?
Si oui, excel le stocke sous forme de nombre, j'espère que tu n'as pas de numéro qui depasse les 36000 car il risque d'y avoir des doublons avec les dates.

eric
0
Tu ne vexes personne, enfin pas moi en tous cas.
Ton avis est précieux.
Cela signifie simplement que mon idée n'est pas réalisable et c'est parfois bien de connaître les limites de ce que l'on peut faire.
J'avais dans l'idée que RECHERCHEV en vba était la solution sans savoir comment écrire ma private sub.

Merci pour le temps passé
cordialement
ed
0
Franchement Eriic, c'Est GÉ-ANT...

Un BIG BIG MERCI pour cette performance. Et pardon de ne pas avoir réagi plus tot... J'étais en déplacement.

Peux tu juste m'expliquer ce que signifie option explicit ?
Crois tu que je puisse mettre la sub en private sub?

Merci encore, vraiment j'apprécie autant d'entraide.

Cordialement
ed
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 240
18 juil. 2008 à 21:00
Bonsoir,

De rien... ;-)
Option Explicite oblige à déclarer les variables (et donc à éviter les bugs difficiles à trouver si on fait une erreur de frappe sur un nom de variable).
Tu peux mettre la macro en private bien sûr, mais fais le lien avec un bouton avant.

eric
0
Je suis en train de tester ton code sur mon big fichier.
Et au no.1001, il me dit que l'indice n'appartient pas à la sélection.
Peux tu m'expliquer aussi ce que ReDim num(1000,1) signifie?

merci
ed
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 240
18 juil. 2008 à 23:39
Ah, ben c'était prévu pour agrandir le tableau en cas de besoin justement.
Bizarre, je jette un oeil...
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 240
18 juil. 2008 à 23:46
Comprend pas, je viens de tester ça marche.
A défaut remplace ReDim num(1000, 1) par ReDim num(8000, 1) (un peu plus que ton nombre maxi de numéros en fait)

Heuuu, précise quand même à quelle ligne tu as l'erreur stp, c'est peut-être dans la 2nde partie
0
pas de probleme... ça marche sur ton exemple aussi...

Dans mon big fichier, la ligne

num(nbNum, 0) = c.Value me fait une erreur d'exe No. 9

qd je fais un pas à pas détaillé, le nbNum est à 1001.
J'ai mis 10 000 et ça bugue à 10 001...
c'est pour ça, je me demandais ce que 1000 voulait dire.

merci
ed
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 240
19 juil. 2008 à 00:22
ok, vu
rajoute ,1 à la fin de If nbNum = UBound(num) Then ReDim num(UBound(num) + 1000)
pour obtenir :
If nbNum = UBound(num) Then ReDim num(UBound(num) + 1000, 1)

J'avais oublié la 2nde dimension dans le redim...

eric
0
CHapeau-Bas!

Maintenant la macro fonctionne complètement.
Seul bémol, les infos ne s'inscrivent pas dans ma big feuille répartition.
Je regarderai cela de plus près demain et te tiendrai au courant si pb.

Encore Merci. J'aurais été incapable de trouver un tel code et j'apprends bcp.
Bonne nuit
ed
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
19 juil. 2008 à 03:18
Bonjour ,
Je pense que si le redimentionnement doit se faire il faudrait employer __ Preserve __ pour ne pas effacer les données déjà présentes.
Mais si le mot Preserve est employer faudra modifier ReDim num(1000, 1)
par
ReDim num(1,1000)
If nbNum = UBound(num , 2) Then ReDim Preserve num( 1, UBound(num , 2) + 1000)

Et adapter le code.
A+
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 240
19 juil. 2008 à 09:35
Bonjour lermite et merci,

oui, tout à fait, il faut utiliser preserve.
Et le code devient :
Sub Remplir()
    Dim c As Range, nbNum As Long, nonTrouvé As Long, i As Long
    ' recup position numéros
    Dim num()
    ReDim num(1, 1000)
    Sheets("REPARTITION").Select
    For Each c In Range([A1], [A1].SpecialCells(xlCellTypeLastCell))
        If IsNumeric(c.Value) Then
            If c.Value > 0 Then
                nbNum = nbNum + 1
                num(0, nbNum) = c.Value
                num(1, nbNum) = c.Address
                If nbNum = UBound(num) Then ReDim Preserve num(1, UBound(num) + 1000)
            End If
        End If
    Next c
    ' remplir
    Sheets("DONNEES").Select
    For Each c In Range([E2], [E65536].End(xlUp))
        i = 1
        Do Until c.Value = num(0, i) Or i > nbNum
            i = i + 1
        Loop
        If c.Value <> "" Then
            If i <= nbNum Then
                Worksheets("REPARTITION").Range(num(1, i)).Offset(2, 0) = c.Offset(0, -4)
                Worksheets("REPARTITION").Range(num(1, i)).Offset(3, 0) = c.Offset(0, -3)
                Worksheets("REPARTITION").Range(num(1, i)).Offset(4, 0) = c.Offset(0, -2)
            Else
                nonTrouvé = nonTrouvé + 1
            End If
        End If
    Next c
    i = MsgBox("Références absentes : " & nonTrouvé, vbInformation + vbOKOnly)
End Sub


Là je pense que c'est bon :-)
Bonne journée tout le monde
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
19 juil. 2008 à 09:44
Je veux pas ergoter mais je pense que la ligne.. :D
If nbNum = UBound(num) Then ReDim Preserve num(1, UBound(num) + 1000)

devrait-être..
If nbNum = UBound(num,2) Then ReDim Preserve num(1, UBound(num, 2) + 1000)
ou plus simple
If nbNum = UBound(num, 2) Then ReDim Preserve num(1, nbNum + 1000)

:D
A+
0