Suppression ligne d'une variable de type "Variant"

richert90

XLDnaute Occasionnel
Bonjour à tous,

Voici le code où j'ai un souci:

sub test()

Dim plage_traitement As Range 'plage de données
Dim v_traitement As Variant

Set plage_traitement = Sheets("traitement").Range("A1:X" & nb_ligne_traitement)
v_traitement = plage_traitement

For i = 100 To 2 Step -1 'on part de la fin car on va supprimer des lignes
If Not v_traitement(i, 1) Like "2*" Then
Rows(i & ":" & i).Delete Shift:=xlUp
End If
Next i

plage_traitement = v_traitement 'On copie nos données de la variable "Variant" dans Excel.

end sub



En fait, je travaille dans un type variant (une sorte de tableau dans le cas ici), mais lorsque je parcours ce variant, je supprime une ligne du fichier Excel et non pas une ligne du tableau (v_traitement). Comment faire pour supprimer une ligne dans la variable v_traitement? J'ai pensé à : "v_traitement(i, 1).EntireRow.Delete" sans succès.


Merci d'avance,
 

Jacky67

XLDnaute Barbatruc
Bonjour à tous,

Voici le code où j'ai un souci:

sub test()

Dim plage_traitement As Range 'plage de données
Dim v_traitement As Variant

Set plage_traitement = Sheets("traitement").Range("A1:X" & nb_ligne_traitement)
v_traitement = plage_traitement

For i = 100 To 2 Step -1 'on part de la fin car on va supprimer des lignes
If Not v_traitement(i, 1) Like "2*" Then
Rows(i & ":" & i).Delete Shift:=xlUp
End If
Next i

plage_traitement = v_traitement 'On copie nos données de la variable "Variant" dans Excel.

end sub



En fait, je travaille dans un type variant (une sorte de tableau dans le cas ici), mais lorsque je parcours ce variant, je supprime une ligne du fichier Excel et non pas une ligne du tableau (v_traitement). Comment faire pour supprimer une ligne dans la variable v_traitement? J'ai pensé à : "v_traitement(i, 1).EntireRow.Delete" sans succès.


Merci d'avance,

Bonjour,
Cela pourrait ressembler à cela:
VB:
Sub jj()
    Dim nb_ligne_traitement As Long, i As Long
    Dim plage_traitement As Range    'plage de données
    nb_ligne_traitement = 10    ' a adapter ou calculer selon tes dispositions
    Set plage_traitement = Sheets("traitement").Range("A2:X" & nb_ligne_traitement)
    For i = nb_ligne_traitement To 2 Step -1    'on part de la fin car on va supprimer des lignes
        If Cells(i, 1) Like "2*" Then
            'on ne prend que 'colonne A ligne i' à 'colonne X ligne i'
            Range(Cells(i, 1), Cells(i, "X")).Delete Shift:=xlUp
        End If
    Next i
End Sub

Salutations
JJ
 

richert90

XLDnaute Occasionnel
Bonjour,

Merci pour la réponse.

Mais en fait, je tiens à passer par un tableau comme je l'ai fait car c'est un gain de temps d’exécution énorme:
--> Je définis la zone sur laquelle je travaille, je la mets dans un range (variable plage_traitement). Je définis ensuite un range (variable v_traitement) et je mets mon range dans le Variant. Je travaille donc sur le variant pour éviter les accès à la feuille et cela offre un gain de temps énorme(car mon prg est + long que ça en réalité). Tout à la fin je remets le Variant dans le range (plage_traitement = v_traitement).

Et le souci que j'avais c'est que la suppression de ma ligne se faisait directement sur la feuille Excel alors que je travaille sur le Variant. J'aimerais pourvoir supprimer la ligne dans le variant.

Merci d'avance,
 

richert90

XLDnaute Occasionnel
Bonsoir,

Merci pour votre proposition.

Je vais me plonger dedans et voir si j'arrive à l'adapter à mon cas (car le code que j'ai mis était juste une petite partie).

Mais juste pour savoir, on ne peut pas supprimer une ligne contenue dans une variable Variant aussi facilement que sur un onglet Excel?
 

eriiic

XLDnaute Barbatruc
Bonjour,

v_traitement n'est pas une sorte de tableau, c'est un tableau et plus du tout un range dont le parent est une une feuille.
Regarde les deux dans la fenêtre espion.
Et construire un nouveau tableau comme le fait tatiak sera plus rapide (et moins ch....) que de supprimer des lignes.
eric

Ps : fonctionne quelque soit le nb de lignes de la feuille "traitement"
En fait limité à 65536 lignes à cause du .Transpose() si je ne m'abuse.
 

Jacky67

XLDnaute Barbatruc
Bonjour à tous,
Chez moi, xl2007
La macro plante à
'ReDim T2(UBound(T1, 2), idx)'
Erreur d'exécution 9 :(
Celle-ci, origine
'http://www.commentcamarche.net/forum/affich-27817480-suppression-de-lignes-grand-tableau-vba
Fonctionne sans problème :)
VB:
Sub supprimer()
'extrait et adapter de
'http://www.commentcamarche.net/forum/affich-27817480-suppression-de-lignes-grand-tableau-vba

    Dim Derlig As Long, Dercol As Byte, PlageSource()
    Dim C As Long, PlageCible(), C_out As Long, Col As Byte
    Application.ScreenUpdating = False
        With Sheets("traitement")
        Derlig = 10 ' a adapter
        Dercol = 24 ' colonne X
        PlageSource = .Range("A2", Cells(Derlig, Dercol)).Value
        ReDim PlageCible(Dercol, 1)
        For C = 1 To UBound(PlageSource)
            If PlageSource(C, 1) Like "2*" Then
                C_out = C_out + 1
                ReDim Preserve PlageCible(Dercol, C_out)
                For Col = 1 To Dercol
                    PlageCible(Col, C_out) = PlageSource(C, Col)
                Next Col
            End If
        Next C
        .Range(.Cells(2, "A"), .Cells(Derlig, Dercol)).ClearContents
        .Range("A2").Resize(C_out, Dercol) = Application.Transpose(PlageCible)
    End With
