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 :

Recuperation de lignes filtrées dans une variable tableau


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Par défaut Recuperation de lignes filtrées dans une variable tableau
    Bonjour à tous

    J’ai une feuille excel de 36000 lignes et 5 colonnes dont je cherche à filtrer les lignes à partir de la présence d’une sous chaine dans chaque cellule de la 5ème colonne ;
    Problème : nombre de ces cellules dépassent la limite des 255 caractères au dela de laquelle le filtre automatique ne repère plus rien.
    J’ai déjà fait une macro qui fonctionne bien mais un peu lentement (car je copie la ligne chaque fois que le critère est repéré
    Peu familier avec les variables tableaux, je crois comprendre qu'on peut stocker dans une variable tableau les lignes repondant au critere puis réinjecter la plage crée en une seule commande dans une nouvelle feuille. Mais je n'arrive pas à construire la boucle pour ce faire. J'ai pensé à un truc du style:
    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
    'ma plage à filtrer
    montab=(sheets(1).range("A1 :E36000"))
    'boucle sur la colonne dont les cellules contiennent la sous-chaine/critere de tri
    for i=1 to 36000
    if instr(montab(i,5), critere) <> o then
    	‘je stocke dans une autre variable indicée (c’est là que je coince)
    		'boucle sur les cellules de la ligne
    		for  j=1 to 5
    		'mais la redim ne marche pas pour la 1ère dimension
    		Redim preserve varFiltre(n,j)
    		varFiltre(n,j)=montab(i,j)
    		next j
    		n=n+1
    end if
    next i
     
    sheets(sheets.count).Range(Cells(1, 1), Cells(UBound(varFiltre, 1), UBound(varFiltre, 2))) = varFiltre
    Merci pour votre aide

    Olivier

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Par défaut
    Toutes mes données sont des données texte (liste de périodiques de bibliothèques). j'ai déclaré les variables tableaux (me fiant aux tutoriels trouvés)
    en : dim Montab as variant, varFiltre as variant

    OlivierCT

  3. #3
    Membre Expert Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Par défaut
    bonjour olivier le forum un ex:je copy sur feuille 2
    If InStr(t(i, 5), toncritere) <> o Then ton critere a definir

    Option Explicit
    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
    Dim t As Variant, t2() As String, x As Long, i As Long, k As Long
    Sub Macro1()
    On Error Resume Next
    Application.ScreenUpdating = False
     t = Range("a1:e" & Range("a65536").End(xlUp).Row)
     x = 1
    For i = 1 To UBound(t)
    If InStr(t(i, 5), toncritere) <> o Then 'a definir
    ReDim Preserve t2(1 To 5, 1 To x)
    For k = 1 To 5
    t2(k, x) = t(i, k)
    Next k: x = x + 1: End If: Next i
    Sheets(2).Range("a65536").End(xlUp).Offset(1, 0).Resize(UBound(t2, 2), UBound(t2, 1)) = Application.Transpose(t2)
    Erase t, t2
    Beep
    End Sub

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Par défaut
    Bonjour Laetitia,
    Je reposte ma réponse qui ne semble pas être passée.
    La macro que tu me proposes fonctionne, du moins les données filtrées sont bien affectées à la 2ème variable mais ça coince sur la fonction Transpose (je suis sur Excel 2003). Si je décommente "On error next", j'ai le message "erreur d'automation, l'objet s'est deconnecté de ses clients" et si je rajoute Worksheetfunction devant Transpose c'est le message "la fonction a échoué" qui sort. De toute manière aucune donnée n'est recopiée sur la 2ème feuille. J'ai trouvé une fonction qui remplace Transpose et j'ai adapté comme ça :
    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
    Sub FiltrerTab()
    Dim Montab As Variant
    Dim x As Long, I As Long, k As Long
    Dim varFiltre() As String
    On Error Resume Next
    Application.ScreenUpdating = False
    Montab = Range("a1:e" & Range("a65536").End(xlUp).Row)
     x = 1
    For I = 1 To UBound(Montab)
    If InStr(Montab(I, 5), "truc") <> 0 Then 'a definir
    ReDim Preserve varFiltre(1 To 5, 1 To x)
    For k = 1 To 5
    varFiltre(k, x) = Montab(I, k)
    Next k: x = x + 1: End If: Next I
    varFiltre = InverseTab(varFiltre, 1)
    Sheets(4).Range("A1").Offset(1, 0).Resize(UBound(varFiltre, 1), UBound(varFiltre, 2)) = varFiltre  'Application.WorksheetFunction.Transpose(varFiltre)
    Erase Montab, varFiltre
    Beep
    Application.ScreenUpdating = True
    End Sub
     
    Function InverseTab(T, Optional Base As Byte = 0) 'Zon
    'Base par défaut est à 0 mais si on est en base 1 lui donnner la valeur 1
    Dim Temp() As String, I As Long, J As Long
    ReDim Temp(Base To UBound(T, 2), Base To UBound(T))
    For I = LBound(T, 2) To UBound(T, 2)
    For J = LBound(T) To UBound(T)
    Temp(I, J) = T(J, I)
    Next J
    Next I
    InverseTab = Temp
    End Function
    Là, une bonne partie des lignes sont recopiées mais la macro sort de la boucle avant la fin du processus. peut-être un problème de saturation de la mémoire ? Certaines des cellules comportent plus de 3000 caractères.

    Olivier

  5. #5
    Membre Expert Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Par défaut
    re olivier le forum as tu essaye d enlever On Error Resume Next pour voir l erreur que tu as personnellement j ai teste sur 65000 lignes & 5 colomns pas d erreurs ma condition <>10 teste sous excel 2003 & 2007 pas de souci eventuellement teste avec toutes les variables declarees en variant pou voir

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Par défaut
    oui j'ai essayé de le faire en commentant la ligne on error next (et non pas le contraire comme indiqué dans mon post précédent !) et c'est là que j'ai ces messages "erreur automation" ou "la fonction a échoué" quand la macro arrive sur la commande de transposition. Cependant sur le critère de tri que j'ai testé en utilisant la fonction InverseTab, j'ai quand même une cinquantaine de ligne recopiées avant que ça plante (au lieu de 83 que je devrais avoir).

    Olivier

  7. #7
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    Il est difficile de faire des essai n'ayant pas de tableau comportant de si longue chaine (j'ai un peu la fleme la ^^) mais je pense que pour resoudre ton probleme il te faut utiliser le mode Pas a pas, en faisant un breack sur une valeur de I ou de J si tu sais que ta macro traite 50 lignes tu dois pouvoir en deduire a quel moment la macro plante et donc connaitre les valeure de I et J au moment du plantage.

    Si tu n'es pas coutumié du debugage, tu selectionne I clique droit->Ajouter un espion, et la tu met dans expression "I=... And J=..." les valeurs que tu aura determinées, puis tu coche breack si vrai.
    Ainsi quand I et J auront les valeurs attendues, le code se figera et tu pourras faire du pas a pas avec la touche F8.
    A++
    qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Par défaut
    Bonsoir QWazerty

    Je peux déja te dire que la celulle sur laquelle bute cette macro comporte 1011 caractères et toutes celles qui ont pu etre copiées avant ne dépassent pas 756
    Y aurait-il une limite au nombre de caractères que peut contenir une variable ?
    Olivier

  9. #9
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Re
    String -> F1 ->

    • Les chaînes de longueur variable peuvent contenir environ 2 milliards (2^31) de caractères.
    • Les chaînes de longueur fixe peuvent contenir de 1 à environ 64 Ko (2^16) de caractères.


    Donc la vérité est ailleurs agent Mulder ^^

    [Edit]
    Par contre un truc me chagrine un peu dans le code la function Transpose
    J'aurais laissé en Variant
    Le plus simple restant de nous mettre un fichier exemple sur lequel travailler[/edit]


    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  10. #10
    Membre Expert Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Par défaut
    bonjour le fil ma liste je l ais cree par macro mais avec une dizaine de caracteres par cellule pas de souci j ai refait la meme avec plus de 1000 caracteres ce matin cela marche plus meme sur une petite plage bizarre!!! jai recherche un peu on parle souvent de limitations a 1024 caracteres donc je retourne me coucher

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Par défaut
    Bonjour à tous
    ????!!!
    comme me l'a suggéré Qwazerty, j'ai passé varfiltre et temp en variant, et en testant sur un autre poste ou j'ai Excel 2000, surprise, ça marche !!!!. Par contre sur 2003, j'ai le message "erreur definie par l'application" sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(4).Range("A1").Offset(1, 0).Resize(UBound(varFiltre, 1), UBound(varFiltre, 2))=VarFiltre
    (?!!!)
    Olivier

Discussions similaires

  1. recherche dans une variable tableau
    Par le petit nicolas dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/05/2007, 12h41
  2. [VBA-E]Recherche dans une variable tableau
    Par illight dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/12/2006, 17h50
  3. Récupérer un résultat oracle dans une variable
    Par claralavraie dans le forum Linux
    Réponses: 4
    Dernier message: 09/01/2006, 16h59
  4. Récupérer contenu de fichier dans une variable
    Par peppena dans le forum Linux
    Réponses: 4
    Dernier message: 15/06/2005, 12h50
  5. Recuperer un champ calculé dans une variable....
    Par vijeo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 21/12/2004, 14h57

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