XL 2010 Récupérer certaines d'1 tableau dans 1 autre

cathodique

XLDnaute Barbatruc
Bonjour:),

En ce dimanche, j'ai voulu améliorer ma manipulation des tableaux. Mais, je m’emmêle les "pinceaux" comme on dit. Je m'en remets à vous pour me venir en aide.
Je récupère dans un tableau certains colonnes de la feuille. Je voudrai extraire de ce tableau dans un autre tableau certaines lignes remplissant les conditions suivantes:
If Tb(i, 3) <> "A" Or Tb(i, 3) <> "C" Then
Là, je suis perdu.
VB:
Option Explicit

Sub Tableau()
    Dim Tb1(), Tb(), i As Integer, j As Byte, n As Integer, Tb2()

    With Feuil1.Range("A2:F" & Cells(Rows.Count, 1).End(xlUp).Row)
        Tb = Application.Index(.Value, Evaluate("row(1:" & .Rows.Count & ")"), Array(1, 2, 5, 6))
    End With
'à partir d'ici je suis perdu
    n = 0
    For i = LBound(Tb) To UBound(Tb)
        For j = 1 To 4
            If Tb(i, 3) <> "A" Or Tb(i, 3) <> "C" Then
                  n = n + 1
                ReDim Preserve Tb1(1 To UBound(Tb), 1 To n)
                Tb1(i, n) = Tb(i, j)
            End If
        Next j
    Next i
'    Tb2 = Application.Transpose(Tb1)
Stop
End Sub
En vous remerciant par avance.

Bon dimanche.
 

Pièces jointes

  • MonTableau.xlsm
    18.5 KB · Affichages: 38
Solution
Bonjour Cathodique:), Patrick;), Sylvanu;),

D'après ce que j'ai compris du fil, un essai
VB:
Option Explicit

Sub Tableaux()
    Dim Tb(), Tb1(), Tb2(), i%, j%, n%
    DL = Application.Max(Range("H65500").End(xlUp).Row, 2)
    Range("H2:K" & DL).ClearContents
    Application.ScreenUpdating = False
    With Feuil1.Range("A2:F" & Cells(Rows.Count, 1).End(xlUp).Row)
        Tb = Application.Index(.Value, Evaluate("row(1:" & .Rows.Count & ")"), Array(1, 2, 5, 6))
    End With
    '''''''''''''''''''''''''''''''
    For i = 1 To UBound(Tb)
        If Tb(i, 3) = "B" Or Tb(i, 3) = "D" Then
            n = n + 1
            ReDim Preserve Tb1(1 To 4, 1 To n)
            For j = 1 To 4
                Tb1(j, n) = Tb(i, j)
            Next j...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Cathodique, Patrick, CP4,
D'un point de vue purement didactique, on peut simplifier la procédure en dimensionnant TB1 directement avec la taille de TB, ce qui évite les redimensionnements dynamiques dans le IF.
A la fin le Preserve permet de supprimer les lignes vides.
 

Pièces jointes

  • MonTableau (4).xlsm
    20.5 KB · Affichages: 5

patricktoulon

XLDnaute Barbatruc
re
bonjour @sylvanu
Ah!!! enfin 1 qui percute ;)
on peut aussi garder cette dimension en terme de ligne et simplement et ne faire QUE!!!!! le resize de H2 avec l'indice de boucle"n"
en gros on ne redim preserve rien du tout
VB:
Sub Tableau()
    Dim Tb, Tb2(), i&, j&, n&, col
    [H2].Resize(Cells(Rows.Count, "H").End(xlUp).Row, 4).ClearContents
    Tb = Feuil1.Range("A2:F" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    ReDim Tb2(1 To UBound(Tb), 1 To 4)

    col = Array(1, 2, 5, 6)
    n = 0
    For i = 1 To UBound(Tb)
        If Tb(i, 1) <> "" And tb(i,5)<>"" And Tb(i, 5) <> "A" And Tb(i, 5) <> "C") Then    'si ligne non vide et colonne 5 différent de "A" et "C" en col 5
             n = n + 1
            For j = 0 To 3: Tb2(n, j + 1) = Tb(i, col(j)): Next j
        End If
    Next i
    Feuil1.[H2].Resize(n, UBound(col) + 1) = Tb2
