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 :

Quelle est la limite d'une variable tableau


Sujet :

Macros et VBA Excel

  1. #1
    Membre très actif Avatar de lionel86500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2013
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 144
    Par défaut Quelle est la limite d'une variable tableau
    Bonjour,

    Je souhaite intégrer une fichier CSV dans une variable tableau afin de pouvoir pointer rapidement sur l'enregistrement voulu.

    Exemple :
    NO CLI NOM PRENOM CPSTL VILLE
    Fichier CSV chaque enregistrement est comme ceci 12345678;DURAND;ALEXANDRE;75000;PARIS
    je déclare 4 variables tableau nom, prenom, cpstl et ville
    l'index du tableau est le numéro de client.

    le problème est la taille du tableau

    Par la suite lors d'une demande d'information d'un numéro de client la réponse est immédiate.

    pour info aussi dans le fichier CSV il y a 204.342 enregistrements.

    Dans l'attente de lecture

    Lionel COUVRAT

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    fais ce test et tu le sauras des que ça bug place le curseur de la sourie sur t et tu liras sa valeur!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim tb()
    t=0
    do
    redim tb(t)
    t=t+1
    loop

  3. #3
    Membre très actif Avatar de lionel86500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2013
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 144
    Par défaut
    Re bonjour,

    je viens de faire le test avec ton code
    au lieu de commencer à 0 j'ai commencer plus loin
    alors résultats :

    50000000 trop grand (erreur exécution 7, mémoire insuffisante)
    40000000 ca passe

    je ne peux donc pas utiliser un tableau car j'ai des no client supérieur à la limite

    Merci

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    tu peux utiliser un dictionnaire complémentaire qui contient :

    - en item : l'indice du client dans ton tableau client
    - en clé : le numéro de client

    ainsi, tu n'as plus besoin d'avoir un tableau de client qui contient autant d'éléments que le numéro de client maximal

    un exemple réalisé sur excel :

    - les colonnes vont de A à E
    - j'ai crée 1 millions de clients fictifs
    - la création du dictionnaire à 1 millions d'entrées prend environ 1 minutes
    - ensuite, son interrogation est instantanée


    pour générer le dictionnaire, il faut lancer la procédure CreaDictionnaire
    ensuite, on peut utiliser la procédure Cherche pour récupérer les informations voulues

    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
    Public MonDico
    Public TabClient
     
    Sub CreaDictionnaire()
     
    ' dictionnaire
    Set MonDico = CreateObject("Scripting.dictionary")
     
    ' tableau avec les clients
    TabClient = Range(Cells(2, 1), Cells(Rows.Count, 5).End(xlUp))
     
    ' pour chaque ligne du tableau (= chaque client)
    For i = LBound(TabClient, 1) To UBound(TabClient, 1)
        ' on crée une entrée dans le dictionnaire
        ' clé = numéro du client
        ' item = index du tableau client
        MonDico.Add TabClient(i, 1), i
    Next i
     
    MsgBox "Dictionnaire crée"
     
    End Sub
     
    Sub Cherche()
     
    ' interrogation de la troisième colonne de mon client 294420
    ' (= son prénom)
    MsgBox TabClient(MonDico(294420), 3)
     
    End Sub
    Ps : pour utiliser un dictionnaire, il faut cocher la référence "Microsoft Scripting Runtime" dans ton VBE si ce n'est pas déjà fait

  5. #5
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub test()
    serveur = "C:\MyTest\"
    GenereCSTRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & serveur & ";Extended Properties=""TEXT;HDR=YES;FMT=Delimited(;)"""
     Set cnx = CreateObject("adodb.connection")
     cnx.Open GenereCSTRING
     Set RS = CreateObject("adodb.recordset")
     RS.Open "select * from [Classeur1.csv];", cnx
     ActiveCell.CopyFromRecordset RS
     RS.Close
     cnx.Close
    End Sub

  6. #6
    Membre très actif Avatar de lionel86500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2013
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 144
    Par défaut
    Bonjour joe.levrai

    Quelle idée excellente de créer un dictionnaire.
    chose que je ne connais pas, il va falloir que je me penche sur le sujet
    car en fait je dois mémoriser 5 fichiers CSV avec beaucoup d'enregistrement
    qui on en commun un numéro de client.

    Merci



    Bonjour rdurupt

    Je vois l'idée général de ton code, c'est une connexion au fichier CSV qui me plait assez
    mais est ce que je peut faire une recherche et ressortir des infos.
    Comme je l'ai dis a joe.levrai j'ai 5 fichiers CSV à mémoriser.
    cette idée est pas mal car elle travaille directement sur le fichier CSV

    Dans l'attente de te lire

    Lionel COUVRAT

  7. #7
    Invité
    Invité(e)
    Par défaut
    Oui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select champ1,champ2 from csv.csv where champ1='toto';
     
    select * from Csv1.Csv as frm1 inner join csv2.csv as frm2 on frm1.Num_Client=frm2.Num_Cient where frm1.localisation='Bordeaux';

  8. #8
    Membre très actif Avatar de lionel86500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2013
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 144
    Par défaut
    re rdurupt

    Un select comme en sql.

    je viens ce coller tes deux codes

    mais pour le select j'ai l'erreur : erreur de compilation case attendu.
    de plus le résultat du select je le récupère dans quoi ?

    Je te joint ce que j'ai écris (il y a peut de changement par rapport à toi

    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
     
    Sub test()
     
    serveur = "C:\couvratl\A_conserver\Excel\Recherche_donnees\"
    GenereCSTRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & serveur & ";Extended Properties=""TEXT;HDR=YES;FMT=Delimited(;)"""
     Set cnx = CreateObject("adodb.connection")
     cnx.Open GenereCSTRING
     Set RS = CreateObject("adodb.recordset")
     RS.Open "select * from [cdfast_clipro8.csv];", cnx
     ActiveCell.CopyFromRecordset RS
     RS.Close
     cnx.Close
     
    select NOM,CODCLI from cdfast_clipro8.csv where CODCLI='89999907';
     
    End Sub

  9. #9
    Invité
    Invité(e)
    Par défaut
    alors là?????

  10. #10
    Membre très actif Avatar de lionel86500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2013
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 144
    Par défaut
    Question

    lorsque tu lis le fichier CSV, les données se mettent dans la colonne A d'une feuille sur Excel.
    quel est la commande qui fait cela dans ton script ?
    est ce que je peux la remplacer par une mémorisation dans un tableau ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Rs contient le résultat de ta requête. range("A1").CopyFromRecordset RS ! copie la equête comme un tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while rs.eof=false 'la requête est vide false/true; oui/non
    rs("Champ1").valeur 'retourne la valeur du champ1 de 'enregistrment1
    rs.movenext 'passe à l'enregistrement suivant.
    wend
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim Mytableau()
    mytableau=rs.getrows 'retourne le resultat de la requête sous forme de tableau
    for i=0 to unbound(mytableau)
    next

  12. #12
    Membre très actif Avatar de lionel86500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2013
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 144
    Par défaut
    Merci

  13. #13
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Pour info,

    si tu souhaites utiliser un dictionnaire, après avoir utilisé la procédure de rdurupt qui met sous tableau les données de ton CSV

    n'oublie jamais que l'index de départ du dictionnaire sera 1
    en l'absence d'option "Base 1" dans ton module, le tableau MyTableau aura quant à lui un index de départ à 0


    ça n'a que peu d'incidence, mais c'est bon à savoir pour ne pas avoir de décalage malencontreux

  14. #14
    Membre très actif Avatar de lionel86500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2013
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 144
    Par défaut
    Merci

    Bonjour,

    après avoir chercher voici ce que j'ai fait et qui fonctionne

    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
     
    Option Explicit
     
    Dim Dicolc As Object
    Dim schemin As String
    Dim sfichier As String
    Dim senr As String
    Dim ttab() As String
    Dim iitem As Double
    Dim ipremier As Integer
     
    Sub CreaDictionnaire()
     
    ' Déclaration du dictionnaire
    Set Dicolc = CreateObject("Scripting.dictionary")
     
    ' Déclaration du fichier à traiter
    schemin = "C:\couvratl\A_conserver\Exemples_excel\"
    sfichier = "zdonnees.csv"
     
    ipremier = 0
    Open schemin & sfichier For Input As #1
    While Not EOF(1)
        Line Input #1, senr
        ttab() = Split(senr, ";")
        If ipremier = 0 Then
            ' Ne pas traiter le premier enr. Titre
            ipremier = 1
        Else
            iitem = Val(ttab(0)) 'Convertion de la donnée en valeur
            'MsgBox "ttab -> " & iitem & Chr(13) & "senr -> " & senr
     
            Dicolc.Add iitem, senr
            ' - Il est possible de choisir le format de l'item du dictionnaire
            ' - Cela peut être un item string ou un item de valeur
            ' - Les conséquences seront pour la recherche
            '   Si string il faut faire une recherche avec une donnée string
            '      exemple -> MsgBox Dicolc.Item("2")
            '   Si valeur il faut faire une recherche avec une donnée numérique
            '      exemple -> MsgBox Dicolc.Item(2)
        End If
    Wend
    Close #1
     
    MsgBox "Dictionnaire crée"
     
    iitem = 2
    MsgBox Dicolc.Item(iitem)
     
     
    End Sub

    je vous joint aussi les données du fichier zdonnees.csv

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Numéro;Nom;Prénom;cpstl;ville
    1;NOM1;PRENOM1;86000;VILLE1
    2;NOM2;PRENOM2;86100;VILLE2
    3;NOM3;PRENOM3;86200;VILLE3
    4;NOM4;PRENOM4;75000;VILLE4
    5;NOM5;PRENOM5;85000;VILLE5
    6;NOM6;PRENOM6;18000;VILLE6
    7;NOM7;PRENOM7;64000;VILLE7
    8;NOM8;PRENOM8;36000;VILLE8
    9;NOM9;PRENOM9;37000;VILLE9
    10;NOM10;PRENOM10;75000;VILLE10
    Je vais maintenant tester sur mes fichiers CSV reels

    Merci pour tous vos idées et vos réponses

    Lionel

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

Discussions similaires

  1. Quelle est la portée d'une variable dans une page ASP ?
    Par sauceaupistou dans le forum ASP
    Réponses: 3
    Dernier message: 19/03/2007, 18h16
  2. [Requete][Where] Quelle est l'utilité d'une clause: 1=1 ?
    Par alpachico dans le forum Langage SQL
    Réponses: 8
    Dernier message: 25/12/2005, 18h40
  3. Réponses: 2
    Dernier message: 25/05/2005, 21h34
  4. Acces à une variable-tableau de PHP
    Par Erwan21 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/02/2005, 13h55

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