Copier un nombre très important de lignes

Bonjour à tous,

Je suis intervenu auprès d'un demandeur de notre Forum pour essayer de l'aider. Pas de problèmes c'est fait mais je me pose une grosse question :

Il désire, après triage parmi 7200 lignes d'une feuille, copier dans une autre feuille toutes les lignes dans lesquelles apparait le nom de la feuille, et ceci est à réaliser sur une bonne dizaine de feuilles différentes
Je lui ai proposé ceci :

    MaFeuille = ActiveSheet.Name
    der = Sheets("Base de données").Cells(Rows.Count, 1).End(xlUp).Row  ' der vaut 7200
    rg = 1
    For i = 1 To der
    Sheets("Base de données").Activate
    If Sheets("Base de données").Range("B" & i).Value = MaFeuille Then  ' c'est dans les cellules de la colonne B que l'on trouve les noms des feuilles
        Sheets("Base de données").Range("A" & i & ":O" & i).Copy
        Sheets(MaFeuille).Activate
        Sheets(MaFeuille).Range("A" & rg).Select
        rg = rg + 1
        ActiveSheet.Paste
    End If
    Next i

et je réponds bien à sa question si ce n'est, et je m'en doutais, que ça met un temps fou pour se réaliser. Même à un moment on me signale qu'il y a saturation.

Pourriez vous me proposer une solution plus agréable

Bonsoir,

l'idée est de passer par VBA car en effet chaque accès feuille ralenti énormément le déroulé du code VBA, c'est ce que fait le fichier joint :

On demande la recherche de la valeur d_10 pour l'exemple, le programme "sort" toutes les lignes comportant cette données.
Tout est fait en mémoire vu que le tableau de données est injecté dans la variable TabDonnées, les résultats des recherches se trouve dans la variable TabRésultat.

Ici le résultat est mis dans une ListeBox, mais on peut très bien le mettre sur une feuille avec Transpose.

N'hésitez pas si besoin d'aide, mais peut-être qu'une solution PowerQuerry....

@ bientôt

LouReeD

Bonsoir LouReed,

En effet chaque accès à une feuille ralenti le déroulé, je m'en étais rendu compte et c'est bien pour cela que j'ai soulevé le problème sur le Forum
Ce que tu me proposes me parait intéressant, je vais donc approfondir ta proposition
Quant à powerQuerry, je ne connais pas, la aussi il faudra m'y pencher
merci pour ta réactivité et tes conseils
Au plaisir sur le Forum

Bonjour à tous,

Bonsoir,

N'hésitez pas si besoin d'aide, mais peut-être qu'une solution PowerQuerry....

pas de power query en excel 2007, ce qui bien dommage !

Crdlmt

Bonsoir,

voici le code adapter avec une shape comme bouton sur la feuille Données :

Sub CréerFeuilles()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = flase
    On Error GoTo fin
    Dim Der, I As Integer
    Dim Nom_Feuille As String
    Dim TabRésultat(), TabEntête()
    ' on récupère la dernière ligne
    Der = Sheets("Base de données").Cells(Rows.Count, 1).End(xlUp).Row
    ' on récupère les données du tableau de la feuille données
    TabDonnées = Range("A1:O" & Der)
    TabEntête = Range("A1:O1")
    For I = 2 To Der
        Nom_Feuille = TabDonnées(I, 2)
        ' si la valeur de la donnée est différente de rien
        If Nom_Feuille <> "" Then
            ' Ajouter la feuille seulement si elle n'existe pas déjà et que son nom contient plus de 0 caractères
            If Feuille_Existe(Nom_Feuille) = False Then
                Worksheets.Add(After:=Sheets(Sheets.Count)).Name = Nom_Feuille
                ' valeur recherchée
                Recherche = TabDonnées(I, 2)
                ' si ligne = -1 alors c'est ColExtract qui est pris en compte, sinon c'est ligne
                ' si ligne = 0 alors extraction de toutes les colonnes sans mélange
                Ligne = 0
                ' ici facultatif vu que l'on extrait toutes les colonnes
                ' mais on pourrait en profiter pour modifier l'ordre de ces colonnes
                ColExtract = Array(1, 5, 11, 8)
                ' on remplie le tableau résultat avec la fonction LRD
                TabRésultat = LRD(Recherche, 2, TabDonnées, ColExtract, Ligne)
                ActiveSheet.Range("A2").Resize(UBound(TabRésultat, 1), 15) = Application.Transpose(Application.Transpose(TabRésultat))
                ' on copie la ligne d'entête
                ActiveSheet.Range("A1").Resize(, 15) = TabEntête
            End If
        End If
    Next I
