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 :

Fonction indirect.ext problème


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Par défaut Fonction indirect.ext problème
    Bonjour,
    Mon problème est le suivant : j'ai 2 classeurs " appel d'offres" et "articles"
    Je souhaite pouvoir extraire du classeur articles (notre base de données articles) le poids des articles. Cette variable est à multiplier par la quantité contenu dans appels d'offres) pour obtenir le poids des engagements contenu dans le classeur appel d'offres). D'une part je souhaite utiliser une variable externe variable et d'une part je voudrais pouvoir utiliser une boucle ( do loop) sur celle-ci pour pouvoir comparer la désignation de l'article dans les deux classeurs arreter la boucle quand il trouve des valeurs égales, utiliser la variable poids qui est juste à coté de la désignation de l'article (dans la base article) et la multiplier par la quantité dans le classeur appels d'offres.

    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
    d=2
    Do
    d = d + 1
     
    plage = Cells(d, 2).Address
    plage1= cells(d,7).Address
     
    article2 = indirect.ext("D:\[codification-article-brouillon.xls]Feuil4'!&plage&")
    poids2=indirect.ext("D:\[codification-article-brouillon.xls]Feuil4'!&plage1&")
     
    If article2.Value=article.Value then exit do
     
    Loop until article2.value=""
     
    poidstotal.value= poids2*quantite

    Le but est de variabiliser plage1 et plage2 afin de les utiliser comme s'ils étaient dans le même classeur, j'ai reussi à faire la manip en ayant les 2 bases de données dans le même classeur, mais dans un souci d'intégration de données on souhaite travailler sur une seule base article afin de pas en avoir 2 à mettre à jour.

    En attendant vos réponses merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    592
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 592
    Par défaut
    Bonjour,

    Peux tu nous écrire ce qui ne fonctionne pas, quels sont les message d'erreur ?

    J'ai essayé de faire fonctionner chez moi, cela bloque dès
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plage = Cells(d, 2).Address
    Pour que cela passe il me faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set mc = Worksheets("Feuil1").Cells(d, 1)
    plage = mc.Address
    Est-ce la même chose pour toi?
    Quelle version d'Excel utilises tu ?

    Autre remarque:
    Pourquoi ne pas ouvrir le classeur article pour récupérer le poids de l'article qui t'intéresse et dont le nom est dans article.Value

  3. #3
    Membre averti
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Par défaut
    Bonjour,
    j'ai l'erreur 424 objet requis, de plus PPZ78 je n'ai pas réussi avec ta méthode
    car la cellule en question ne se trouve pas sur le classeur dans lequel la macro est exécutée, il faudra peut etre l'ecrire avec une autre syntaxe.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    592
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 592
    Par défaut
    Eh oui, on a toujours l'énoncé du problème par petits bouts.
    J'attends avec impatience ton code.
    Pourquoi n'arrives tu pas à le mettre en PJ?
    1- tu cliques sur gérer les pièces jointes, une fenêtre s'ouvre
    2- dans cette fenêtre tu cliques sur choisir un fichier, un "explorateur" s'ouvre
    3- tu choisis ton fichier, puis clique sur "choisir", l' "explorateur se ferme" (le fichier xls doit être de taille inférieur à 128 Ko)
    4- tu cliques sur envoyer, le nom de ton fichier est alors visible au dessus de Gérer les pièces jointes

    PPz

  5. #5
    Membre averti
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Par défaut
    Je n'arrive pas à mettre le classeur en pièce jointe, comment faire, il me mets fichier non valide

    dites moi comment faire pour uploader le fichier car il me mets fichier non valide, je rappelle que c'est un classeur gérant les macros

  6. #6
    Membre émérite Avatar de sabzzz
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 748
    Par défaut
    bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    article2 = indirect.ext("D:\[codification-article-brouillon.xls]Feuil4'!" & plage)
    poids2 = indirect.ext("D:\[codification-article-brouillon.xls]Feuil4'!" & plage1)

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Citation Envoyé par sliman84 Voir le message
    dites moi comment faire pour uploader le fichier car il me mets fichier non valide, je rappelle que c'est un classeur gérant les macros
    Il faut zipper le fichier.


    Philippe

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Il faut noter que INDIRECT.EXT est une fonction qui n'existe pas sous Excel. Elle est disponible via un add-in non développé par Microsoft.

    Il serait intéressant de détailler exactement et complètement ce que tu souhaites réaliser pour que nous puissions t'aider.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre averti
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Par défaut
    Les gars j'ai réussi à résoudre le problème avec la fonction Getvalue, cependant j'ai un autre problème, c'est archi lent car l'ordinateur doit comparer la désignation de l'article à 300 valeurs, voivi le code miracle :
    il faut définir la fonction getvalue avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Function GetValue(path, file, sheet, ref)
        Dim arg As String
        If Right(path, 1) <> "\" Then path = path & "\"
        If Dir(path & file) = "" Then
            GetValue = "File Not Found"
            Exit Function
        End If
        arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
          Range(ref).Range("A1").Address(, , xlR1C1)
        GetValue = ExecuteExcel4Macro(arg)
    End Function

    Ensuite voici mon code :
    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
    d = 2
    Do
    d= d + 1
     
    p = "D:\"
    f = "codification-article-brouillon.xlsm"
    s = "Feuil4"
    article2 = GetValue(p, f, s, Cells(d, 2).Address)
    If article.Value = article2 Then Exit Do
    Loop Until article2 = 0
     
    If article.Value = article2 Then poidsuni = GetValue(p, f, s, Cells(d,7).Address)
    If poidsuni <> 0 Then poids.Value = poidsuni * quantite.Value
    If poidsuni = 0 Then poids.Value = "Aucune indication de poids"
    If article2 = 0 Then poids.Value = "Aucune indication de poids"
    J'ai essayé de réutiliser indirect.ext (syntaxe se saabz) avec les modifications apportées mais ca n'a pas marché afin de voir si c'est plus rapide que ma méthode.

    Cependant afin d'optimiser la vitesse, je voudrais savoir si les connections ADO sont plus adéquates, si oui comment faire car je ne maitrise pas du tout le sujet, ce qui m'importe c'est de pouvoir importer d'un autre classeur ou d'une autre base de données l'information dont j'ai besoin ( extraction séléctive) et non tout le tableau. (ici c'est le poids mais ca peut etre autre chose).

    merci

  10. #10
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Une proposition:
    Classeur 1: "appel d'offres", en feuille "Feuil1": Articles en colonne A, quantité en colonne B. On désire reporter en colonne C le poids correspondant à l'article et en colonne D on fera Quantité*Poids
    Classeur 2: "articles", en feuille "Feuil4": Articles en colonne A et le poids correspondant en colonne B
    Ci-joint code à adapter:
    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
    Sub PoidsArticles()
    Dim awbk As Workbook, wbk As Workbook
    Dim sht As Worksheet
    Dim c As Range
    Dim LastLig As Long, FinLig As Long, i As Long
     
    Application.ScreenUpdating = False
    Set awbk = ThisWorkbook
    Set wbk = Workbooks.Open("D:\codification-article-brouillon.xls")
    Set sht = wbk.Sheets("Feuil4")
    FinLig = sht.Cells(Rows.Count, 1).End(xlUp).Row
    With awbk.Sheets("Feuil1")
        LastLig = .Cells(Rows.Count, 1).End(xlUp).Row
        For i = 3 To LastLig
            Set c = sht.Range("A2:A" & FinLig).Find(.Range("A" & i).Value, LookIn:=xlValues, lookat:=xlWhole)
            If Not c Is Nothing Then
                .Range("C" & i).Value = c.Offset(0, 1).Value
                .Range("D" & i).Value = .Range("B" & i).Value * .Range("C" & i).Value
                Set c = Nothing
            End If
        Next i
    End With
    wbk.Close
    Set sht = Nothing
    Set wbk = Nothing
    Set awbk = Nothing
    End Sub

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    592
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 592
    Par défaut
    Salut,

    J'ai déjà fait quelque chose qui s'apparente à ton PB.
    Effectivement c'est assez long à cause des aller et retour entre les deux feuilles.

    Pour y remédier, j'ai mis le programme de recherche dans la feuille qui contient les données. De l'extérieur il ne faut faire qu'une requête du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .... Poids_article(Article, Poids, Erreur)
    Le programme ainsi architecturé va environ 20 fois plus vite.

    PPz

  12. #12
    Membre averti
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Par défaut
    Mercatog, je vais essayer ta méthode qui est certainement plus rapide, cepeandant en voyant le code, je me suis apercu que tu ouvres le fichier, c'est certainement plus rapide pour importer les données, l'avantage des connections ADO c'est que tu travailles avec des fichiers fermés.

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Tu amènes toi même une réponse qui me paraît satisfaisante.

    Pourquoi n'importes-tu pas tes données via dao. Avec un CopyFromRecordset, c'est certainement très rapide. Après, tu disposes des données des articles dans le classeur final et tu récupères les poids via RechercheV ou Index(...;Equiv())
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  14. #14
    Membre averti
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Par défaut
    L'avantage de travailler avec une seule base et d'y extraire les données dont on a besoin me permets d'apporter une seule mise à jour a cette base. On revanche si à chaque fois je dois copier une base pour l'utiliser, je me retrouve avec des bases totalement désintegrées sur mes diffèrentes applications. C'est dans un souci d'intégration des données que je voudrais travailler avec une seule base.
    C'est comme les logiciels de facturation, vous avez une base article(désignation, unité, poids...), une base client (adresse, code client...) et le système va à chaque fois extraire les données de ces mêmes bases.
    En utilisant une connection ADO, si j'arrive à extraire la donnée dont j'ai besoin (avec la méthode FIND ou autre), le process serait beaucoup plus rapide.

  15. #15
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    592
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 592
    Par défaut
    Bonsoir,
    Voici la solution à laquelle je suis arrivé.

    Dans le classeur de la base de donnée, j'ai ajouté une fonction pour récupérer le poids d'un article:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function Poids_Article(article)
    '   Recherche du poids d'un article
        Workbooks("Articles_BDD.xls").Sheets("Feuil1").Cells(1, 1) = article
        poids = Workbooks("Articles_BDD.xls").Sheets("Feuil1").Cells(2, 1).Value
        If Not IsNumeric(poids) Then poids = 0
        Poids_Article = poids
    End Function
    Pour que cela fonctionne j'ai supposé que les deux premières cellules de la colonne A étaient libres.
    A1 sert à entreposer le nom de l'article, et dans A2 j'ai mis cette formule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =RECHERCHEV(A1;B:G;6;FAUX)
    C'est un moyen extrêmement efficace pour récupérer la masse de l'article.

    Dans la macro appelante j'ai juste mis le code suivant pour le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub poids()
    '
    '   Poids d'un article
        Dim Masse As Variant
        Article = "Article_35"
     
        Masse = Application.Run("Articles_BDD.xls!Poids_Article", Article)
        MsgBox "Résultat : " & Masse
     
    End Sub
    Il te reste à adapter.

    A+
    PPz

Discussions similaires

  1. je ne sais pas utiliser la fonction "indirect"
    Par kingtang dans le forum Excel
    Réponses: 5
    Dernier message: 30/09/2007, 22h33
  2. [Oracle 9i] Fonction DESCRIBE et problème de droits
    Par glutock dans le forum Oracle
    Réponses: 2
    Dernier message: 13/03/2007, 16h34
  3. Réponses: 3
    Dernier message: 07/09/2006, 13h00
  4. Fonction INDIRECT avec variable sur n° de colonne
    Par mat.guillaume dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 30/08/2006, 19h04
  5. Fonction today() et problème de langue
    Par zia77 dans le forum Powerbuilder
    Réponses: 2
    Dernier message: 22/05/2006, 15h43

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