bonsoir a tous! je veux récupérer uniquement les ligne avec des données d'une feuille contenant un tableau. mais lorsque j'exécute mon code, c'est toute les ligne qui sont récupéré. je précise également que plusieurs colonne du tableau contiennent des formule. alors je me demande si c'est la cause de mon problème? et comment le résoudre? j'ai vraiment besoin et hâte de franchir cette étape. Merci bien
1) Beaucoup de tes demandes s'appellent Vba ou Copy
Voir la charte : 2.3 – Le titre de la question doit être clair et comporter explicitement le sujet de la demande. Cela sous-entend qu’une nouvelle demande fait l’objet d’un nouveau fil. 2.4 – La question doit être posée le plus clairement possible en comprenant bien que le lecteur ne peut pas s’imaginer le problème.
1) Beaucoup de tes demandes s'appellent Vba ou Copy
Voir la charte : 2.3 – Le titre de la question doit être clair et comporter explicitement le sujet de la demande. Cela sous-entend qu’une nouvelle demande fait l’objet d’un nouveau fil. 2.4 – La question doit être posée le plus clairement possible en comprenant bien que le lecteur ne peut pas s’imaginer le problème.
Voyez le fichier joint et cette macro dans le code de la feuille "Résultat" :
VB:
Private Sub Worksheet_Activate()
Dim cc%
Application.ScreenUpdating = False
Cells.Delete 'RAZ
[Tableau1].ListObject.Range.Copy [A1] 'copier-coller du tableau structuré
cc = UsedRange.Columns.Count + 1
UsedRange.Columns(cc) = "=1/SIGN(COUNTIF(RC1:RC[-1],""><""))" 'colonne auxiliaire
With ListObjects(1).Range
.Columns(cc) = .Columns(cc).Value 'supprime les formules en colonne auxiliaire
.Sort .Columns(cc), xlAscending, Header:=xlYes 'tri pour regrouper et accélérer
On Error Resume Next 'si aucune SpecialCell
.Columns(cc).SpecialCells(xlCellTypeConstants, 16).EntireRow.Delete 'supprime les valeurs d'erreur
.Columns(cc).Delete xlToLeft 'supprime la colonne auxiliaire
End With
End Sub
Elle se déclenche quand on active la feuille.
Les lignes qui ne contiennent pas de données sont supprimées, grâce au tri l'exécution est très rapide même sur de grands tableaux.
Bonsoir,
J'ai pris le fichier de @job75 pour essai
Tableau initial : 110 593 lignes
Tableau final : 86 017 (idem pour les 2 méthodes)
Enregistrer le fichier (sans données dans aucun onglet, sauf l'onglet initial), puis quitter excel
Ouverture du fichier
Avec le code VBA :
1er essai : 7,4 secondes
2ème essai : 3,2 secondes
Avec power query :
1er essai : 3,9 secondes
2ème essai : 0,7 seconde
le code M :
PowerQuery:
let
Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
#"Lignes vides supprimées" = Table.SelectRows(Source, each not List.IsEmpty(List.RemoveMatchingItems(Record.FieldValues(_), {"", null})))
in
#"Lignes vides supprimées"
Avec un tableau non structuré la macro est un peu différente mais c'est le même principe :
VB:
Private Sub Worksheet_Activate()
Dim cc%
Application.ScreenUpdating = False
Cells.Delete 'RAZ
Sheets("Feuil1").[A1].CurrentRegion.Copy [A1] 'copier-coller du tableau
cc = UsedRange.Columns.Count + 1
With UsedRange.Resize(, cc)
.Columns(cc) = "=1/SIGN(COUNTIF(RC1:RC[-1],""><""))" 'colonne auxiliaire
.Columns(cc) = .Columns(cc).Value 'supprime les formules en colonne auxiliaire
.Sort .Columns(cc), xlAscending, Header:=xlYes 'tri pour regrouper et accélérer
On Error Resume Next 'si aucune SpecialCell
.Columns(cc).SpecialCells(xlCellTypeConstants, 16).EntireRow.Delete 'supprime les valeurs d'erreur
.Columns(cc).Delete xlToLeft 'supprime la colonne auxiliaire
End With
With Usedrange: End With 'actualise les barres de défilement
Columns.AutoFit 'ajustement largeurs
End Sub
C'est plus rapide qu'avec le tableau structuré : 0,78 seconde sur 90 000 lignes.
Re
Effectivement, avec 110 593 (et même nombre de lignes au résultat)
entre 0.96 et 1 seconde
un tableau structuré (malgré tous ses avantages) ralentit donc "quelque peu" les codes (mais ce n'est pas pour autant qu'il faut le délaisser)
Voyez le fichier joint et cette macro dans le code de la feuille "Résultat" :
VB:
Private Sub Worksheet_Activate()
Dim cc%
Application.ScreenUpdating = False
Cells.Delete 'RAZ
[Tableau1].ListObject.Range.Copy [A1] 'copier-coller du tableau structuré
cc = UsedRange.Columns.Count + 1
UsedRange.Columns(cc) = "=1/SIGN(COUNTIF(RC1:RC[-1],""><""))" 'colonne auxiliaire
With ListObjects(1).Range
.Columns(cc) = .Columns(cc).Value 'supprime les formules en colonne auxiliaire
.Sort .Columns(cc), xlAscending, Header:=xlYes 'tri pour regrouper et accélérer
On Error Resume Next 'si aucune SpecialCell
.Columns(cc).SpecialCells(xlCellTypeConstants, 16).EntireRow.Delete 'supprime les valeurs d'erreur
.Columns(cc).Delete xlToLeft 'supprime la colonne auxiliaire
End With
End Sub
Elle se déclenche quand on active la feuille.
Les lignes qui ne contiennent pas de données sont supprimées, grâce au tri l'exécution est très rapide même sur de grands tableaux.
slt merci bien pour votre reaction j'ai texter le code mais cela n'a pas totalement résolu le problème. le fichier ci joint est muni de 2 feuil mais il faudra dupliquer la feuil "Feuil1" au moins deux foi afin de comprendre ma situation. le fichier d'origine est trop volumineux raison pour laquelle je l'ai synthétisé ainsi. maintenant avec les 4 feuils et avec la feuil"Compilation" en dernière , je veux récupérer les informations des trois première Feuil.
effectivement! j'ai supprimer plusieurs feuil afin de réduire sa taille et je l'ai délibérément laissé ainsi pour vous rappeler que ce sont des formule dans certaine cellule.