End Sub
pour les lignes = "A" ou "C" en col 5
VB:
   If Tb(i, 1) <> "" And (Tb(i, 5) = "A" Or Tb(i, 5) = "C") Then 'si ligne non vide et et colonne 5 = "A" ou "C"

c'est ce que j'essaie d'expliquer en page 1 du topic
vous dimensionnez et faite une union de colonne sur count lignes puis vous reconstruisez un new tableau en le redimensionnant
c'est absurde !!!

autant prendre le tableau complet au départ et dimensionner le tableau2 même ligne sur 4 colonnes

après je pense que cathodique cherche plutôt a apprendre le redim preserve en transposant pour ne redimensionner que les colonnes dans le résultat
c'est pour ça qu'il insiste avec une de tes méthode proposées
sinon c'est largement plus simple et propre et plus rapide avec ma méthode
 

patricktoulon

XLDnaute Barbatruc
j'ajouterais même que tester ligne vides est inutile pour "A" et "C" en col 5 (je l'ai déjà dit me semble t il )
VB:
Option Explicit

Sub Tableau()
    Dim Tb, Tb2(), i&, j&, n&, col
    [H2].Resize(Cells(Rows.Count, "H").End(xlUp).Row, 4).ClearContents
    Tb = Feuil1.Range("A2:F" & Cells(Rows.Count, 1).End(xlUp).Row).Value
  
   col = Array(1, 2, 5, 6)
    ReDim Tb2(1 To UBound(Tb), 1 To UBound(col) + 1)
     n = 0
    For i = 1 To UBound(Tb)
        If (Tb(i, 5) = "A" Or Tb(i, 5) = "C") Then 'si colonne 5 = "A" ou "C"
            n = n + 1
            For j = 0 To 3: Tb2(n, j + 1) = Tb(i, col(j)): Next j
        End If
    Next i
    [H2].Resize(n, UBound(col) + 1) = Tb2
End Sub
 

cp4

XLDnaute Barbatruc
Bonjour cathodique, Sylvanu, Patrick;),

@sylvanu , @patricktoulon : J'ai ouvert le fichier du premier post de cathodique dans son exemple il n'y a pas de lignes vides. C'est Sylvanu qui les a ajouté. Au post#8, il fait une capture d'écran de la fenêtre Espion. Il me semble qu'il s'agit du tableau final qui a les mêmes dimensions que le tableau de départ (c'est la fin du tableau qui est vide).
En effet, pour lui et je trouve ça logique, c'est comme pour un filtrage les dimensions du tableau doivent correspondre aux lignes filtrées. Du moins c'est ainsi que j'ai compris son problème.

Bonne soirée.
 

patricktoulon

XLDnaute Barbatruc
re
bonjour cp4
oui je pense que l'on a tous compris

j'essaie de vous faire comprendre que vous utilisez un moulin inutile tout du moins sous cette forme
et dans ce contexte
vous supprimez des colonnes :
alors que c'est pas la peine si vous reconstruisez le tableau dans la double boucle imbriquée (i/j)

j'ai quand même un peu l'impression de parler a des sourds

apprendre le vba (variables tableaux):
ça n'est pas que connaitre une syntaxe et de faire des exercices de style
c'est aussi savoir choisir la méthode appropriée et les bonnes et suffisantes ressources ;)

là de tout ce que j'ai vu ça n'est pas le cas
pour certains qui débutent je peux comprendre mais dans cette discussion je ne vois pas de débutants ;)

vous avez des outils servez vous en correctement ;) n'oubliez pas qu'il y en a pas mal de personnes qui vous lisent et ils ont pas votre niveau alors autant les mettre sur le bon chemin

perso je reste sur ma version elle est simple ,propre et tout le monde peut la comprendre même un débutant pas la peine d'en rajouter

perso je pense qu'il est inutile de boucler sur ligne/colonnes si on a pas l'intention de modifier des items dans une variable tableau

for...for...redim preserve...next..next après un application.index non mais ça va pas la tète🤣🤣🤣🤣
 

