Avatar billede lineriber Praktikant
14. marts 2013 - 09:06 Der er 5 kommentarer og
1 løsning

VBA der kan slette linier der opfylder et kriterium

Hej eksperter

Jeg bruger excel 2010 engelsk version.

Jeg har et regneark med en fane med 22 rækker og 70.000 linier (kan variere).
I kolonne K til V indeholder arket salgstal med en kolonne pr måned (12 måneder).
Men en hel del af linierne er tomme/0 i kolonne K til V fordi at der ikke er noget salg fx på et bestemt varenr.

Min tanke er nu at jeg gerne vil slette alle de linier der ikke har nogen salgstal i nogen måneder, simpelthen for at reducere størrelsen af mit ark.

Kan der skrives en VBA kode der foretager denne sletning. Enten ved at den kontrollerer at værdierne i kolonne K til V ALLE er 0, eller jeg kan evt tilføje en ekstra kolonne der angiver et "X" hvis rækken skal slettes?

Mvh Line
14. marts 2013 - 09:14 #1
Svaret er ja ;-)

I bunden af siden her http://www.it-fjernundervisning.dk/Kursus/Excel_VBA/VBA_programmering/Genneml%C3%B8b_af_datas%C3%A6t er der 3 forskellige metoder til sletning af linjer.
Avatar billede maffigadaffi Novice
15. marts 2013 - 11:15 #2
Prøv den her:

Sub Delete_with_Autofilter_Array()
    Dim Rng As Range
    Dim calcmode As Long
    Dim myArr As Variant
    Dim i As Long

    With Application
        calcmode = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
    End With

    'Udfyld med de værdier du vil slette
    myArr = Array("", "0",) 'Her slettes linjer hvor D: er blank eller "0"

    For i = LBound(myArr) To UBound(myArr)
     
        With ActiveSheet

            .AutoFilterMode = False

            'Sætter autofilter
            .Range("D1:D" & .Rows.Count).AutoFilter Field:=1, Criteria1:=myArr(i)

            Set Rng = Nothing
            With .AutoFilter.Range
                On Error Resume Next
                Set Rng = .Offset(1, 0).Resize(.Rows.Count - 1, 1) _
                          .SpecialCells(xlCellTypeVisible)
                On Error GoTo 0
                If Not Rng Is Nothing Then Rng.EntireRow.Delete
            End With

            'Fjerner autofilter
            .AutoFilterMode = False
        End With

    Next i

    With Application
        .ScreenUpdating = True
        .Calculation = calcmode
    End With

End Sub
Avatar billede kabbak Professor
15. marts 2013 - 19:52 #3
Public Sub SletTomme()
    Dim Rv As Long, I As Long
    Application.ScreenUpdating = False
    rw = ActiveSheet.UsedRange.Rows.Count ' finder antal rækker som er brugt i arket
        For I = rw To 2 Step -1 ' jeg går ud fra at der er overskrifter i række 1, derfor startes i række 2
            If Application.WorksheetFunction.Sum(Range(Cells(I, "K"), Cells(I, "V"))) = 0 Then ' tjekker om summen er 0
                Cells(I, "D").EntireRow.Delete ' hvis summen er 0, slættes rækken
            End If
        Next
        Application.ScreenUpdating = True
End Sub


prøv denne makro på et kopi, husk at makrokørsel ikke kan fortrydes.
Avatar billede lineriber Praktikant
03. april 2013 - 10:21 #4
Hej Kakkak

Den virker :-)
MEN kan man istedet for en almindelig sum lave en absolut sum, så jeg ikke risikerer at slette linier hvor der i en måned er +100 og i en anden måned er -100?
Normal ville jeg beregne den absolutte sum som =sumproduct(ABS(K1:V1). Jeg prøvede om jeg kunne ændre til det i din VBA kode, men det kunne jeg ikke finde ud af...
Jeg vil nemlig aller helst være fri for at skulle tilføje en kolonne i mit datasheet der beregner den absolutte sum. Jeg vil gerne have det hele i koden istedet.
Avatar billede kabbak Professor
03. april 2013 - 19:57 #5
prøv denne i stedet

Public Sub SletTomme()
    Dim Rv As Long, I As Long, Tom As Boolean
    Application.ScreenUpdating = False
    rw = ActiveSheet.UsedRange.Rows.Count ' finder antal rækker som er brugt i arket
        For I = rw To 2 Step -1 ' jeg går ud fra at der er overskrifter i række 1, derfor startes i række 2
        Tom = True
        For col = 11 To 22
          If Cells(I, col) <> 0 Then
        Tom = False
            Exit For
            End If
            Next
            If Tom Then Cells(I, "D").EntireRow.Delete  ' hvis summen er 0, slættes rækken
        Next
        Application.ScreenUpdating = True
End Sub
Avatar billede lineriber Praktikant
04. april 2013 - 11:04 #6
FANTASTISK - det er helt perfekt, tusinde tak.
Og igen tak for forklaringerne på hver linie, det gør en stor forskel for mig i forhold til at kunne lave smårettelser i koden efterfølgende.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester