Supprimer des lignes avec cellulles vides
Bonjour et bravo pour ce forum, j'ai tenté une petite recherche mais n'ai pas vraiment trouvé la bonne réponse, merci de me rediriger si ça a déjà été traité.
Je cherche un moyen de supprimer toutes les lignes d'un tableau comportant une cellule vide mais si possible sans code, non pas que je deteste le code mais en fait, je suis débutant et ne sais pas trop m'en servir. Je ne sais faire des macros qu'en enregistrant mes actions.
Voilà, si quelqu'un a une soluce simple, merci d'avance.
Alesque.
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Bonjour au forum,
Tu sélectionne ton tableau, et tu fait un simple tri.
Données/Trier
amicalement
Claude.
Merci pour la réponse rapide.
J'ai peut être mal exprimé ma question.
J'ai déjà fait ce tri et toutes les lignes avec une cellule vide se retrouvent en fin de fichier.
Je cherche une commande a inserer dans ma macro pour les supprimer sachant que mon fichier change régulièrement. Si je le fais en manuel, je suis obligé de dire que je supprime de la ligne x à la fin, mais la ligne x change de N° à chaque fois.
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
re,
dans ta 1ère question, tu ne voulais pas de macro !!
envoie ton fichier avec les annotations de ce que tu souhaite.
Claude.
Bonjour,
Dans le même esprit que Dubois, utilise le filtre automatique que tu troiuves par Données / filtre / filtre auto et dans ton filtre sélectionne l'option "non vides".
A te relire
Dan
Il est possible que le filtre soit une bonne solution pour moi, pour exemple, je vous envoie le lien du fichier sur lequel je travaille en ce moment :
Sur ce fichier, et dans le but de faire un joli catalogue papier, je voudrais enregistrer une macro qui :
Copie sur plusieurs (deux seulement) sources,
supprime les colones : C D F H J K
Supprime les lignes avec la première cellule vide,
classe par E,
Supprime E
puis (et ça je sais pas encore faire) fasse un retour automatique sur les titres trop longs dans colone B
Comme je sais pas coder, je clique sur enregistrer Macro en ayant pris soin de prendre note de toutes mes opérations que j'exécute manuellement, je me fais un petit bouton sur ma feuille et le tour est joué
re,
Copie sur plusieurs (deux seulement) sources...
Que veux tu dire ?
Pour ce qui est de la macro c'est une bonne solution que de faire comme tu le décris. Ensuite place ta macro ici. On pourra l'améliorer.
A te relire
Dan
Nad-Dan a écrit :re,
Copie sur plusieurs (deux seulement) sources...
Que veux tu dire ?
Pour ce qui est de la macro c'est une bonne solution que de faire comme tu le décris. Ensuite place ta macro ici. On pourra l'améliorer.
A te relire
Dan
Ok pour la macro, je vais la travailler demain et vous la soumettre.
Sinon, pour les "deux sources", je veux dire que ça vient de deux feuilles différentes. C'est un catalogue que j'ai mis sur internet et j'ai une macro qui transforme tout le fichier Excel en requète sql pour que ça soit facilement consultable par les visiteurs comme sur
Mais comme internet, ben ça convient pas à tout le monde, il faut que je sorte une édition papier de ce catalogue qui doit avoir 3 500 titres et plus de 10 000 lignes sur Excel...
Merci pour votre aide précieuse.
Re,
Ok. Pas de souci. J'attends ta macro demain.
Bonne soirée
Dan
C'est déjà un peu plus avancé, je voudrais maintenant sur le tableau cité plus haut :
Supprimer les lignes qui sont vide en A sachant que ça n'est pas toujours à partit de la ligne 14
Si possible, faire un retour à la ligne automatique des titres en colonne B
Ensuite, je pense ne plus avoir de problème pour exporter les données dans Word ou autre (si quelqu'un a une idée...) afin de lui donner une forme plus conviviale.
Je précise que le fichier total fait environ 10 000 lignes.
Bonjour
j'ai regardé ton code, mais c'est dommage que tu aies supprimé ton onglet original...
regarde le code un peu modifié
Il faut le mettre dans le fichier de destination
Il copiera l'onglet ("Feuil1") (nom à adapter) dans le fichier
puis suppression des lignes 1 à 4, des colonnes C, D, F, H, J et K
Suppression des lignes dont les cellules de la colonne A sont vides
Autorisation du retour à la ligne dans la colonne B, avec largeur de colonne à 50
Et enfin, largeur automatique des colonnes
Pour le tri, je n'ai pas compris pourquoi dans ton exemple, tu commençais en A5
Il faut également voir pour les titres
Regarde, et reviens pour plus de précision
Sub Catapapier()
With Workbooks("Harpeseuleoupasseule.xls")
.Sheets("Feuil1").Copy Before:=Sheets(1)
End With
Rows("1:4").Delete Shift:=xlUp
Range("C:D,F:F,H:H,J:K").EntireColumn.Delete
Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
With Columns("B:B")
.WrapText = True
.ColumnWidth = 50
End With
Cells.EntireColumn.AutoFit
End Sub
Merci, je vais essayer ça très vite.
je commence en A5 parceque y'a des lignes avec des titres et bouton de macro sur le fichier original qui n'ont pas d'interet dans celui là.
Dans le fichier original, j'ai une macro qui transforme ce fichier en requête SQL qui est composée comme suit.
Const colCompositeur = 1
Const colTitre = 2
Const colEditeur = 3
Const colCategory = 4
Const colType = 5
Const colFormation = 6
Const colArrangeur = 7
Const colSouscompositeurs = 2 ' same as titre
Const colImage = 8
Const colPrix = 9
Const colEdition = 10 ' c'est tres plaisant
Const colRef = 11
Const colStock = 12
Const maxRows = 15000
Const firstInputRow = 5
Sub grenouille()
Dim outputRow As Integer
outputRow = 2
crevettes = writeEditeur(1, 3, outputRow)
Debug.Print "Bravo chef, tu as bouffé"; crevettes; "crevettes"
outputRow = outputRow + crevettes
crevettes2 = writeEditeur(2, 3, outputRow)
Debug.Print "Bravo chef, tu as bouffé"; crevettes2; "crevettes"
Debug.Print "Bravo chef, tu as bouffé"; crevettes + crevettes2; "crevettes"
End Sub
Function writeEditeur(inputWorksheet As Integer, outputWorksheet As Integer, firstOutputRow As Integer) As Integer
Debug.Print "Bonjour"
Worksheets(outputWorksheet).Rows.Cells(5, 8).Value = "Oui, chef"
' clear the output area
For i = firstOutputRow To maxRows
For j = 1 To 7
Worksheets(outputWorksheet).Rows.Cells(i, j).Clear
Next j
Next i
Dim inputRowNumber As Integer, outputRowNumber As Integer
outputRowNumber = firstOutputRow
numberOfCrevettesMangées = 0
Dim category As String
Dim compositeur As String, titre As String, arranger As String
Dim souscompositeur As String
For inputRowNumber = firstInputRow To maxRows
compositeur$ = Worksheets(inputWorksheet).Rows.Cells(inputRowNumber, colCompositeur).Value
If Len(compositeur$) > 0 Then
Worksheets(outputWorksheet).Rows.Cells(outputRowNumber, 1).Value = Worksheets(inputWorksheet).Rows.Cells(inputRowNumber, colEdition).Value
Worksheets(outputWorksheet).Rows.Cells(outputRowNumber, 2).Value = Worksheets(inputWorksheet).Rows.Cells(inputRowNumber, colCompositeur).Value
Worksheets(outputWorksheet).Rows.Cells(outputRowNumber, 3).Value = Worksheets(inputWorksheet).Rows.Cells(inputRowNumber, colTitre).Value
Worksheets(outputWorksheet).Rows.Cells(outputRowNumber, 4).Value = Worksheets(inputWorksheet).Rows.Cells(inputRowNumber, colFormation).Value
Worksheets(outputWorksheet).Rows.Cells(outputRowNumber, 5).Value = Worksheets(inputWorksheet).Rows.Cells(inputRowNumber, colArrangeur).Value
Worksheets(outputWorksheet).Rows.Cells(outputRowNumber, 6).Value = Worksheets(inputWorksheet).Rows.Cells(inputRowNumber, colRef).Value
Worksheets(outputWorksheet).Rows.Cells(outputRowNumber, 7).Value = Worksheets(inputWorksheet).Rows.Cells(inputRowNumber, colStock).Value
outputRowNumber = outputRowNumber + 1
numberOfCrevettesMangées = numberOfCrevettesMangées + 1
End If
Next
Debug.Print "J'ai mangé"; (outputRowNumber - 2); "crevettes"
Worksheets(outputWorksheet).Rows.Cells(5, 8).Value = "J'ai mangé " + CStr(outputRowNumber - 2) + " crevettes"
writeEditeur = numberOfCrevettesMangées
End Function
Sub writeSQL(sourceWorksheet As Integer, filename As String)
Worksheets(sourceWorksheet).Rows.Cells(2, 4).Value = "Oui, chef, on va écrire un joli sql"
Open filename For Output As #1
' Print #1, "INSERT INTO `partitions` (`numero`, `compositeur`, `titre`, `editeur`, `type`, `formation`, `epuise`, `image`, `path`, `arrangeur`, `sous_compositeurs_titres`, `prix`)"
' Print #1, " VALUES"
rowsWritten = 0
For i = firstInputRow To maxRows
field1$ = Trim$(Worksheets(sourceWorksheet).Rows.Cells(i, 1).Value) ' compositeur
field2$ = Trim$(Worksheets(sourceWorksheet).Rows.Cells(i, 2).Value) ' titre ou sous-compositeur
If field1$ = "" And field2$ <> "" Then ' this is a continuation of a previous entry
' remove the asterisk
If InStr(field2$, "*") = 1 Then field2$ = Right(field2$, Len(field2$) - 1)
' souscompositeur$ = souscompositeur$ + "<br />\r\n" + field2$
If souscompositeur$ = "" Then
souscompositeur$ = field2$
Else
souscompositeur$ = souscompositeur$ + "<br>" + field2$
End If
Else ' this is a new entry
' write out the previous entry
If compositeur$ <> "" Then ' exclude first (uninitialised) row
rowsWritten = rowsWritten + 1
'terminator$ = ","
'If field1$ = "" Then terminator$ = ";" ' last drink of the day
terminator$ = ";"
souscompositeur$ = Replace(souscompositeur$, "'", "\'")
' Print #1, "INSERT INTO `partitions` (`numero`, `compositeur`, `titre`, `editeur`, `type`, `formation`, `epuise`, `image`, `path`, `arrangeur`, `sous_compositeurs_titres`, `prix`)"
Print #1, "INSERT INTO `partitions` (`compositeur`, `titre`, `editeur`, `type`, `formation`, `epuise`, `image`, `path`, `arrangeur`, `sous_compositeurs_titres`, `prix`)"
Print #1, " VALUES"
' Print #1, "("; rowsWritten; ", '"; compositeur$; "', '"; titre$; "', '"; editeur$; "', "; type_$; ", '"; formation$; "', 0, '', '', '"; arrangeur$; "', '"; souscompositeur$; "', 0)"; terminator$
Print #1, "('"; compositeur$; "', '"; titre$; "', '"; editeur$; "', "; type_$; ", '"; formation$; "', 0, '"; Image$; "', '', '"; arrangeur$; "', '"; souscompositeur$; "', "; prix$; ")"; terminator$
End If
' gather information on the current entry
compositeur$ = Trim$(Worksheets(sourceWorksheet).Rows.Cells(i, colCompositeur).Value)
compositeur$ = Replace(compositeur$, "'", "\'")
titre$ = Trim$(Worksheets(sourceWorksheet).Rows.Cells(i, colTitre).Value)
titre$ = Replace(titre$, "'", "\'")
editeur$ = Trim$(Worksheets(sourceWorksheet).Rows.Cells(i, colEditeur).Value)
editeur$ = Replace(editeur$, "'", "\'")
categorie$ = Trim$(Worksheets(sourceWorksheet).Rows.Cells(i, colCategory).Value)
categorie$ = Replace(categorie$, "'", "\'")
type_$ = Trim$(Worksheets(sourceWorksheet).Rows.Cells(i, colType).Value)
formation$ = Trim$(Worksheets(sourceWorksheet).Rows.Cells(i, colFormation).Value)
formation$ = Replace(formation$, "'", "\'")
arrangeur$ = Trim$(Worksheets(sourceWorksheet).Rows.Cells(i, colArrangeur).Value)
arrangeur$ = Replace(arrangeur$, "'", "\'")
Image$ = Trim$(Worksheets(sourceWorksheet).Rows.Cells(i, colImage).Value)
Image$ = Replace(Image$, "'", "\'")
prix$ = Trim$(Worksheets(sourceWorksheet).Rows.Cells(i, colPrix).Value)
prix$ = Replace(prix$, ",", ".")
If Len(prix$) = 0 Then prix$ = "0"
souscompositeur$ = "" 'Trim$(Worksheets(sourceWorksheet).Rows.Cells(i, colSouscompositeurs).Value)
End If
Next i
Close #1
Debug.Print "Oh chef j'ai écrit"; rowsWritten; "lignes"
Worksheets(sourceWorksheet).Rows.Cells(2, 4).Value = "Chef j'ai écrit " + CStr(rowsWritten) + " lignes dans " + filename
End Sub
Function getCategoryNum(ByVal category As String) As Integer
' 0. harpe a pedales
If category = "Harpe Seule" Then
getCategoryNum = 0
' 1. harpe celtique
ElseIf category = "" Then
getCategoryNum = 1
' 2. ensemble de harpes
ElseIf category = "Plusieurs Harpes ou harpe(s)& piano(s)" Or category = "DEUX HARPES" Or category = "TROIS , QUATRE ... HARPES" Then
getCategoryNum = 2
' 3. duos
ElseIf category = "Flûte & Harpe" Or category = "Violon & Harpe" Or category = "Voix & harpe" Then
getCategoryNum = 3
' 4. trios
ElseIf category = "Trios & Quatuors" Then ' pas bien!
getCategoryNum = 3
' 5. quatuor
ElseIf category = "Alto,Violoncelle ou C.Basse &Harpe" Then
getCategoryNum = 4
' 6. quintettes
ElseIf category = "" Then
getCategoryNum = 5
' 7. ensembles
ElseIf category = "Vents & Harpe" Or category = "Divers Instruments & harpe" Or category = "Quintettes & Sextuors" Or category = "INSTRUMENTS A VENT ET HARPE OU CLAVECIN OU PIANO" Or category = "INSTRUMENTS A CORDES ET HARPE OU CLAVECIN OU PIANO" Or category = "PERCUSSIONS ET HARPE OU CLAVECIN OU PIANO" Then
getCategoryNum = 6
' 8 . methode
ElseIf category = "" Then
getCategoryNum = 7
' 9. concerto
ElseIf category = "Grandes Formations & Concertos" Or category = "PETITE ET GRANDE FORMATION" Then ' pas bien
getCategoryNum = 8
ElseIf category = "" Then
getCategoryNum = 9
Else
getCategoryNum = -1
End If
End Function
Y'a-t-il un moyen de faire aussi un retour à la ligne auto pour les textes trop longs (avec insertion de <br> ?
Re-,
je ne parlais pas du nombre de crevettes que le chef a mangées......
Si mes souvenirs sont bons, dans le premier fichier que tu avais joint, les données étaient "brut" de fonderie.....
Maintenant, le code que tu as fourni.....
Oui effectivement c'est le code pour le premier fichier, rien a voir avec le deuxième seulement si je pouvais inserer un retour à la ligne automatique, ça serait pratique mais bon c'est pas super important et avec le premier code que tu m'as suggeré, j'arriverais à adapter ça...
Pour les crevettes, un peu de fantaisie dans les codes, ça fait pas de mal hein ? En vrai, celui qui m'a aidé pour ce code m'avais donné le choix entre ça ou des escargots, je trouvais plus digestes les crevettes.
Re-
si tu essaies mon code, tu verras que les retours à la ligne sont automatiques dans la colonne B
Mets ce code dans un fichier vierge, assures-toi que le fichier source est ouvert
"Harpeseuleoupasseule.xls"
et fais un essai, et reviens pour les bugs qui pourraient survenir
PS : Attention au nom de l'onglet, ici appelé Feuil1
.Sheets("Feuil1").Copy Before:=Sheets(1) Salut Alesque,
Je ne t'avais pas oublié mais comme Felix a proposé quelque chose, inutile de mettre une solution identique.
A+ sur d'autres fils
Dan