Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Manipuler un tableau vba

Calvus

XLDnaute Barbatruc
Bonsoir le Forum,

Un fichier avec une macro "Rapprochement", qui va puiser des données selon condition en feuille 1 pour les copier en feuille 3.
Ça fonctionne, mais c'est très lent.

J'ai donc essayé avec un tableau, mais j'y perds mon latin.
Je ne sais pas comment écrire le code équivalent à For each pour un tableau.
J'ai laissé le code avorté dans la macro nommée Rapp2.

Merci de votre aide.
 

Pièces jointes

  • Rapprochement en tableau.xlsm
    20.5 KB · Affichages: 59

thebenoit59

XLDnaute Accro
Re : Manipuler un tableau vba

Bonsoir Calvus.
J'ai supposé que ton critère est la valeur en colonne 4 supérieure à 0.

Code:
Sub Rapprochement_Forum()
Dim Tableau, Tableau2, d As Object
Dim i As Integer

'Mise en tableau de la zone
Tableau = Feuil1.Range("b5:g" & Feuil1.[b65000].End(xlUp).Row)

'On crée un index du tableau pour les valeurs supérieures à zéro en quatrième colonne
With Feuil3
Set d = CreateObject("scripting.Dictionary")
'On boucle le tableau sur la colonne 3 (les tableaux commencent à 0)
For i = LBound(Tableau) To UBound(Tableau)
    'Si la valeur est supérieure à 0 on ajoute le numéro de ligne à l'index
    If Tableau(i, 3) > 0 Then d(1) = d(1) & i & ":"
Next i
    'On extrait les lignes du premier tableau dans un second ainsi que les colonnes souhaitées
    Tableau2 = Application.Index(Tableau, Application.Transpose(Split(d(1), ":")), Array(1, 2, 3))
    'On insère les valeurs dans A1 de la feuille3
    .[a1].Resize(UBound(Tableau2) - 1, 3).Value = Tableau2
End With
End Sub
 

Dranreb

XLDnaute Barbatruc
Re : Manipuler un tableau vba

Bonjour.
VB:
Sub Rapp2()
Dim TE(), LE&, TR(), LR&, C&
With Application: .ScreenUpdating = False: .Calculation = xlManual: End With
Start = Timer

TE = Feuil1.Range("B5:G" & Feuil1.Range("G" & Rows.Count).End(xlUp).Row)
Rem. Vu le contexte, TE = Feuil1.AutoFilter.Range.Value et commencer
'    la boucle à LE = 2 marcherait aussi.
ReDim TR(1 To UBound(TE, 1), 1 To 3)
For LE = 1 To UBound(TE)
   If TE(LE, 6) = "Cl" Then
      LR = LR + 1
      For C = 1 To 3: TR(LR, C) = TE(LE, C): Next C
      End If: Next LE
Feuil3.[B6].Resize(UBound(TR, 1), 3).Value = TR

MsgBox "durée du traitement: " & Timer - Start & " secondes"
With Application: .ScreenUpdating = True: .Calculation = xlAutomatic: End With
End Sub
 

Lone-wolf

XLDnaute Barbatruc
Re : Manipuler un tableau vba

Bonsoir à tous

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Range("b4:g44").AutoFilter Field:=6, Criteria1:="Cl", Operator:=xlAnd
Range("b5:d44").SpecialCells(xlCellTypeVisible).Copy Feuil3.Range("b65536").End(xlUp)(2)
End Sub

Temps d'exécution: 0.02 (Moyenne)
 
Dernière édition:

Calvus

XLDnaute Barbatruc
Re : Manipuler un tableau vba

Bonsoir,

Merci de vos réponses.

@thebenoit59 : merci d'avoir fourni des explications dans le code.
Il y a néanmoins une petite erreur. La recherche se fait sur le critère" Cl".

@Dranreb : C'est la version la plus juste. Cependant, il s'inscrit une vingtaine de lignes vides et inutiles à la suite du tableau.
Y a t'il un moyen de parer à cela ?

@Lonewolf : C'est vraiment une extraction sur une autre page que je souhaite faire, et non pas un filtre.
Merci à vous trois.
 

klin89

XLDnaute Accro
Re : Manipuler un tableau vba

Bonsoir le fil,

Pour te faire découvrir la fonction Filter.
VB:
Sub test()
Dim x
    If Application.CountIf(Sheets("Feuil1").Columns(7), "cl") = 0 Then Exit Sub
    With Sheets("feuil1")
        With .Range("b4").CurrentRegion
            x = Filter(.Parent.Evaluate("transpose(if((" & .Columns(1).Address & _
                "=""date"")+(" & .Columns(6).Address & "=""cl""),row(1:" & _
                .Rows.Count & "),char(2)))"), Chr(2), 0)
            x = Application.Index(.Value, Application.Transpose(x), [{1,2,3}])
        End With
    End With
    Sheets("Feuil2").Range("a1").End(xlUp).Resize(UBound(x, 1), 3).FormulaLocal = x
