-1 votes

Supprimer les lignes d'une feuille de calcul où la <condition> lorsque la colonne de <condition> est inconnue.

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 ?

1voto

astander Points 83138

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

1voto

Fionnuala Points 67259

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

1voto

Dick Kusleika Points 15230

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X