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

Access Discussion :

Import Excel selon plage variable


Sujet :

Access

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2003
    Messages : 281
    Points : 209
    Points
    209
    Par défaut Import Excel selon plage variable
    Bonjour,
    j'aborde un sujet déjà abordé dans beaucoup de post et dans la FAQ, mais je n'ai pas trouvé encore comment faire.

    Je suis sous Win2000 et Office2000.

    Je souhaite importer dans une table existante, un certain contenu d'un fichier excel. Dans ce fichier excel, je veux prendre une partie seulement (le contenu d'un tableau précis, pour cela, je voudrais sélectionner la plage "B13:U23" et toutes les lignes avec une valeur en dessous). Le tableau excel ne contient pas le nom de mes champs.

    J'ai 2 problèmes :
    1- comment récupérer la valeur de la plage (sous forme de string pour m'en servir dans TransferSpreadsheet )
    2- comment utiliser TransferSpreadsheet pour une plage donnée quand le nom des champs n'est pas dans le fichier excel (j'obtiens toujous une erreur :
    ERROR 2391: le champs 'F1' n'existe pas dans la table destination)

    Voici un bout de code complètement faux pour représenter l'esprit de ce que je veux faire :
    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
        Dim xlApp As Excel.Application
        Dim xlSheet As Excel.Worksheet
        Dim xlBook As Excel.Workbook
        Dim xlRange As Excel.Range
     
        ' Récupération du chemin du fichier à importer
        fichier = Me.txtFichierAImporter.Value
     
     
        ' Initialisation des variables
        Set xlApp = CreateObject("Excel.Application")
        Set xlBook = xlApp.Workbooks.Open(fichier)
        Set xlSheet = xlBook.Worksheets("Tableau")
     
        ' Sélection de la plage correspondant aux données à importer
        Set xlRange = xlSheet.Range("B13:U23")
        Set xlRange = xlSheet.Range(Selection, Selection.End(xlDown))
     
     
     
     
        ' Importation
        DoCmd.TransferSpreadsheet transfertype:=acImport, SpreadsheetType:=8, _
                tablename:="source", Filename:=fichier, _
                Hasfieldnames:=False, Range:=xlRange
    S'il n'y a pas de solution, il n'y a pas de problème.
    Moi je dis ça, je dis rien.

  2. #2
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Hello,

    de prime à bord, je dirais :
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2003
    Messages : 281
    Points : 209
    Points
    209
    Par défaut
    J'ai ajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        plage = "Tableau!" & xlRange.Address
        xlApp.Workbooks.Close
        xlApp.Quit
    3 problèmes persistent :

    1) Ensuite, j'appelle la fonction TransferSpreadsheet avec comme 'range' la variable "plage" qui vaut "Tableau:$B$13:$U$23". Cela me sort une erreur comme quoi il ne trouve pas l'objet "Tableau$$B$13:$U$23" (en gros, je dois mal faire la concaténation, mon "!" se transforme en "$").

    2) Après, quand je veux utiliser la fonction TransferSpreadsheet directement, en mettant la plage en dur, j'ai toujours l'erreur 2391 (F1 non trouvé....).

    3) Enfin, en manipulant les objets, j'arrive à obtenir la plage "B13:U13" (1ere ligne) car je le saisie en dur, mais je n'arrive pas à dire à la plage de faire un "xlDown"
    S'il n'y a pas de solution, il n'y a pas de problème.
    Moi je dis ça, je dis rien.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    2- comment utiliser TransferSpreadsheet pour une plage donnée quand le nom des champs n'est pas dans le fichier excel (j'obtiens toujous une erreur :
    ERROR 2391: le champs 'F1' n'existe pas dans la table destination)
    Rien que pour cette raison, moi en lieu et place de Range j'utiliserais une boucle For Next pour parcourir les colonnes et ligne du fichier excel afin de remplir la table. Ainsi tu définis la correspondance entre tes colonnes et le nom de tes champs sans ambiguité.
    Amicalement

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2003
    Messages : 281
    Points : 209
    Points
    209
    Par défaut
    Donc ne pas utiliser la fonction TransferSpreadsheet ?

    Faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i = 1 to nbLigne
      sql = "INSERT INTO (.....) VALUES ("
      for j = 1 to nbColonne
         sql = sql & "'" &  xlRange.address(i,j).value & "' , "
      next
      execute(sql)
    next
    (juste pour donner l'idée)


    Sinon, quand j'utilise TransferSpreadsheet dans une table inexistante cela fonctionne. Ca me crée une table avec les valeurs et le nom des champs F1, F2... pas très surprenant.
    Une autre méthode peu de jouer sur cette table pour insérer les données dans la bonne table.

    Je ne sais pas ce qui est le mieux.
    S'il n'y a pas de solution, il n'y a pas de problème.
    Moi je dis ça, je dis rien.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2003
    Messages : 281
    Points : 209
    Points
    209
    Par défaut
    Bon, je suis parti sur la solution où j'importe dans une table temporaire et j'appelle une requête d'ajout pour faire le transfert.

    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
        Dim xlApp As Excel.Application
        Dim xlSheet As Excel.Worksheet
        Dim xlBook As Excel.Workbook
        Dim xlRange As Excel.Range
        Dim qdf As DAO.QueryDef
     
     
        ' Initialisation variables
        fichier = Me.txtFichierAImporter.Value
        tableTmp = "sourceTmp" ' si on change cette valeur, il faut également changer la requete "reqImport"
     
        ' Initialisation des variables
        Set xlApp = CreateObject("Excel.Application")
        Set xlBook = xlApp.Workbooks.Open(fichier)
        Set xlSheet = xlBook.Worksheets("Tableau")
     
        ' Sélection de la plage correspondant aux données à importer
        Set xlRange = xlSheet.Range("Tableau!B13:U23")
        ''''''Set xlRange = xlSheet.Range(Selection, Selection.End(xlDown))
        plage = "Tableau!" & xlRange.Address
        xlApp.Workbooks.Close
        xlApp.Quit
     
     
     
        ' Importation dans table temporaire
        DoCmd.TransferSpreadsheet transfertype:=acImport, SpreadsheetType:=8, _
                tablename:=tableTmp, Filename:=fichier, _
                Hasfieldnames:=False, Range:="Tableau!B13:U23"
     
        ' Ajout de la table temporaire à la table complète
        Set qdf = CurrentDb.QueryDefs("reqImport")
        qdf.Execute
        Set qdf = Nothing
     
        ' Suppresion de la table temporaire
        DoCmd.DeleteObject acTable, tableTmp
    Il me reste les points 1) et 3).

    Déjà merci
    S'il n'y a pas de solution, il n'y a pas de problème.
    Moi je dis ça, je dis rien.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2003
    Messages : 281
    Points : 209
    Points
    209
    Par défaut
    Bon, au final, j'ai parcouru mon fichier excel "à la main". Je me place dans le coin haut gauche de ma plage (position fixe). Et j'incrémente un compteur tant que les valeurs des lignes suivantes ne sont pas vides (pour les 3 premières colonnes).

    Du coup, je n'ai pas de fonction du genre xlDown. Je manipule uniquement un string pour ma plage.

    Le résultat :
    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
        Dim xlApp As Excel.Application
        Dim xlBook As Excel.Workbook
        Dim xlSheet As Excel.Worksheet
        Dim qdf As DAO.QueryDef
     
        '-------------------------
        ' Initialisation variables
     
        fichier = Me.txtFichierAImporter.Value
        tableTmp = "sourceTmp" ' si on change cette valeur, il faut également changer la requete "reqImport"
        feuille = "Tableau"
        ligneIni = 13
        colonneIni = 2 '-> celluleIni = B13
     
        '----------------------------------
        ' Ouverture du fichier excel source
     
        Set xlApp = CreateObject("Excel.Application")
        Set xlBook = xlApp.Workbooks.Open(fichier)
        Set xlSheet = xlBook.Worksheets(feuille)
     
        '----------------------
        ' Sélection de la plage
        '   -> on vérifie les 3 premières colonnes pour compter le nombre de ligne
        '   -> ensuite, on définie la plage à importer
     
     
        nbLigne = 0
        While (xlApp.Cells(ligneIni + nbLigne, colonneIni) <> "" And _
                xlApp.Cells(ligneIni + nbLigne, colonneIni + 1) <> "" And _
                xlApp.Cells(ligneIni + nbLigne, colonneIni + 2) <> "")
            nbLigne = nbLigne + 1
        Wend
        plage = feuille & "!" & "B13:U" & (ligneIni + nbLigne - 1) 'on enleve 1 car la ligne ini est déjà comptée
     
        '---------------------------
        ' Fermeture du fichier excel
     
        xlApp.Workbooks.Close
        xlApp.Quit
     
     
        '-------------------
        ' Importation ou fin
     
        If (nbLigne = 0) Then
            ' Si rien à importer, on quitte
            MsgBox ("Il y a aucune ligne ""complète"" à importer !")
        Else
            ' Importation dans table temporaire
            DoCmd.TransferSpreadsheet transfertype:=acImport, SpreadsheetType:=8, _
                    tablename:=tableTmp, Filename:=fichier, _
                    Hasfieldnames:=False, Range:=plage
     
            ' Ajout de la table temporaire à la table complète
            Set qdf = CurrentDb.QueryDefs("reqImport")
            qdf.Execute
            Set qdf = Nothing
     
            ' Suppresion de la table temporaire
            DoCmd.DeleteObject acTable, tableTmp
        End If
    Merci
    S'il n'y a pas de solution, il n'y a pas de problème.
    Moi je dis ça, je dis rien.

  8. #8
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Tu ne t'es jamais demandé pourquoi j'avais mis .Address(0,0) au lieu de .Address ?

    Dommage
    Citation Envoyé par cafeine
    Hello,

    de prime à bord, je dirais :
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2003
    Messages : 281
    Points : 209
    Points
    209
    Par défaut
    Sur le début j'avais pas pigé (je pensais que je devait remplacer (0,0) par mes valeurs...).
    Après, quand j'ai essayé, j'ai vu que ca me donnait bien un string avec la plage en cours, mais j'avais toujours le problème de trouver le nombre de ligne non vides en dessous de ma 1er ligne.
    Du coup j'ai zappé pour une toute autre solution.

    Mais il est vrai que si j'avais trouvé comment faire un "xlDown" à partir de mon objet range, je m'en serait servi. Si quelqu'un sait, pour culture je suis preneur.
    S'il n'y a pas de solution, il n'y a pas de problème.
    Moi je dis ça, je dis rien.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 01/04/2019, 17h34
  2. [DATA] IMPORT EXCEL : Longueur de variables
    Par discus23 dans le forum SAS Base
    Réponses: 12
    Dernier message: 04/12/2014, 18h42
  3. [AC-2010] Import d'une plage depuis Excel
    Par fabian_ dans le forum Macros Access
    Réponses: 9
    Dernier message: 11/03/2014, 23h13
  4. [XL-2003] Importer des données depuis un fichier Excel au chemin variable
    Par tarnx dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/08/2010, 13h28
  5. Liste de diffusion Mail selon plage de cellule variable
    Par dguff dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/09/2007, 17h10

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