End Sub

Je rajoute, que je serais intéressé par le code passant outre la limitation de 'transpose'
Merci à vous
JJ
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Jacky67=Richert90 ?

Splitter = découper. Tu colles par paquets de 60000 lignes que tu décales d'autant à chaque fois.

Sinon, au prix d'un ,1 qu'on se balade tout le temps, il y plus simple avec un tableau à 2 dimensions :
Code:
    Dim datas, result(), lig As Long
    datas = [A2].Resize(Cells(Rows.Count, 1).End(xlUp).Row - 1, 3).Value
    ReDim result(1 To UBound(datas, 1), 1 To 1)
    For lig = 1 To UBound(result)
        result(lig, 1) = datas(lig, 1)+datas(lig, 2)
    Next lig
    [D2].Resize(UBound(result), UBound(result, 2)) = result
Il faut cependant le dimensionner à la taille du maximum de lignes possibles en résultat, il faut de la place en-dessous. Sinon le transférer dans un tableau à la taille ajustée avant le collé.
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Perso je ferais probablement comme ça :
VB:
Sub test()
Const NbLignes = 100 ' À adapter
Dim Plg As Range
Dim T() As Variant, LE As Long, LS As Long, C As Long
Set Plg = Sheets("traitement").Range("A1:X" & NbLignes)
T = Plg.Value
For LE = 2 To UBound(T, 1)
  If T(LE, 1) Like "2*" Then
     LS = LS + 1
     For C = 1 To UBound(T, 2): T(LS, C) = T(LE, C): Next C: End If
  Next LE
While LS < UBound(T, 1)
  LS = LS + 1
  For C = 1 To UBound(T, 2): T(LS, C) = Empty: Next C: Wend
Plg.Value = T
End Sub
 

Jacky67

XLDnaute Barbatruc
Jacky67=Richert90 ?

Splitter = découper. Tu colles par paquets de 60000 lignes que tu décales d'autant à chaque fois.

Sinon, au prix d'un ,1 qu'on se balade tout le temps, il y plus simple avec un tableau à 2 dimensions :
Code:
    Dim datas, result(), lig As Long
    datas = [A2].Resize(Cells(Rows.Count, 1).End(xlUp).Row - 1, 3).Value
    ReDim result(1 To UBound(datas, 1), 1 To 1)
    For lig = 1 To UBound(result)
        result(lig, 1) = datas(lig, 1)+datas(lig, 2)
    Next lig
    [D2].Resize(UBound(result), UBound(result, 2)) = result
Il faut cependant le dimensionner à la taille du maximum de lignes possibles en résultat, il faut de la place en-dessous. Sinon le transférer dans un tableau à la taille ajustée avant le collé.
RE..
Ok Merci
Je vais tester dans le sens 2 dimensions
Bonne nuit

Je n'avais pas vu
Jacky67=Richert90 ?
Ben non, le demandeur est bien "Richert90".
Moi, c'est par curiosité seulement,.. pour ma culture informatique :rolleyes:
 
Dernière édition:

Jacky67

XLDnaute Barbatruc
Bonsoir.
Perso je ferais probablement comme ça :
VB:
Sub test()
Const NbLignes = 100 ' À adapter
Dim Plg As Range
Dim T() As Variant, LE As Long, LS As Long, C As Long
Set Plg = Sheets("traitement").Range("A1:X" & NbLignes)
T = Plg.Value
For LE = 2 To UBound(T, 1)
  If T(LE, 1) Like "2*" Then
     LS = LS + 1
     For C = 1 To UBound(T, 2): T(LS, C) = T(LE, C): Next C: End If
  Next LE
While LS < UBound(T, 1)
  LS = LS + 1
  For C = 1 To UBound(T, 2): T(LS, C) = Empty: Next C: Wend
Plg.Value = T
End Sub
Bonjour Dranreb
Donc, si j'ai bien compris le cheminement, plus de contrainte du nombre de ligne.
Est-ce bien cela ?

JJ
 

Dranreb

XLDnaute Barbatruc
Oui, on prend et on garde le nombre de lignes de la plage traitée.
Information: Pour d'autres besoins, ça ne gène pas, pour l'affecter à la Value d'un Range, si un tableau est trop grand.
Les lignes et colonnes en trop sont tout simplement ignorées.
 

Jacky67

XLDnaute Barbatruc
Oui, on prend et on garde le nombre de lignes de la plage traitée.
Information: Pour d'autres besoins, ça ne gène pas, pour l'affecter à la Value d'un Range, si un tableau est trop grand.
Les lignes et colonnes en trop sont tout simplement ignorées.
Ok, merci beaucoup, je vais me réserver la compréhension "total" pour les longues soirées d'hiver:D
Et ce n'est pas gagné:(
Bonne nuit
 

Discussions similaires

Réponses
12
Affichages
225