fin:
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
End Sub

Function Feuille_Existe(Nom_Feuille As String) As Boolean
    ' test feuille existante en gestion d'erreur
    ' on essaie de récupérer la valeur de la cellule A1
    ' si erreur feuille inconnue
    ' sinon feuille existante
    Dim Test As Variant
    ' on met la fonction à VRAI
    Feuille_Existe = True
    ' gestion des erreurs
    On Error Resume Next
    ' on récupère la valeur en cellule A1 de la feuille testée
    Test = Sheets(Nom_Feuille).Range("A1")
    ' s'il y a une erreur la feuille n'existe pas
    If Err > 0 Then Feuille_Existe = False
End Function

Function LRD(Recherche, ColRecherche, TabDonnées, ColExtractArr, Ligne)
    Dim TabRésultat(), Cpt, I, J
    Cpt = 0
    ' Scan pour récupérer les données en fonction d'un test (ou plus) sur une ou plusieurs colonnes
    For I = 2 To UBound(TabDonnées)
        ' la condition recherchée
        If TabDonnées(I, 2) = Recherche Then
            ' on agrandi le tableau résultat
            ReDim Preserve TabRésultat(Cpt)
            ' on y met les résultats trouvés
            TabRésultat(Cpt) = WorksheetFunction.Index(TabDonnées, I, IIf(Ligne = -1, ColExtractArr, Ligne))
            Cpt = Cpt + 1
        End If
    Next I
    LRD = TabRésultat
End Function

Pas testé...

@ bientôt

LouReeD

bonjour le fil, salut LouReeD,

je pense que votre macro est encore lent, mais pourquoi pas utiliser la méthode oldschool avec filtrer la source, copier et coller le résultat vers une nouvelle feuille ?

Je vous laisse le soin de le faire !

Moi je suis bloqué en 2014 avec mes pauvres connaissances !

Il est vrai qu'un filtre copier/coller et hop !

Mais je ne maitrise pas les codes de filtrage alors j'attends de voir et on verra à l'avenir si j'arrive à m'en souvenir !

Mais surtout cette méthode à l'origine était faite pour extraire qu'une partie des données de la ligne qui "match" avec une donnée cherché dans n'importe quelle colonne, tout en ayant la possibilité de mélanger les colonnes dans le tableau TabRésultat.
Mais avec un filtre cela irait encore plus vite en effet !

@ bientôt

LouReeD

bonjour LouReeD,

"Blad1" contient des chiffres de 1 à 100 plage de 500*27 cellules, la macro "Jacky" les cherche 1 par 1 et les met dans une nouvelle feuille.

Chez moi, supprimer 100 feuilles = 0,6 sec, ajouter 100 feuilles vides = 0.9 sec, ajouter 100 feuilles avec valeurs "filtrées" + MFC = 1.6 sec (mais variable), donc le temps supplémentaire pour coller les données filtrées + appliquer une MFC 100 fois = 0.7 sec (oubien 0.007 sec par valeur)

@Jacky, vous avez un fichier ?

Salut Bart, salut LouReed

Le fichier que je peux te procurer n'est ni plus ni moins que celui que m'avait fourni le demandeur et que j'ai non pas modifié mais alimenter afin de répondre à sa première question.
Il dispose d'une base données énorme environ 7200 lignes et 15 colonnes, soit environ 108 000 données à gérer. Il désirait d'abord créé autant de feuille qu'une certaine donnée le demandait, mais sans répétition. Ce que je lui ai réalisé.
Ensuite dans ces feuilles il fallait transposer les données de la base selon un filtre. C'est là que j'ai réalisé un petit bout de code (celui en début de ces messages) mais qui ne me plait pas.
Voila
Vos interventions me laisse un peu perplexe, car je suis loin d'être un expert comme vous
Je vous communique le post initial déposé par ce demandeur

https://forum.excel-pratique.com/excel/copier-donnees-dans-un-nouvel-onglet-et-creer-un-tcd-196748

et le produit que j'ai aménagé qui est encore à l'état d'élaboration
Bien le bonsoir à vous deux et au plaisir de vous rencontrer de nouveau sur le Forum

re, j'ai lu assez vite, donc si je me trompe ...

