Avatar billede busschou Praktikant
17. juli 2009 - 06:59 Der er 11 kommentarer og
1 løsning

Autofilter i VB i excel 2007

Jeg vil gerne lave et autofilter og herefter kunne løbe det filtrerede data igennem.
Men det giver mig en del problemer.
Hvis jeg bare laver et autofilter ala.

ActiveSheet.Range("$A$1:$W$171").AutoFilter Field:=1, Operator:= _
        xlFilterValues, Criteria2:=Array(0, "31/12/2008")
ActiveSheet.Range("$A$1:$W$171").AutoFilter Field:=12, Criteria1:="="

Så får jeg rækkerne 1, 108-111, 128-133

Hvordan ved jeg i VB at jeg har disse rækker?
Hvis jeg bare laver en løkke for at løbe alle rækker igennem så tror den stadig jeg har række 2-107 og 112-127

Jeg ønsker altså at kunne referere til de 11 ifølge filteret udvalgte rækker.

Jeg har for sjov forsøgt at kopiere indholdet til et nyt ark og så løbe det igennem der.
Men det iver mig problemer fordi den ikke vil kopiere det hvis der er flere områder.
Dette forstår jeg i øvrigt ikke helt.

Men vigtigst af alt ville det være rart i VB at vide hvilke rækker der er udvalgt af mit autofilter samt refere til disse
Måske have dem i et udvalgt range eller lignende

Har I løsningen?
Avatar billede supertekst Ekspert
17. juli 2009 - 11:32 #1
Måske:

Sub optælAntalLinierDerVises()
Dim antal As Integer
    antal = 0
    antallinier = ActiveCell.SpecialCells(xlLastCell).Row
   
    For række = 1 To antallinier
REM TEST OM RÆKKEN VISES (EVT.VIA FILTER)
        If Rows(række).Hidden = False Then
            antal = antal + 1
        End If
    Next række
   
    MsgBox ("antal synlige linier: " + CStr(antal))
End Sub
Avatar billede busschou Praktikant
17. juli 2009 - 12:09 #2
Jo jo selvfølgelig men jeg må nok hellere udtrykke mig lidt mere klart :o)

Jeg vil gerne benytte autofilter for at slipper for at løbe flere tusinde linjer igennem af flere omgange.

Så vidt jeg har kunne måle mig til giver autofilteret mig et hurtigere resultat end hvis jeg laver flere indlejrede løkker.

Derfor giver det ingen mening først at sortere og dernæst alligevel løbe det hele igennem igen.

Kan man ikke på en og anden måde bare nøjes med at løbe alle ikke-hidden rækker igennem?
Avatar billede excelent Ekspert
17. juli 2009 - 13:28 #3
denne viser hvilke linier der er synlige
skal så istedet blot tilrettes dit formål

Sub test()
Range("A1:A" & Cells(65536, 1).End(xlUp).Row).SpecialCells(xlCellTypeVisible).Select
For Each c In Selection
MsgBox c.Address
Next
End Sub
Avatar billede pejsen Nybegynder
17. juli 2009 - 13:33 #4
Når du kopiere til et nyt ark, skal du i Excel 2007 gemme de filtrede rækker som et " Navngivet område"


Prøv at dig frem med nedestående VBA - Ret selv nedenstående
Range, Field, og Criteria til så det passer med dit regneark

læs her om VBA - Autofilter med flere kriterier.
http://www.ozgrid.com/VBA/autofilter-vba-criteria.htm



        'Filter rows with  autofilter
        With ActiveSheet
            .AutoFilterMode = False
            With .Range("A1:W171")
                .AutoFilter
                .AutoFilter Field:=1, Operator:=xlFilterValues, Criteria2:=Array(0, "31/12/2008")
                .AutoFilter Field:=12, Criteria1:="="

            End With
            Set rTable = .AutoFilter.Range
            lHeadersRows = rTable.ListHeaderRows
            'Resize the range minus lHeadersRows rows
            If lHeadersRows > 0 Then
                Set rTable = rTable.Offset(1).Resize(rTable.Rows.Count - lHeadersRows).SpecialCells(xlCellTypeVisible)
                rTable.Font.Color = vbBlack
            End If
           
            'move new range to  worksheet
            rTable.Copy Destination:= _
            Worksheets("Completed").Cells(Rows.Count, "B").End(xlUp)(2, 1)
            'rTable.EntireRow.Delete
            .AutoFilterMode = False
        End With
    End If
    Rows.AutoFit
End Sub
Avatar billede pejsen Nybegynder
17. juli 2009 - 13:38 #5
Glemte lige disse

Sub EksportToSheet

Dim rTable As Range
Dim lHeadersRows As Long

        'Filter rows with  autofilter
        With ActiveSheet
            .AutoFilterMode = False
            With .Range("A1:W171")
                .AutoFilter
                .AutoFilter Field:=1, Operator:=xlFilterValues, Criteria2:=Array(0, "31/12/2008")
                .AutoFilter Field:=12, Criteria1:="="

            End With
            Set rTable = .AutoFilter.Range
            lHeadersRows = rTable.ListHeaderRows
            'Resize the range minus lHeadersRows rows
            If lHeadersRows > 0 Then
                Set rTable = rTable.Offset(1).Resize(rTable.Rows.Count - lHeadersRows).SpecialCells(xlCellTypeVisible)
                rTable.Font.Color = vbBlack
            End If
           
            'move new range to  worksheet
            rTable.Copy Destination:= _
            Worksheets("Completed").Cells(Rows.Count, "B").End(xlUp)(2, 1)
            'rTable.EntireRow.Delete
            .AutoFilterMode = False
        End With
    End If
    Rows.AutoFit
End Sub
Avatar billede busschou Praktikant
17. juli 2009 - 14:02 #6
excelent --> I see why you got that name ;o)
Det virker jo spot on

pejsen --> Jeg har ikke forsøgt mig med din løsning da løsningen fra excelent gør at jeg slipper for at kopiere imellem de forskellige ark
Avatar billede excelent Ekspert
17. juli 2009 - 14:05 #7
got :-)
Avatar billede busschou Praktikant
17. juli 2009 - 17:47 #8
Det var så en sandhed med modifikationer at det virker "spot on"

Jeg får fint mit range men jeg kan ikke bruge det i alle funktioner som jeg gerne ville

Ved du hvorfor jeg ikke kan det?

Jeg kan godt denne her
Cells(x, 3) = WorksheetFunction.CountA(Worksheets("Spil").Range(arr(x) & "1:" & arr(x) & Sheets("Spil").Cells(65536, 1).End(xlUp).Row).SpecialCells(xlCellTypeVisible))
       

Men jeg kan ikke denne her
Cells(x, 4) = WorksheetFunction.CountIf(Worksheets("Spil").Range(arr(x) & "1:" & arr(x) & Sheets("Spil").Cells(65536, 1).End(xlUp).Row).SpecialCells(xlCellTypeVisible), sammenligning)

Den siger "kan ikke angive egenskaben CountIf for klassen WorksheetFunction

Jeg fanger det rigtige range så det undrer mig at den vil den ene men ikke den anden
Avatar billede excelent Ekspert
17. juli 2009 - 18:56 #9
Vis lige lidt mere af din kode, så jeg bedre kan gennemskue den
så kikker jeg på det lidt senere
Avatar billede busschou Praktikant
17. juli 2009 - 19:35 #10
Super :o)
Der er nu ikke så meget mere i det men sådan her ser det ud
Sammenligning er blot et tal

-----------------------------
sub sammenlign(sammenligning)
  arr = Array("", "B", "D", "F", "H", "J", "L", "N", "P", "R", "T", "V")
  For x = 1 To 11
    ' CountA virker fint
    Cells(x, 3) = WorksheetFunction.CountA(Worksheets("Spil").Range(arr(x) & "1:" & arr(x) & Sheets("Spil").Cells(65536, 1).End(xlUp).Row).SpecialCells(xlCellTypeVisible))
   
    ' CountIf virker fint hvis jeg hardcoder range sådan her
    ' Cells(x, 4) = WorksheetFunction.CountIf(Worksheets("Spil").Range("B86:B130"), sammenligning)
   
    ' CountIf virker ikke hvis jeg bruger præcis det samme som i CountA
    Cells(x, 4) = WorksheetFunction.CountIf(Worksheets("Spil").Range(arr(x) & "1:" & arr(x) & Sheets("Spil").Cells(65536, 1).End(xlUp).Row).SpecialCells(xlCellTypeVisible), sammenligning)
  Next
end sub
Avatar billede excelent Ekspert
17. juli 2009 - 20:07 #11
Det tyder på at countif ikke virker når området ikke er et sammenhængende område - jeg kan heller ikke få den til at funke

Men for mig at se handler det om at filtrere de linier fra (skjule) som ikke opfylder dine betingelser og så anvende denne

Cells(x,4)= Range("A1:A" & Cells(65536, 1).End(xlUp).Row).SpecialCells(xlCellTypeVisible).Count
Avatar billede busschou Praktikant
17. juli 2009 - 20:24 #12
Mystisk... nå men jeg kan jo godt se jeg kan vende det om som du foreslår... takker :o)
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

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