Je dois trouver les mots "En retard" et "En retard" dans une feuille de calcul, mais la colonne dans laquelle ils apparaissent est variable, tout comme le nombre d'enregistrements (lignes). Je dois supprimer toutes les lignes dont les données ne contiennent PAS ces valeurs, puis totaliser les données restantes sur la feuille après la suppression des autres. Avez-vous des idées ?
Réponses
Trop de publicités?Vous pouvez essayer quelque chose comme ça.
Mettez ceci dans une macro à exécuter
Sub Macro1()
Dim sheet As Worksheet
Dim usedRange As Range
Set sheet = ActiveSheet
Set usedRange = sheet.usedRange
Dim rowCount As Integer
Dim columnCount As Integer
Dim iRow As Integer
Dim iColumn As Integer
rowCount = usedRange.Rows.Count
columnCount = usedRange.Columns.Count
For iRow = rowCount To 1 Step -1
For iColumn = 1 To columnCount
If ((InStr(1, LCase(usedRange(iRow, iColumn)), "overdue") > 0) Or (InStr(1, LCase(usedRange(iRow, iColumn)), "due") > 0)) Then
usedRange.Range(Cells(iRow, 1), Cells(iRow, columnCount)).Delete
End If
Next iColumn
Next iRow
End Sub
Vous pouvez également essayer quelque chose avec ADO.
Dim cn As Object
Dim rs As Object
Dim strFile As String
Dim strCon As String
Dim strSQL As String
Dim strWhere As String
Dim i As Integer
''http://support.microsoft.com/kb/246335
strFile = ActiveWorkbook.FullName
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
& ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open strCon
strSQL = "SELECT * FROM [Sheet1$] AS s "
rs.Open strSQL, cn, 3, 3
For i = 0 To rs.fields.Count - 1
strWhere = strWhere & " AND (UCase(s.[" _
& rs.fields(i).Name & "] ) Not Like '%DUE%' Or s.[" _
& rs.fields(i).Name & "] Is Null) "
Next
strSQL = strSQL & " WHERE " & Mid(strWhere, 5)
rs.Close
rs.Open strSQL
For i = 0 To rs.fields.Count - 1
Sheets("Sheet2").Cells(1, i + 1) = rs.fields(i).Name
Next
Worksheets("Sheet2").Cells(2, 1).CopyFromRecordset rs
Excel devrait être capable de convertir n'importe quelle valeur en chaîne de caractères, sauf une erreur. Donc, si vous avez des formules qui renvoient des erreurs, cela peut être la cause de l'incompatibilité de type. Voici une autre façon d'utiliser la méthode Find pour éviter ce problème. La méthode Find peut être plus lente que la lecture en boucle des colonnes, mais si vous n'avez pas une tonne de données, vous ne le remarquerez pas.
Sub DeleteOverDue()
Dim i As Long
Dim rFound As Range
'Loop backward through the used range
For i = Sheet1.usedRange.Rows.Count To 1 Step -1
'Should find "due" and "overdue" because of xlPart
Set rFound = Sheet1.usedRange.Cells(i, 1).EntireRow.Find("due", , xlValues, xlPart)
'If it's not found, delete the row
If rFound Is Nothing Then
Sheet1.usedRange.Cells(i, 1).EntireRow.Delete
End If
Next i
End Sub
Note : Ce code supprime des données. Veuillez donc l'utiliser sur une copie de vos données réelles jusqu'à ce que vous sachiez qu'il fonctionne pour vous.