macro "Jacky"

J'aime bien l'idée du dictionnaire sur la colonne 2 afin d'avoir une liste de nom pour les futurs feuilles sans doublons !

Moi je reviens à la charge avec mon fichier optimisé avec votre façon de faire sur certaine choses, mais il garde ma lourdeur de programmation...

Il a la possibilité de donner les colonnes choisie en sortie, ainsi que le choix dans les colonnes de recherche.
Le Fichier :

Le code :

Option Compare Text

Sub CréerFeuilles()
     Dim Der, I As Long, Nom_Feuille As String, TabRésultat(), TabEntête(), ColExtract, ColCherche
     ' on arrête la mise à jour de l'écran
     Application.ScreenUpdating = False
     On Error GoTo fin
     ' on récupère les données du tableau de la feuille données
     TabDonnées = Sheets("Blad1").Range("A1").CurrentRegion.Value
     ' on boucle sur les données de la colonne 2
     For I = 2 To UBound(TabDonnées)
        ' on récupère la donnée pour créer la feuille
        Recherche = TabDonnées(I, 2)
        ' Ajouter la feuille seulement si elle n'existe pas
        If Feuille_Existe(Recherche) = False Then
            ' on crée la feuille en dernière position
            Worksheets.Add(after:=Sheets(Sheets.Count)).Name = Recherche

            ' ici des données qui permettent :
            ' - de choisir les colonnes à mettre en résultat toutes ou pas et l'ordre voulu
            ' - de choisir les colonnes de recherche soit toutes soit une liste au choix

            ' si ligne = -1 alors c'est ColExtract qui est pris en compte pour les colonnes à afficher
            ' les colonnes sur le tableau de sortie ainsi que l'ordre
            ' si ligne = 0 alors extraction de toutes les colonnes sans mélange
            Ligne = -1
            ' numéro et ordre des colonnes d'origine sur la feuille résultat
            ColExtract = Array(1, 20, 7, 9, 15, 2, 5, 11, 12, 23, 8)

            ' si Colonne = -1 alors c'est ColCherche qui est pris en compte pour la recherche de la données voulue
            ' si Colonne = 0 alors on recherche sur toutes les colonnes
            Colonne = -1
            ' tableau des colonnes de recherche
            ColCherche = Array(2, 5)

            ' on remplie le tableau résultat avec la fonction LRD
            TabRésultat = LRD(Recherche, ColCherche, Colonne, TabDonnées, ColExtract, Ligne)
            ' on affiche le tableau sur la feuille active
            ActiveSheet.Range("A1").Resize(UBound(TabRésultat) + 1, IIf(Ligne = -1, UBound(ColExtract) + 1, UBound(TabDonnées, 2))).Value = _
                Application.Transpose(Application.Transpose(TabRésultat))
            ' on applique une MFC pour faire ressortir la donnée cherchée
            With ActiveSheet.UsedRange
                .FormatConditions.Add Type:=xlExpression, Formula1:="=A1=" & Recherche
                .FormatConditions(1).Interior.Color = RGB(0, 255, 0)
                .EntireColumn.AutoFit
            End With
        End If
     Next I
fin:
     MsgBox Timer - tempo
     ' on réactive la feuille du bouton
     Sheets("Blad1").Activate
End Sub

Function LRD(Recherche, ColRecherche, Colonne, TabDonnées, ColExtractArr, Ligne)
    Dim TabRésultat(), Cpt, I, J
    Cpt = 0
    ' on insère la ligne d'entête
    ReDim Preserve TabRésultat(Cpt)
    TabRésultat(Cpt) = WorksheetFunction.Index(TabDonnées, 1, IIf(Ligne = -1, ColExtractArr, Ligne))
    ' en fonction de la variable Colonne on fait une recherche "précise" ou bien complète
    If Colonne = -1 Then
        ' Scan pour récupérer les données en fonction d'un test (ou plus) sur une ou plusieurs colonnes
        For I = 2 To UBound(TabDonnées)
            ' on boucle sur la sélection de colonne
            For J = 0 To UBound(ColRecherche)
                ' la condition recherchée
                If TabDonnées(I, ColRecherche(J)) = Recherche Then
                    Cpt = Cpt + 1
                    ' on agrandi le tableau résultat
                    ReDim Preserve TabRésultat(Cpt)
                    ' on y met les résultats trouvés
                    TabRésultat(Cpt) = WorksheetFunction.Index(TabDonnées, I, IIf(Ligne = -1, ColExtractArr, Ligne))
                    Exit For
                End If
            Next J
        Next I
    Else
        ' Scan pour récupérer les données en fonction d'un test (ou plus) sur une ou plusieurs colonnes
        For I = 2 To UBound(TabDonnées)
            ' on boucle sur toutes les colonnes de la base de données
            For J = 1 To UBound(TabDonnées, 2)
                ' la condition recherchée
                If TabDonnées(I, J) = Recherche Then
                    Cpt = Cpt + 1
                    ' on agrandi le tableau résultat
                    ReDim Preserve TabRésultat(Cpt)
                    ' on y met les résultats trouvés
                    TabRésultat(Cpt) = WorksheetFunction.Index(TabDonnées, I, IIf(Ligne = -1, ColExtractArr, Ligne))
                    Exit For
                End If
            Next J
        Next I
    End If
    LRD = TabRésultat
End Function

Function Feuille_Existe(Nom_Feuille) As Boolean
    ' test feuille existante en gestion d'erreur
    ' on essaie de récupérer la valeur de la cellule A1
    ' si erreur feuille inconnue
    ' sinon feuille existante
    Dim Test  As Variant
    ' on met la fonction à VRAI
    Feuille_Existe = True
    ' gestion des erreurs
    On Error Resume Next
    ' on récupère la valeur en cellule A1 de la feuille testée
    Test = Sheets(CStr(Nom_Feuille)).Range("A1")
    ' s'il y a une erreur la feuille n'existe pas
    If Err > 0 Then Feuille_Existe = False
End Function

Sub EffaceFeuilles()
    ' on arrête la mise à jour de l'écran
    Application.ScreenUpdating = False
    ' on arrête les alertes
    Application.DisplayAlerts = False
    ' on boucle sur les feuille pour les supprimer sauf la "1"
    For I = Sheets.Count To 2 Step -1
        ' on efface
        Sheets(I).Delete
    Next
    ' on remet les alertes en place
    Application.DisplayAlerts = True
End Sub

Peut-être avez vous une réponse pour moi : Si je ne met pas le double Application.Transpose, les feuilles sont vident de données ! Je ne comprend pas pourquoi et cette double instruction doit ralentir un peu le code, non ?

@ bientôt

LouReeD

voici ma macro avec une plaisanterie, chaque 5eme ligne est une ligne vide (pas difficile à appliquer).

Votre fonction LRD est une ligne dans ma macro

Une autre plaisanterie = les colonnes "X" qui n'existent pas dans la source

Bonjour Bart,

Je trouve ta proposition formidable et surtout très rapide, toutefois en voulant l'étudier de plus près je me pose plusieurs questions.
La première :

                ' ici des données qui permettent :
                ' - de choisir les colonnes à mettre en résultat toutes ou pas et l'ordre voulu
                ' - de choisir les colonnes de recherche soit toutes soit une liste au choix

                ' si ligne = -1 alors c'est ColExtract qui est pris en compte pour les colonnes à afficher
                ' les colonnes sur le tableau de sortie ainsi que l'ordre
                ' si ligne = 0 alors extraction de toutes les colonnes sans mélange
                Ligne = -1
                ' numéro et ordre des colonnes d'origine sur la feuille résultat
                ColExtract = Array(1, 20, 7, 9, 15, 2, 5, 11, 12, 23, 8)

                ' si Colonne = -1 alors c'est ColCherche qui est pris en compte pour la recherche de la données voulue
                ' si Colonne = 0 alors on recherche sur toutes les colonnes
                Colonne = -1
                ' tableau des colonnes de recherche
                ColCherche = Array(2, 5)

                ' on remplie le tableau résultat avec la fonction LRD
                TabRésultat = LRD(Recherche, ColCherche, Colonne, TabDonnées, ColExtract, Ligne)

j'ai très bien réalisé la nécessité d'affecter la valeur -1 à Ligne et Colonne (j'ai essayé avec 0 et j'en ai constaté la très grosse différence)
De ce fait tu limites et ordonnes les colonnes à afficher avec ColExtract et leur recherche avec ColCherche

ColExtract = Array(1, 20, 7, 9, 15, 2, 5, 11, 12, 23, 8)

pourquoi à tu choisi ces colonnes et cet ordre, ordre qui me semble bizarre (1 et ensuite 20, colonne 20 que je ne vois pas, ou erreur de ma part) ?
Je suppose que cet ordre concerne la feuille en construction

