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 :

Sélection d'un range d'un tableau VBA [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    1001010101
    Inscrit en
    Mars 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : 1001010101
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2016
    Messages : 3
    Par défaut Sélection d'un range d'un tableau VBA
    Bonjour à tous,

    Après plusieurs jours à décortiquer internet, les guides et les aides, je ne trouve pas solution à mon problème et décide donc de faire appel à vos connaissances.

    Je suis surtout orienté HTML/PHP/SQL/C++ et pour les besoins de ma boite, je me suis mis au VBA en urgence. Au final un code informatique n'est qu'un cousin d'un autre.

    Mon problème est le suivant :

    J'ai un fichier texte contenant, pour l'instant, 3 millions de lignes. Il est amené à en contenir 12 à 15 millions prochainement.
    Je dois en extraire les données par colonne, trouvé les valeurs min/max/moy/etc... Mais pour cela il me semble que j'ai besoin d'un Range(), et voila le soucis, je n'arrive pas à définir un Range d'un tableau virtuel, qui n'est pas dans une feuille.

    Voici le code et le soucis qui va avec.

    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 Extraction(Fichier As String, _
         NbLignes As Long, _
         Separateur As Variant)
     
        Dim debut As Date
        Dim temps As Date
        Dim fin As Date
        Dim Counter As Double
        Dim tableau() As String
        Dim i As Double
        Dim ContenuLigne As String
        Dim Val_1 As String
        Dim Val_2 As String
        Dim Val_3 As String
        Dim Val_4 As String
        Dim Val_5 As String
        Dim Val_6 As String
        Dim tab_final() As Variant
        Dim range_1 As Range
     
     
     
        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
        Application.DisplayStatusBar = False
        ActiveSheet.DisplayPageBreaks = False
     
        Counter = 0
        debut = Time
        i = TextBox_Nb_Lignes.Value
        ReDim tab_final(i, 6)
     
        Open Fichier For Input As #1
     
               Do While Not EOF(1)
                       Counter = Counter + 1
     
                   Line Input #1, ContenuLigne
     
                   tableau = Split(ContenuLigne, Separateur)
                   Val_1 = Mid(tableau(0), 1, 5)
                   Val_2 = Mid(tableau(3), 1, 5)
                   Val_3 = Mid(tableau(6), 1, 5)
                   Val_4 = Mid(tableau(9), 1, 5)
                   Val_5 = Mid(tableau(12), 1, 5)
                   Val_6 = Mid(tableau(15), 1, 5)
                   tab_final(Counter, 1) = Val_1
                   tab_final(Counter, 2) = Val_2
                   tab_final(Counter, 3) = Val_3
                   tab_final(Counter, 4) = Val_4
                   tab_final(Counter, 5) = Val_5
                   tab_final(Counter, 6) = Val_6
     
               Loop
     
     
        Close #1
                    range_1 = Range(tab_final(3, 1), tab_final(i, 1))
                    range_1 = Application.Min(range_1)
                    Min_1.Value = range_1
     
        Application.ScreenUpdating = True
        Application.Calculation = xlCalculationAutomatic
        Application.DisplayStatusBar = True
        ActiveSheet.DisplayPageBreaks = True
        fin = Time
        temps = fin - debut
     
     
     
        MsgBox ("C'est fini !" & Chr(10) & "temps de traitement " & temps)
    End Sub
    Je n'ai mis que l'essentiel et ai détaillé chaque action, je sais que l'on peut simplifié mais le soucis n'est pas la. Pour l'instant je ne veux que la valeur Min de la première colonne.
    J'ai comme erreur à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range_1 = Range(tab_final(3, 1), tab_final(i, 1))
    "Erreur 1004 : La méthode Range de l'objet _Global à échoué".

    Je suis dans l'impasse, merci d'avance pour votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Bonjour à toi,

    Par définition une Range est un objet qui représente une ou plusieurs cellules d'une feuille : MSDN

    Il te faut utiliser autre chose si tu souhaite stocker des données sans les insérer dans une feuille.

  3. #3
    Candidat au Club
    Homme Profil pro
    1001010101
    Inscrit en
    Mars 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : 1001010101
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2016
    Messages : 3
    Par défaut
    D'accord, merci. Je vais devoir changer de méthode et je n'ai aucune idée de comment faire. Ou bien changer de langage.

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Salut,

    je met mon grain de sel, juste pour dire qu'il te sera, peut être, plus facile de gérer
    cette masse de données avec une Base de données.
    Access le fait très bien, et c'est assez facile de les traiter avec des requêtes sql.
    Cordialement,

  5. #5
    Candidat au Club
    Homme Profil pro
    1001010101
    Inscrit en
    Mars 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : 1001010101
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2016
    Messages : 3
    Par défaut
    Effectivement c'est ce qu'il y a de mieux, et c'est ce que de toute façon je maîtrise. Seulement, mon employeur ne veut pas de Access et ne me permet pas de simuler phpmyadmin ou autres... Je vais devoir le convaincre ou bien le faire en douce.
    Avec ma 1ère version je tournais à 5mn pour 3 millions de lignes, ici je devais être à 1mn max. On verra bien !

    En tout cas merci, me dire que ce n'est pas possible via VBA m'a aidé à ne plus perdre mon temps à bidouiller.

  6. #6
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Regarde sinon du coté de petite BDD qui ne nécessite pas grand chose genre SQLite

  7. #7
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Tu peux peut être aussi utiliser une bdd Access sans avoir Access,
    mais en utilisant la librairie ADODB.
    Par exemple, pour créer une bdd:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Sub ADOCreateDatabase()
     
       Dim cat As Object
       Set cat = CreateObject("ADOX.Catalog")
     
       cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=C:\Users\Philippe\Documents\ACCESS\New2.accdb;"
    End Sub

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

Discussions similaires

  1. [XL-2007] Boucle pour une sélection multiple par nom sur un tableau croisé dynamique VBA
    Par kuro200 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/06/2015, 20h31
  2. Range de Range, pour un tableau [Facile]
    Par Tomme dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/07/2007, 15h33
  3. variable tableau vba
    Par ferronimus dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 13/06/2007, 11h33
  4. variable tableau vba
    Par ferronimus dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 11/06/2007, 14h20
  5. Duplication dans un tableau (VBA et MySQL)
    Par xianxian620 dans le forum Access
    Réponses: 5
    Dernier message: 19/02/2007, 13h06

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