VBA : sélection de cellules

Salut les chouals

Question rapide sur le vba : j'ai fais une macro, pour dans un tableau à 40.000 lignes et 15 colonnes

Le but c'est de supprimer les lignes qui sont inutiles (donc dont la colonne M et N sont vide)

Actuellement je supprime les lignes au fur et à mesure du programme, mais du coup ça prend énormément de temps puisqu'à chaque suppression t'as 40.000 ligne en dessous qui doivent remonter

Je pourrais partir du bas du tableau pour réduire les délais mais ça serait quand même ultra long surtout vers la fin

Donc est ce que j'ai moyen de sélectionner toutes les lignes vides pour les supprimer en un coup tout à ma fin ?
En gros au fur et à mesure de l'avancement d'une boucle, ajouter des lignes à une sélection pour tout supprimer d'un coup à la fin ?

Désolé si c'est pas super clair, j'écris ça vite fait au boulot sur mon tel



Voilà la macro :
Sub tri()
Dim dern As Long, i As Long
dern = InputBox("entrez le numéro de la dernière ligne du rapport")
For i = 2 To dern Step 1
If Range("M" & i) = 0 And Range("N" & i) = 0 Then
Rows(i & ":" & i).Delete xlUp
i = i - 1
End If
Next i
End Sub

Je voudrais remplacer la suppression par une sélection dont la taille augmente à chaque boucle pour la delete tout d'un coup

Poster un commentaire
anonyme
anonyme
6 ans

Résolu grâce à Set variable = Union(variable, Rows(i))

Roro51
Roro51
6 ans

Tu peux aussi mettre Application.ScreenUpdating = False au début de la macro pour le remettre à True à la fin.
Cela évite la mise à jour de ton écran

anonyme
anonyme
6 ans

@Roro51: ouais mais je sais pas, ça calcule quand même les modification nan ?
Enfin quoi qu'il en soit ça m'arrange sur tous les points ma méthode, sinon mon compteur devait se desincrelenter dans le if sinon il sautait une ligne sur deux dans les séries de lignes vides

Roro51
Roro51
6 ans

@J100591: L'avantage du screenupdating est qu'il ne met pas à jour l'écran et se concentre, de fait, exclusivement aux calculs et ne t'affiche les résultats qu'à la fin de l'exécution de la macro. Le 'remontage de ligne' n'existe plus.
Par exemple, suppression d'une ligne sur deux pour 5000 lignes prend 40s à true et seulement 2 secondes à false

Private Sub CommandButton1_Click()
On Error GoTo fin

Dim n As Integer
Dim nb As Integer
Dim A As Variant
Dim cellule As Variant

nb = Val(Suppression_de_lignes.TextBox1.Value)

'Application.ScreenUpdating = False
n = 1
Do
n = n + 1
cellule = "A" & n
A = n & ":" & n + nb - 1
Rows(A).Select
Selection.Delete Shift:=xlUp
Loop Until ActiveSheet.Range(cellule).Value = ""

'Application.ScreenUpdating = True

Suppression_de_lignes.Hide
fin:
End Sub

anonyme
anonyme
6 ans

@Roro51: Ok ok merci je saurais pour la prochaine fois

Assahell
Assahell
6 ans

Il te faut utiliser un tableau de taille variable pour stocker les numéros de ligne dans ta fonction de "scan" et faire une fonction qui parcoureras le tableau et delete les lignes vide.

Kuzohito
Kuzohito
6 ans

Ah oui c'est vrai

anonyme
anonyme
6 ans

@Kuzohito:?

Cette page est réservée aux ADULTES

Tu es sur le point d'accéder à un site web qui contient du matériel explicite (pornographie).

Tu ne dois accéder à ce site que si tu as au moins 18 ans ou si tu as l'âge légal pour visionner ce type de matériel dans ta juridiction locale, l’âge le plus élevé étant retenu. En outre, tu déclares et garantis que tu ne permettras aucun mineur à d'accéder à ce site ou à ces services.


En accédant à ce site, tu acceptes nos conditions d'utilisation.