End Sub
klin89
 

Lone-wolf

XLDnaute Barbatruc
Re : Manipuler un tableau vba

Re Calvus

Si tu as lu la macro correctement, après le filtrage les cellules sont copiées dans la feuille 3. Si tu veux copier celles-ci mais avec différents critères, il suffit de remplacer "Cl" par ActiveCell.Value.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Manipuler un tableau vba

C'est la version la plus juste. Cependant, il s'inscrit une vingtaine de lignes vides et inutiles à la suite du tableau.
Y a t'il un moyen de parer à cela ?
Je n'avais pas vu que c'était mis sous forme de tableau.
VB:
Sub Rapp2()
Dim TE(), LE&, TR(), LR&, C&, X As ListRows
With Application: .ScreenUpdating = False: .Calculation = xlManual: End With
Start = Timer

TE = Feuil1.Range("B5:G" & Feuil1.Range("G" & Rows.Count).End(xlUp).Row)
Rem. Vu le contexte, TE = Feuil1.AutoFilter.Range.Value et commencer
'    la boucle à LE = 2 marcherait aussi.
ReDim TR(1 To UBound(TE, 1), 1 To 3)
For LE = 1 To UBound(TE)
   If TE(LE, 6) = "Cl" Then
      LR = LR + 1
      For C = 1 To 3: TR(LR, C) = TE(LE, C): Next C
      End If: Next LE
With Feuil3.[B6].ListObject.ListRows
   If .Count > LR Then .Item(LR + 1).Range.EntireRow.Resize(.Count - LR).Delete
   End With
Feuil3.[B6].Resize(LR, 3).Value = TR

MsgBox "durée du traitement: " & Timer - Start & " secondes"
With Application: .ScreenUpdating = True: .Calculation = xlAutomatic: End With
End Sub
 

Calvus

XLDnaute Barbatruc
Re : Manipuler un tableau vba

Re,

Zêtes trop forts les gars !

Impec pour Thebenoit avec Tableau(i,6). Merci

Impec pour Klin89. Merci. encore du boulot... Tu trouves que je n'en n'ai pas assez ?

Mon cher Lonewolf, désolé, j'ai lu trop vite en effet, je n'avais pas vu le Feuil3 ! Donc impec également et mille mercis
 

klin89

XLDnaute Accro
Re : Manipuler un tableau vba

Re Calvus,

Avec la méthode Find :
VB:
Sub test()
Dim r As Range, ff As String, x As Range
    If Application.CountIf(Sheets("Feuil1").Columns(7), "cl") = 0 Then Exit Sub
    With Sheets("Feuil1").Range("B4").CurrentRegion
        With .Columns(6)
            Set r = .Find("cl", , , 1)
            If Not r Is Nothing Then
                ff = r.Address
                Do
                    If x Is Nothing Then
                        Set x = Union(.Cells(, -4), .Cells(, -3), .Cells(, -2), r(, -4), r(, -3), r(, -2))
                    Else
                        Set x = Union(x, r(, -4), r(, -3), r(, -2))
                    End If
                    Set r = .FindNext(r)
                Loop Until r.Address = ff
            End If
        End With
    End With
    If Not x Is Nothing Then
        x.Copy Sheets("Feuil2").Range("a1")
    End If
End Sub
klin89
 

Calvus

XLDnaute Barbatruc
Re : Manipuler un tableau vba

Bonjour Klin, le Forum,

Ben j'ai de quoi faire là !
Je ne connaissais pas Union.
Tu m'en veux ou quoi de me donner autant de boulot ?

Merci et à bientôt.
 

Si...

XLDnaute Barbatruc
Re : Manipuler un tableau vba

salut

Si...
Tu m'en veux ou quoi de me donner autant de boulot ?

pour ce titre, t’ayant déjà proposé des Tableaux, voici ma participation (avec ma syntaxe)
Code:
Option Compare Text
Sub test()
  Dim T(), TT(), n As Long, m As Long
  If Application.CountIf([TO[Genre]], "cl") = 0 Then Exit Sub
  T = [To].Value
  f = [To].Rows.Count: ReDim TT(1 To f, 1 To 3)
  If [TC].Item(1, 1) <> "" Then [TC].Delete
  For n = 1 To f
    If T(n, 6) = "cl" And T(n, 3) <> "" Then
      m = m + 1: TT(m, 1) = T(n, 1): TT(m, 2) = T(n, 2): TT(m, 3) = T(n, 3)
    End If
  Next
  [TC[Date]].Resize(m, 3) = TT
End Sub

Le grain à moudre est dans le fichier joint. J'ai choisi de passer par des tableaux VBA pour la rapidité (pas de la réponse mais de la macro ).

Nota : j'ai rajouté une macro (facultative) pour alléger le fichier s'il arrivait qu'il s'engraisse.
 

Pièces jointes

  • Copie parties de Tableau(VBA).xlsm
    27.3 KB · Affichages: 40

Discussions similaires

Réponses
0
Affichages
355
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…