IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Mise à jour Classeur1 depuis Classeur2 (2)


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    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 ?

  3. #3
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Par défaut
    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.

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    Mef (rgFind.Offset(0, 4))
    J'ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mef (rgFind.Offset(0, 4).Address)
    Et :

    J'ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mef (.Offset(0, 4).Address)
    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

  4. #4
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    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.

  5. #5
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Par défaut
    Re,

    Je n'ai pas utilisé Option Explicit.

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?


  6. #6
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    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.

Discussions similaires

  1. [XL-2007] Mise à jour Classeur1 depuis Classeur2
    Par apt dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/12/2011, 01h06
  2. Mise à jour datagridview depuis différentes fenêtres
    Par Machine Head dans le forum Windows Forms
    Réponses: 8
    Dernier message: 29/07/2009, 10h40
  3. [AC-2003] mise à jour table depuis recordset d'une requete regroupement
    Par buzz73 dans le forum VBA Access
    Réponses: 5
    Dernier message: 27/07/2009, 12h12
  4. Mise à jour table depuis autre table
    Par dual77 dans le forum Requêtes
    Réponses: 9
    Dernier message: 04/01/2007, 21h01
  5. [VB.NET 2.0] Mise à jour contrôle depuis xml
    Par nicolb dans le forum ASP.NET
    Réponses: 2
    Dernier message: 20/04/2006, 09h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo