Je cherche à réaliser une macro qui lorsqu'elle est exécutée, supprime les lignes entières d'une feuille nommée Feuil2, si des cellules dans la plage(F100:F65536) ou (O100:O65536) sont vide.
J'avais trouvé un code sur un poste de XLDowloads que j'ai tenté de modifié :
Code:
Sub Del()
Union([F100:F65535].SpecialCells(xlCellTypeBlanks).EntireRow, [o100:o65535].SpecialCells(xlCellTypeBlanks).EntireRow).Delete
End Sub
Lors de la première exécution, cela fonctionne uniquement si une cellule dans la plage (O100:O65536) est vide. Si c'est une cellule de la plage (F100:F65536) j'ai une erreur d’exécution '1004': Pas de cellules correspondantes. Je suis obligé de supprimer les données d'une cellule dans (O100:O65536) pour que la première execution se passe sans problème.
De plus après exécution de cette macro, une formule dans la cellule BB2 de ma feuil2 est remplacer par un "0". Je ne sais pas pourquoi, vu que mamacro ne devrait intervenir uniquement sur les lignes compris entre 100 et 65536 et que cette cellule n'as pas de lien avec une donné de ces lignes.
J'ai donc rajouter la formule a la fin de la macro :
Code:
Range("BB2").FormulaR1C1 = "=Controles!R2C1"
Ce début de code me semble intéressant car il tient en une ligne et est rapide lors de sont exécution, mais je n'arrive pas a trouver la solution aux quelque problèmes qu'il reste, malgré pas mal de recherche.
Mais je n’ai pas réussi a faire fonctionner ta macro (rien ne se passe).
Je sais pas si j'ai été clair dans mon explication de la macro que je cherche a réalisé.
En faite il suffit que une des cellule dans f100:f65536 ou o10065535 soit vide pour que lorsque j’exécute la macro la ligne ou se trouve la cellule vide soit supprimée.
Exemple la cellule f200 est vide donc la ligne 200 est supprimée.
Mon code fonctionne presque si ce n'est ors de la première exécution, cela fonctionne uniquement si une cellule dans la plage (O100:O65536) est vide. Si c'est une cellule de la plage (F100:F65536) j'ai une erreur d’exécution '1004': Pas de cellules correspondantes. Je suis obligé de supprimer les données d'une cellule dans (O100:O65536) pour que la première execution se passe sans problème.
Code:
Sub Del()
Union([F100:F65535].SpecialCells(xlCellTypeBlanks).EntireRow, [o100:o65535].SpecialCells(xlCellTypeBlanks).EntireRow).Delete
End Sub
J'avoue trouver une contradiction entre ce que tu souhaites avec ton exemple, et ce que fait ton code... du coup je ne comprends pas trop "Mon code fonctionne presque..."
Mon interprétation via ton exemple est que :
à chaque ligne, de la ligne 100 à 65536,
si les cellules des colonnes F et O sont vides,
alors la ligne est supprimée, afin de disposer de tous les enregistrements les uns à la suite des autres sans saut de ligne.
Avec un bout de code, fort probablement optimisable...
Code:
Option Explicit
Sub Del()
Dim Ligne, Compteur
Application.ScreenUpdating = False
Ligne = 100
Compteur = 100
Do While Compteur < 65536
Application.StatusBar = Round(Compteur / 65536 * 100, 1) & " %"
If Range("F" & Ligne) & Range("O" & Ligne) = "" Then
Rows(Ligne).EntireRow.Delete
Else
Ligne = Ligne + 1
End If
Compteur = Compteur + 1
Loop
Application.ScreenUpdating = True
Application.StatusBar = False
End Sub
Salut iStarOSX et le forum
Je sais que ce n'est pas un site consacré au français. Ce qui me rassures, c'est qu'à priori, je ne suis pas le seul à ne pas te comprendre
En fait ce n'est pas si les cellules des colonnes F et O sont vides, mais si une cellule de F ou O sont vide
If Range("F" & Ligne)="" or Range("O" & Ligne) = "" Then
Si soit F soit O est vide, alors.
En gros, ce que tu veux c'est éliminer toutes les lignes à partir de 100 qui n'ont rien en F et toutes celles qui n'ont rien O
Petite questions subsidiaires :
- Si tu travailles sous excel2003 ou une version antérieur, pourquoi mettre ça dans toutes versions, ce qui inclue les version 2007 et 2010 qui dépassent les 65536 lignes ?
- Pourquoi aller jusqu'à la ligne 65536 ? T'as du temps à perdre ? Pourquoi ne pas se contenter de la dernière ligne de la UsedRange (ou .SpecialCells(xlCellTypeLastCell).Row) ?
A+
C'est sur ! Mais en regardant son 1er post, iStarOSX insiste sur l'étendue jusque 65536, alors en l'abs d'éléments précis (fichiers, spécifications,...), j'ai gardé le principe. Mais c'est sur que la boucle que je suggère serait plus efficace si les données permettent d'allez moins loin...
ne serait-ce point suffisant avec le code suivant ?
Code:
Sub Del()
On Error Resume Next
[F100:F65535].SpecialCells(xlCellTypeBlanks).EntireRow.Delete
[O100:O65535].SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub
Avec ce type de formulation,
- le 65535 n'est pas handicapant (la limite se trouve instantanément)
- il y a bien un message d'erreur si la plage ne contient pas de cellule vide !
Avec ce type de formulation,
- le 65535 n'est pas handicapant (la limite se trouve instantanément)
- il y a bien un message d'erreur si la plage ne contient pas de cellule vide !
Pour éviter le message d'erreur, il suffit de tester
Code:
Sub Del()
if not([F100:F65535].SpecialCells(xlCellTypeBlanks) is nothing) then [F100:F65535].SpecialCells(xlCellTypeBlanks).EntireRow.Delete
If not([O100:O65535].SpecialCells(xlCellTypeBlanks)is nothing) then [O100:O65535].SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub