Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/12/2011, 00h06   #1
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Par défaut Mise à jour Classeur1 depuis Classeur2 (2)

Bonjour à tous,

Pour mettre à jour le classeur1 depuis le classeur2, j’utilise le code suivant :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
Sub maj()
    Dim wsCible As Worksheet
    Dim wbSource As Workbook
    Dim wsSource As Worksheet
    Dim nbVal, Pfx, i As Integer
    Dim tmpVal() As Variant
    Dim lastRow As Integer
    Dim rg As Range
    Dim rgFind As Range
 
 
    Set wsCible = ThisWorkbook.Worksheets("BD")
    Set wbSource = Application.Workbooks("Class2.xls")
 
    nbVal = 0
    ReDim tmpVal(5, 0)
 
    '--------------Récupération des données
    For Each wsSource In wbSource.Worksheets
        lastRow = wsSource.Range("B65000").End(xlUp).Row
        For i = 2 To lastRow
            If wsSource.Cells(i, "F").Value <> "" And IsNumeric(wsSource.Cells(i, "F").Value) Then
                nbVal = nbVal + 1
                ReDim Preserve tmpVal(5, nbVal - 1)
 
                tmpVal(0, nbVal - 1) = wsSource.Name & wsSource.Cells(i, "A").Value
                tmpVal(1, nbVal - 1) = Format(wsSource.Cells(i, "B").Value, "0##"" ""##"" ""##"" ""##")
                tmpVal(2, nbVal - 1) = wsSource.Cells(i, "C").Value
                tmpVal(3, nbVal - 1) = wsSource.Cells(i, "D").Value
                tmpVal(4, nbVal - 1) = wsSource.Cells(i, "E").Value
                tmpVal(5, nbVal - 1) = wsSource.Cells(i, "F").Value
 
 
            End If
        Next i
    Next wsSource
 
    '----------Remplissage du tableau
    Set rg = wsCible.Range(wsCible.Range("A2"), wsCible.Range("A65000").End(xlUp))
 
    For i = 1 To nbVal
 
        Set rgFind = rg.Find(What:=tmpVal(1, i - 1), LookIn:=xlValues, LookAt:=xlPart)
 
        If Not rgFind Is Nothing Then
            rgFind.Offset(0, 4).Value = tmpVal(0, i - 1)
            '--- mettre en forme
            Mef (rgFind.Offset(0, 4))
            '--- fin forme
 
            rgFind.Offset(0, 5).Value = tmpVal(2, i - 1)
        Else
            derlg = [A65000].End(xlUp).Row
 
 
 
            With Range("A" & derlg + 1)
                .Value = tmpVal(1, i - 1)    '--------------- N
                .Offset(0, 1).Value = tmpVal(2, i - 1)    '-- Tr
                .Offset(0, 2).Value = tmpVal(3, i - 1)    '-- Pr
                .Offset(0, 3).Value = tmpVal(4, i - 1)    '-- L3
                .Offset(0, 4).Value = tmpVal(0, i - 1)    '-- AD
                Mef (.Offset(0, 4))
                .Offset(0, 5).Value = tmpVal(5, i - 1)    '-- Pt
 
            End With
 
 
        End If
    Next i
 
End Sub
Procédure Mef :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub Mef(AD As Range)
 
 
    Select Case True
 
    Case LCase(AD.Value) Like "ee*"
        AD.Value = "1ee1"
        AD.Font.ColorIndex = 3
 
    Case LCase(AD.Value) Like "ss*"
        AD.Value = "1ss1"
        AD.Font.ColorIndex = 25
 
    Case LCase(AD.Value) Like "pp*"
        AD.Value = "6pp2"
        AD.Font.ColorIndex = 43
    End Select
    AD.Font.Bold = True
    AD.Value = Application.Proper(AD.Value)
End Sub
Mais voila j’ai deux problèmes :

1 – Le tableau tmpVal contiendra des données qui ne seront pas utilisées lors de la recherche et mise à jour si le numéro N est trouvé dans le classeur1.

Alors y a t-il une solution plus léger de façon à ne ramener une ligne complète du classeur2 (Ax :Fx) que si la recherche dans le classeur1 à échouer ?

2 – La mise en forme (Procédure Mfe) ne marche pas. Ou est donc l’erreur ?

Merci.
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 09h03   #2
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Select ne s'utilise pas comme ça, regarde dans la doc.

Je me penche sur ton autre souci, car ton code me dit quelque chose

Toutes mes excuses, je n'utilisais jamais select de cette façon c'est tout, le problème n'est pas là. Quand tu dis que ça ne marche pas, ça ne compile pas, ça plante ou ça ne fait rien ?

Pour ton premier souci, en fait je ne comprends pas ce que tu veux, pourrais-tu préciser ?
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 11h09   #3
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Bonjour ZebreLoup,

Citation:
Envoyé par ZebreLoup Voir le message
Select ne s'utilise pas comme ça, regarde dans la doc.
C'est un exemple que j'ai trouvé sur le net et je l'ai modifié pour mon besoin.

Citation:
Je me penche sur ton autre souci, car ton code me dit quelque chose
C'est tout à fait normal, parce que c'est ton propre code

Citation:
Envoyé par ZebreLoup Voir le message
Toutes mes excuses, je n'utilisais jamais select de cette façon c'est tout, le problème n'est pas là. Quand tu dis que ça ne marche pas, ça ne compile pas, ça plante ou ça ne fait rien ?
Ca plante dans l'appel de la procédure Mef.

J'ai réglé le problème, mais je ne sais pas s'il y a mieux.

A la place de :

Code :
Mef (rgFind.Offset(0, 4))
J'ai mis :

Code :
Mef (rgFind.Offset(0, 4).Address)
Et :

J'ai mis :

Code :
Mef (.Offset(0, 4).Address)
Citation:
Pour ton premier souci, en fait je ne comprends pas ce que tu veux, pourrais-tu préciser ?
En remplissant le tableau temporaire tmpVal depuis le deuxième classeur2, je me trouve dans l'obligeance de récupérer toutes la ligne (Ax:Fx) de chaque valeur numérique trouvée.

Ensuite en mettant à jour le classeur1, je n'insère une ligne complète (6 valeurs) que si le numéro recherché est introuvable sinon en cas contraire je m'en sers seulement de deux valeurs pour les insérer dans la colonne E et F.

Y a-t-il une solution pour que les 6 valeurs ne seront extraites du classeur2 que si on aura besoin (le cas ou la recherche n'a pas aboutie) ?

J'espère avoir un peu bien exposé mon problème
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 15h07   #4
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Je suis assez étonné pour MEF. La procédure attends bien un Range pourtant, c'est avec le .Address que ça ne devrait pas marcher. Essaie sans les parenthèses pour voir (normalement, on met les parenthèses quand on utilise une fonction et qu'on attribue le résultat à une valeur), mais je doute que ce soit ça. Tu as bien mis Option Explicit en haut du module pour avoir une alerte sur les problème de type à la compilation ?

Pour ton problème de prendre trop de valeurs, on pourrait bien sûr adapter pour faire le test avant de récupérer les valeurs, d'ailleurs le passage par la table temporaire n'était pas obligatoire du tout. Mais quel est le problème exactement ? Car si c'est un problème de rapidité, ce n'est pas ça qui va le résoudre.
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 15h40   #5
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Re,

Je n'ai pas utilisé Option Explicit.

Et j'ai enlevé les parenthèses et ça marche aussi :

Code :
Mef rgFind.Offset(0, 4)
Si on a des longes données à ramener du classeur2, peut être qu'on rencontrera un problème de rapidité.

Et puis pourquoi amène-t-on des données qu'on utilisera plus ?

apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 16h09   #6
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Pense bien à toujours mettre Option Explicit au début de tes modules. En fait ça t'oblige à déclarer toutes tes variables. Ça peut paraître contraignant, mais ça va t'éviter de nombreux problèmes dus à des fautes de frappe ou autre.

S'il y a un très grand nombre de données, c'est plutôt le Find qui va ralentir le code. Et aussi l'accès à la feuille.
Pour le premier point, on pourrait travailler avec un dictionnaire dans lequel on aurait les valeurs de la colonne A de feuille 1 comme clé et le numéro de la ligne comme valeur.
Pour le deuxième point, plutôt que de travailler sur la feuille 2, on pourrait dès le début du code mettre toutes les valeurs dans un Variant.

Mais clairement, si le nombre de données devient très important, je te conseillerais plutôt de passer par une base de données, qui correspondra beaucoup plus à ta problématique.
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 17h45   #7
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Re,

Puis-je voir cette solution ?
Fichiers attachés
Type de fichier : zip classeurs.zip (25,1 Ko, 1 affichages)
apt est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 24/12/2011, 12h04   #8
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Base de données ou l'autre ?

Par contre, pour ma part, désolé, ce ne sera pas avant l'année prochaine maintenant...
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2011, 17h53   #9
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Base de données, parce que la fonction Mef marche maintenant.

Et bonne fin d'année 2011, et meilleures vœux pour le nouvel an 2012.

apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h39.


 
 
 
 
Partenaires

Hébergement Web