cp4

XLDnaute Barbatruc
re
bonjour cp4
oui je pense que l'on a tous compris

j'essaie de vous faire comprendre que vous utilisez un moulin inutile tout du moins sous cette forme
et dans ce contexte
vous supprimez des colonnes :
alors que c'est pas la peine si vous reconstruisez le tableau dans la double boucle imbriquée (i/j)

j'ai quand même un peu l'impression de parler a des sourds

apprendre le vba (variables tableaux):
ça n'est pas que connaitre une syntaxe et de faire des exercices de style
c'est aussi savoir choisir la méthode appropriée et les bonnes et suffisantes ressources ;)

là de tout ce que j'ai vu ça n'est pas le cas
pour certains qui débutent je peux comprendre mais dans cette discussion je ne vois pas de débutants ;)

vous avez des outils servez vous en correctement ;) n'oubliez pas qu'il y en a pas mal de personnes qui vous lisent et ils ont pas votre niveau alors autant les mettre sur le bon chemin

perso je reste sur ma version elle est simple ,propre et tout le monde peut la comprendre même un débutant pas la peine d'en rajouter

perso je pense qu'il est inutile de boucler sur ligne/colonnes si on a pas l'intention de modifier des items dans une variable tableau

for...for...redim preserve...next..next après un application.index non mais ça va pas la tète🤣🤣🤣🤣
@patricktoulon : Personne n'a critiqué ta méthode. Même cathodique l'a approuvée. J'ai répondu comme j'ai cru comprendre la demande. Ensuite, personnellement je suis un "VBAiste" du dimanche. Je n'ai jamais prétendu maitriser parfaitement le codage. Je code pour le plaisir, j'essaie d'apprendre pour ne pas mourir idiot. Mais surtout pour maintenir les quelques neurones qui me restent fonctionnelles.
J'essaie d'aider avec mes minuscules connaissances. De plus il faut de tout pour faire un monde, des nuls, des moins nuls, des bons, des meilleurs et de brillants. Je fais partie des moins nuls.

Tiens je dormirai moins bête ce soir grâce à toi. J'ai appris un truc 2 en 1. Le problème est: est-ce que je vais retenir ta méthode? J'en doute car je n'ai pas une mémoire XXL.

Bonne soirée.
Bonne soirée.
 

patricktoulon

XLDnaute Barbatruc
re
j'ai des défaut de mémoire moi aussi ( des fois j'oublie que je sais 🤣 )c'est bien pour ça que je me suis fait ma propre librairie de code que je rédige au fur et a mesure quand j'en ai besoins je tape dans le moteur de recherche de mon explorateur
et si j'ai je relis

tiens kado variable tableau et application .index
tu te met ca de coté quand tu en a besoins tu le relis
 

Pièces jointes

  • EVAUATE ET VARIABLES TABLEAU EPIDODE 1.pdf
    43.1 KB · Affichages: 10

cp4

XLDnaute Barbatruc
re
j'ai des défaut de mémoire moi aussi ( des fois j'oublie que je sais 🤣 )c'est bien pour ça que je me suis fait ma propre librairie de code que je rédige au fur et a mesure quand j'en ai besoins je tape dans le moteur de recherche de mon explorateur
et si j'ai je relis

tiens kado variable tableau et application .index
tu te met ca de coté quand tu en a besoins tu le relis
Bonjour Patrick;),

Merci beaucoup pour le KADO. Je te suis très reconnaissant.
C'est ce que je fais (archivage), J'en ai tellement que je m'y perd.
J'espère me souvenir des bons mots (arguments) de recherche pour retrouver ton kado.

Encore merci, bonne journée.

edit: Est-ce que tu m'autorises à modifier la mise en page afin de réduire le nombre de page pour une impression. Je viens de décider d'avoir recours aux bonnes vieilles méthodes d'archivage. Papier, classeur et pochettes transparentes, et imprimer les codes essentiels pour constituer une archive à portée de main.
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Bonjour Cathodique:), Patrick;), Sylvanu;),

D'après ce que j'ai compris du fil, un essai
VB:
Option Explicit