ColCherche = Array(2, 5)

Pourquoi rechercher dans les colonnes 2 à 5 alors que la donnée que l'on recherche est en colonne 2 ?

Je suis certainement naïf, mais surtout curieux et je tiens absolument à me perfectionner dans l'utilisation de VBA Excel

Un très grand merci et bien cordialement, à bientôt pour d'autres questions.

Jacky

Bonjour à tous ,

Je viens sans doute après la bataille mais voici une autre manière de faire - du moins je l'espère car je n'ai pas étudié les autres méthodes dans ce fil (ce n'est pas bien ça ).

Le but était de faire un code court (enfin avec mes petites moyens). Ce n'est sans doute pas le plus rapide mais il n'est ridicule : 1 sec. la première fois avec la création de toutes les feuilles puis 0,7 sec. sur ma bécane.

Le code dans module 1 :

Sub Ventiler()
Dim der&, t, i&, n&, xrg1 As Range, xrg2 As Range, wks As Worksheet, rep, deb#
   deb = Timer: Application.ScreenUpdating = False
   With Sheets("Base de données")
      If Sheets.Count > 1 Then .Move before:=Sheets(1): .Select
      .[a1].CurrentRegion.Sort key1:=.[b1], order1:=xlAscending, MatchCase:=False, Header:=xlYes
      Set xrg1 = .[b2]: n = -1
      Do
         If xrg1 = "" Then Exit Do Else n = n + 1
         Set xrg2 = .Columns(2).Find(What:=xrg1, after:=xrg1, LookIn:=xlValues, lookat:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=False)
         On Error Resume Next
         Set wks = Worksheets(xrg1.Value)
         If Err.Number <> 0 Then Set wks = Worksheets.Add(before:=Sheets(1))
         wks.Name = xrg1: wks.Move after:=Sheets(.Index + n): wks.Cells.Clear
         .Rows(1).Copy wks.Rows(1)
         .Rows(xrg1.Row).Resize(xrg2.Row - xrg1.Row + 1).Copy wks.Rows(2)
         Set xrg1 = xrg2.Offset(1)
      Loop
      MsgBox "Ventilation sur " & (n + 1) & " feuilles en " & Format(Timer - deb, "0.0\ sec.")
      rep = MsgBox("Voulez-ne garder que les feuilles fraichement ventilées et la source ?", vbQuestion + vbYesNo + vbDefaultButton1)
      Application.DisplayAlerts = False
      If rep = vbYes Then For i = Sheets.Count To Sheets(xrg2.Value).Index + 1 Step -1: Sheets(i).Delete: Next
      .Select
   End With
End Sub

@mafraise,

malin, ce triage avant de copier. On veut aussi copier les n° qui se trouvent dans la 5eme colonne (mais je ne vois pas des n° dans cette colonne ?)

@Jacky,

je suppose que ce sont plutot des questions pour LouReeD, ma macro s'appèle "Jacky"

Les colonnes à extraire chez moi, si la feuille n'existe pas encore, c'est la séquence de "ColExtract" (à modifier 2eme ligne de "Jacky", et oui, on n'a que 15 colonnes, donc ces chiffres sont <=15). Si la feuille existe, je regarde à la 1iere ligne et les noms et la séquence des entêtes me disent les colonnes à extraire. Si l'entête n'existe pas dans la source, cette colonne reste vide.

Les colonnes à chercher, ici c'est 2 et 5, mais si vous voulez changer cela, c'est la 3eme ligne de "Jacky".

Les autres remarques, certaines choses, je les trouve aussi bizarres, dont je ne connais pas l'origine.

Bart

j'ai étudié le contenu du module 10 qui n'a pas été écrit par toi mais par LooReed d'après ce que tu me dis, d'où mon intervention mal venue (Excuses)
dans le module 31 je retrouve alors ton intervention que je vais "éplucher"

Une première question : pourquoi blague ?

          aA = .Resize(.Rows.Count + 1, .Columns.Count + 1).Value     'lire la plage en 1 fois 'blague = avec une ligne&colonne supplémentaire vide

je suppose que tu veux simplement redimensionner ton tableau en évitant la ligne d'entête

Bonjour BsAlv ,

La question que tu poses est :

On veut aussi copier les n° qui se trouvent dans la 5eme colonne (mais je ne vois pas des n° dans cette colonne ?)

Mais dans le message de 12h34, Jacky nous dit :

Pourquoi rechercher dans les colonnes 2 à 5 alors que la donnée que l'on recherche est en colonne 2 ?

Je me suis donc cantonné aux propos du demandeur ...

Salut Jacky,
Salut LouReed, BsAlv,

une solution, sans fioritures stylistiques, en 0"8 selon Timer... Le Dico moins rapide ? Je sens qu'une réaction se prépare!
Un double-clic sur la feuille 'Base de donnes' démarre la macro.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim tTab, tTitre, tData, iRow1%, iCol%, vNum
'
Cancel = True
iRow = Range("A" & Rows.Count).End(xlUp).Row
iCol = Cells(1, 1).End(xlToRight).Column
'
t = Timer
Application.EnableEvents = False
Application.ScreenUpdating = False
'
Application.DisplayAlerts = False
For X = Sheets.Count To 2 Step -1
    Sheets(X).Delete
Next
Application.DisplayAlerts = True
'
Range("A1").Resize(iRow, iCol).Sort key1:=Range("A1"), order1:=xlAscending, Orientation:=xlTopToBottom, Header:=xlYes
tTitre = Range("A1").Resize(1, iCol).Value
tTab = Range("A1").Resize(iRow + 1, iCol).Value
'
iRow = 2
vNum = tTab(2, 2)
For X = 2 To UBound(tTab, 1)
    If tTab(X, 2) <> vNum Then
        Worksheets.Add(After:=Sheets(Sheets.Count)).Name = vNum
        With Worksheets(vNum)
            .Range("A1").Resize(1, iCol).Value = tTitre
            .Range("A2").Resize(X - iRow, iCol).Value = Range("A" & iRow).Resize(X - iRow, iCol).Value
            .UsedRange.Columns.AutoFit
        End With
        vNum = tTab(X, 2)
        iRow = X
        X = X - 1
    End If
Next
'
MsgBox Timer - t
Application.EnableEvents = True
Application.ScreenUpdating = True
'
End Sub
11jacky.zip (535.54 Ko)

A+

Ooops, je n'avais pas pris en compte la formule en [O:O]!
Correction..

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim tTab, tTitre, tData, iRow1%, iCol%, vNum
'
Cancel = True
t = Timer
iRow = Range("A" & Rows.Count).End(xlUp).Row
iCol = Cells(1, 1).End(xlToRight).Column
'
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'
Application.DisplayAlerts = False
For X = Sheets.Count To 2 Step -1
    Sheets(X).Delete
Next
Application.DisplayAlerts = True
'
Range("A1").Resize(iRow, iCol).Sort key1:=Range("A1"), order1:=xlAscending, Orientation:=xlTopToBottom, Header:=xlYes
tTitre = Range("A1").Resize(1, iCol).Value
tTab = Range("A1").Resize(iRow + 1, iCol).Value
'
iRow = 2
vNum = tTab(2, 2)
For X = 2 To UBound(tTab, 1)
    If tTab(X, 2) <> vNum Then
        Worksheets.Add(After:=Sheets(Sheets.Count)).Name = vNum
        With Worksheets(vNum)
            .Range("A1").Resize(1, iCol).Value = tTitre
            .Range("A2").Resize(X - iRow, iCol - 1).Value = Range("A" & iRow).Resize(X - iRow, iCol - 1).Value
            .Range("O2").FormulaLocal = "=SIERREUR(RECHERCHEV($H" & 2 & ";'https://telecomsante.sharepoint.com/sites/ADMINISTRATIF/Documents partages/COMPTA FRS/QUERY BI/01 - Controle des comptes/[Query_HF_compta_cpte 61 suivi contrat hors loc financiere&telephonie.xlsx]TYPE CLT'!A:C;" & 3 & ";FAUX);" & 0 & ")"
            .Range("O2").AutoFill Destination:=.Range("O2").Resize(X - iRow, 1), Type:=xlFillDefault
            .UsedRange.Columns.AutoFit
        End With
        vNum = tTab(X, 2)
        iRow = X
        X = X - 1
    End If
Next
'
MsgBox Timer - t
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.ScreenUpdating = True
'
End Sub

Déso pour cette distraction!

A+

Bon ben j'ai compris... j'vais me coucher... après PQ, il ne me reste plus grand chose pour m'amuser ici...

@ bientôt

LouReeD

Rechercher des sujets similaires à "copier nombre tres important lignes"