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 :

Requête OLEDB, écriture contenu d'un array dans un classeur fermé [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 48
    Par défaut Requête OLEDB, écriture contenu d'un array dans un classeur fermé
    Bonjour à tous,


    J'essais de réaliser une petit macro qui me permettra d'enregistrer une colonne entière dans un classeur fermé.

    Avec l'aide des tuto disponible ainsi que quelque recherche je suis parvenu à écrire des données dans un classeur fermé. Le problème est que je n'arrive pas à adapter la requête pour pouvoir écrire les informations située dans un tableau (array).

    Avec la code ci-dessous, je affecte la valeur dans mon classeur fermé. Il me suffis de boucler sur le nombre d’élément dans mon tableau pour pouvoir écrire tous son contenu dans ma colonne mais cela demande N requête. Je me demande si on ne peux pas écrire le tableau entier d'une seule requête.

    voici le 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
    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
    Sub ajoutEnregistrement()
        Dim Cn As ADODB.Connection
        Dim Fichier As String, Feuille As String, strSQL As String
     
        Fichier = "C:\Users\Bruno\SkyDrive\Documents\Excel\Solution & Exemple VBA\Ecrire dans un classeur fermé\Target.xlsx"
        Feuille = "Feuil1"
     
        Dim tableau(30) As Date
     
        p = 0
        For i = 1 To 30
     
        tableau(p) = Range("A" & i).Value
        p = p + 1
        Next
        'Les données à insérer:
        LaDate = "w" 'CDate("26/05/2006")
     
     
        Set Cn = New ADODB.Connection
     
       With Cn
                .Provider = "Microsoft.Jet.OLEDB.4.0"
                .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & Fichier & ";Extended Properties=""Excel 12.0;HDR=Yes;"""
                .Open
            End With
     
        'Les données doivent être indiquées dans le même ordre que les champs dans la base de données.
     
     
     
        For j = 0 To UBound(tableau)
     
        strSQL = "INSERT INTO [" & Feuille & "$] " & "VALUES ( " & "'" & tableau(j) & "')"
     
     
        Cn.Execute strSQL
        Next
     
        Cn.Close
        Set Cn = Nothing
    End Sub
    Cette solution présente un autre problème. J'aimerais ne pas être dépendant de la structure d'arrivée. Je veux dire par la que si j'ai plus qu'une en-tête de colonne dans mon onglet de destination j'obtiens une erreur qui dit:La table de destination contiens plus de champ que la source. Comment puis-je m'affranchir de cette contrainte ?

    Par avance merci pour votre précieuse aide

    Meilleures salutations

    Vorens

  2. #2
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Bonjour Vorens,

    Si tu veux "t'affranchir" de la dimension de ton tableau d'arrivée, il faut que tu sois capable de le redimensionner (si j'ai bien compris ta problématique).

    Observes le code suivant qui charge les éléments de la colonne A dans un tableau VBA (un "Array"), sans savoir au départ le nombre d'éléments à charger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub chargement_dans_un_array()
     
    Dim tableau() As Date
    Dim i As Long
    i = 0
     
    Do
        i = i + 1
        ReDim Preserve tableau(i)
        tableau(i) = Range("A" & i).Value
    Loop Until Range("A" & i + 1).Value = ""
     
    End Sub
    Le truc, si on peut parler de "truc" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       ReDim Preserve tableau(i)
    ReDim --> redimensionne
    Preserve --> permet d'effacer ton tableau, évite une initialisation

    Bertrand

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 48
    Par défaut
    Hello,


    Merci de ta réponse mais mon problème ne vient pas du remplissage de l'Array.

    Mon problème est: Comment inscrire son contenu dans un classeur excel fermé par requête SQL. (Un peux plus complexe)

    De plus, on va préférer une boucle for pour le traitement des tableaux

    Cordialement

  4. #4
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Re bonjour,

    J'avais bien compris... Mais avant de pouvoir inscrire dans le fichier Excel via une requête SQL, il me parait important de savoir remplir correctement ton tableau VBA (et introduire le fait que les dimensions de ton tableau ne sont pas forcément fixés à 30)

    Je n'ai pas la solution mais une simple remarque concernant ta boucle For :

    A la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        p = 0
        For i = 1 To 30
     
        tableau(p) = Range("A" & i).Value
        p = p + 1
        Next
    Il est préférable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        For i = 1 To 30
        tableau(i-1) = Range("A" & i).Value
        Next
    Bertrand

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 48
    Par défaut
    Re,


    Une fois encore, mon tableau est la juste pour le test est n'est pas du tout représentatif. Ce scipt est réaliser dans un fichier test et ne fait pas partie du projet.

    Dans la vrai solution mon tableau est rempli de façon dynamique en contrôle la dimension total du tableau de la feuille excel par un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    toto = sheets(mimi).range("A" & "65535").end (xlup).row
     
    for i=1 to toto
     
    tableau(i-1) = sheets(mimi).range("A" & i).value
     
    next

    (de façon a pas être dépendant d'éventuel blanc dans le tableau.

    Voila ceci étant dit, je ne sait toujours pas de quelle façon écrire le contenu de mon tableau dans un classeur fermé =)

  6. #6
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Bonsoir,

    Pour t'aider, j'ai fait un test et j'en arrive au même point que toi :



    Si quelqu'un a une idée, je suis maintenant curieux de savoir

    Bertrand

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

Discussions similaires

  1. [PHP 5.4] Mettre le contenu d'un array dans un fichier
    Par aspkiddy dans le forum Langage
    Réponses: 9
    Dernier message: 06/03/2014, 22h56
  2. [MySQL] Mettre le contenu d'un array dans une requête
    Par chido dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 25/01/2012, 20h02
  3. [PHPExcel] Contenu d'un array dans même cellule
    Par spark_legion dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 17/08/2011, 20h55
  4. Afficher le contenu d'un ARRAY dans DATAGRID
    Par luilui dans le forum Flex
    Réponses: 3
    Dernier message: 19/05/2009, 00h55
  5. écriture +contenu d'un Textfield+ dans un fichier
    Par minola dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 11/12/2007, 14h06

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