Sub Tableaux()
    Dim Tb(), Tb1(), Tb2(), i%, j%, n%
    DL = Application.Max(Range("H65500").End(xlUp).Row, 2)
    Range("H2:K" & DL).ClearContents
    Application.ScreenUpdating = False
    With Feuil1.Range("A2:F" & Cells(Rows.Count, 1).End(xlUp).Row)
        Tb = Application.Index(.Value, Evaluate("row(1:" & .Rows.Count & ")"), Array(1, 2, 5, 6))
    End With
    '''''''''''''''''''''''''''''''
    For i = 1 To UBound(Tb)
        If Tb(i, 3) = "B" Or Tb(i, 3) = "D" Then
            n = n + 1
            ReDim Preserve Tb1(1 To 4, 1 To n)
            For j = 1 To 4
                Tb1(j, n) = Tb(i, j)
            Next j
        End If
    Next i
    Tb12 = Application.Transpose(Tb1)

    Range("$H$2").Resize(UBound(Tb12, 1), UBound(Tb12, 2)) = Tb12
End Sub
Bonne journée.
Bonjour tout le monde:),

toutes mes excuses pour mon retard. C'est ce que je voulais obtenir. Car je n’arrivais pas à faire passer une condition. Maintenant que je suis un peu à l'aise. J'ouvre une autre discussion pour comprendre le pourquoi de la chose.

Encore merci à vous tous.

Bonne journée.
 

ChTi160

XLDnaute Barbatruc
Bonjour les Artistes lol
Dans
VB:
Tb = Application.Index(.Value, Evaluate("row(1:" & .Rows.Count & ")"), Array(1, 2, 5, 6))
Dans le Evaluate ne serait il pas préférable de déterminer la Dernière ligne non vide au lieu de .Rows.Count ?
Je ne sais pas si ça a un intérêt d'où ma question.
Merci par avance
Bonne journée
Jean marie
 

patricktoulon

XLDnaute Barbatruc
bonjour @ChTi160
le ".rows.count " dans cette ligne de code s’arrête a la dernière ligne de la plage (et non de la feuille)
la récupération des lignes valides se fait après dans le modèle des autres(pas dans le mien)
dans ce contexte il est inutile de rajouter encore un travail qui aurait pour but de déterminer le .end(xlup)
ça serait repartir encore dans le travers de multiplier les actions inutiles

d'ailleurs tout ce toin toin est absolument inutile puisque cathodique insiste sur l'utilisation d'une double boucle imbriquée avec redim preserve

alors qu'avec mon modèle de sélection de ligne a priori la ligne (tb=application.index....) il serait facile d'ajouter la condition ligne vide

:rolleyes: :rolleyes: :rolleyes:
 

patricktoulon

XLDnaute Barbatruc
re
Tiens @ChTi160
voila comment je fait pour faire sauter les lignes vides
VB:
Sub Tableau()
    Dim Tb, I&, tablo, it, lignes, L$
    With Feuil1.Range("A2:F" & Cells(Rows.Count, 1).End(xlUp).Row)
        tablo = .Value
        For I = 1 To UBound(tablo)
            If Trim(Join(Application.Index(tablo, I, 0))) <> "" And tablo(I, 5) <> "A" And tablo(I, 5) <> "C" Then it = it & " " & I
        Next
        lignes = Application.Transpose(Split(Trim(it), " "))
        Tb = Application.Index(.Value, lignes, Array(1, 2, 5, 6))
    End With
    [H2].Resize(UBound(Tb), UBound(Tb, 2)) = Tb
End Sub
 

ChTi160

XLDnaute Barbatruc
Merci Patrick
je suis très friand de tes Codes Lol
si tu avez de quoi m'enseigner la Fonction Index que je ne maitrise pas , je t'en serai reconnaissant
je viens de voir ca Lol
ls sont surtout facile a comprendre ;) a partir du moment ou on maîtrise l'utilisation de application.index et toutes ses possibilités
jean marie
 
Dernière édition:

Discussions similaires

Réponses
11
Affichages
314

Statistiques des forums

Discussions
312 370
Messages
2 087 691
Membres
103 641
dernier inscrit
anouarkecita2