Just nu i M3-nätverket
Jump to content

Räkna antalet i ett fliterat dokument


PeterPAN

Recommended Posts

Hej,

 

Jag har skapat ett litet script (se nedan) för att räkna antalet dagar i dokument (vissa dagar förekommer flera gånger och skall då bara räknas en gång).

 

Om jag nu lägger till ett autofilter vill jag att scriptet endast skall räkna antalet dagar som nu är fram filterade. Är detta möjligt=? Och isåfall hur gör man detta?

 

/Peter

 

Dim ANTAL_DAGAR, X, Y_DAG As Integer
Dim DATUM, BLAD As String
Dim LIKA_DAGAR As Boolean

Sub DAYS()

   BLAD = Blad1                            'STARTVÄRDE FLIK
   Y_DAG = 8                               'STARTVÄRDE FÖR VILKEN KOLUMMN SOM PLANERAD STARTDATUM FINNS I
   X = 7                                   'STARTRUTA ruta lodrätt
   LIKA_DAGAR = False                      'STARTVÄRDE FÖR SANT/FALSK PÅSTÅENDET
   ANTAL_DAGAR = 0                         'NOLLSTÄLLER
   DATUM = Sheets(BLAD).Cells(X, Y_DAG)    'STARTDATUM

   'Kontrollera rutor som inte är tomma
   Do While Sheets(BLAD).Cells(X, Y_DAG).Text <> ""



       If Sheets(BLAD).Cells(X, Y_DAG).Value = DATUM And LIKA_DAGAR = False Then
           'Räknar antalet på den valda dagen
           ANTAL_DAGAR = ANTAL_DAGAR + 1
           LIKA_DAGAR = True
       End If

       If LIKA_DAGAR = True Then
               Do While DATUM = Sheets(BLAD).Cells(X, Y_DAG).Value
               'Hoppa ner en rad
               X = X + 1
               Loop
           DATUM = Sheets(BLAD).Cells(X, Y_DAG).Value
           LIKA_DAGAR = False
       End If

   Loop

   Sheets(BLAD).Cells(4, 8) = ANTAL_DAGAR

End Sub

 

 

 

Link to comment
Share on other sites

Exempelvis med raden

Sheets(BLAD).AutoFilter.Range.SpecialCells (xlCellTypeVisible)

 

vilket ger som "svar" hela det synliga, dvs framsorterade området inklusive rubrikraden.

Du kan enklast nyttja detta genom ex.v. en With-sats och en For Each, dvs:

[color="#0000ff"]Dim[/color] myRow As Range
    [color="#0000ff"]With[/color] Sheets(BLAD).AutoFilter.Range.SpecialCells(xlCellTypeVisible)
        [color="#0000ff"]For[/color] [color="#0000ff"]Each[/color] myRow [color="#0000ff"]In[/color] .Rows
            [color="#0000ff"]If[/color] myRow.Cells(1, 1) = [GRÅ]"apa"[/GRÅ] [color="#0000ff"]Then[/color]
                myRow.Cells(1, 5) = 2
            [color="#0000ff"]End[/color] [color="#0000ff"]If[/color]

        [color="#0000ff"]Next[/color] myRow
    [color="#0000ff"]End[/color] [color="#0000ff"]With[/color]

Där första raden adresserar de synliga cellerna.

Där For Each stegar igenom varje rad inom området.

där IF-satsen kontrollerar om värdet i första cellen är "apa".

Om så är fallet skrivs ett i kolumn fem relativt den första kolumnen i autofiltret. Dvs myRow.Cells(rwIndex, colIndex) arbetar relativt den rad som For Each tagit fram. Om exempelvis autofiltrets vänstra kant ej är i kolumn A kan du ha kolumnindex mindre än ett.

 

 

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

 

[inlägget ändrat 2006-10-17 09:59:58 av Monshi]

Link to comment
Share on other sites

Hej,

 

Tack för hjälpen, men det fungerar nästan perfekt. Mitt enda problem är nu att när jag har filterat filen, så räknar den med den första dolda raden. I den bifogade bilden syns att det är bara en dag med, men den räknar ändå med datumen 20061012 som är dold. Någon som vet varför den gör på detta viset?

 

Här är koden som det blev efter Monshi:s förslag:

 

Dim ANTAL_DAGAR, X, Y_DAG As Integer
Dim DATUM, BLAD As String
Dim LIKA_DAGAR As Boolean
Dim myRow As Range

Sub TEST()

   BLAD = "Blad1"                          'STARTVÄRDE FLIK
   Y_DAG = 8                               'STARTVÄRDE FÖR VILKEN KOLUMMN SOM PLANERAD STARTDATUM FINNS I
   X = 7                                   'STARTRUTA ruta lodrätt
   LIKA_DAGAR = False                      'STARTVÄRDE FÖR SANT/FALSK PÅSTÅENDET
   ANTAL_DAGAR = 0                         'NOLLSTÄLLER
   DATUM = Sheets(BLAD).Cells(X, Y_DAG)    'STARTDATUM

   With Sheets(BLAD).AutoFilter.Range.SpecialCells(xlCellTypeVisible)
       For Each myRow In .Rows

           If myRow.Cells(2, Y_DAG) <> DATUM And LIKA_DAGAR = True Then

               DATUM = myRow.Cells(2, Y_DAG)
               LIKA_DAGAR = False

           End If

           If myRow.Cells(2, Y_DAG) = DATUM And LIKA_DAGAR = False And myRow.Cells(2, Y_DAG) <> "" Then

               ANTAL_DAGAR = ANTAL_DAGAR + 1
               LIKA_DAGAR = True

           End If

       Next myRow

   End With

   Sheets(BLAD).Cells(4, 8) = ANTAL_DAGAR

End Sub

 

/Peter

 

Link to comment
Share on other sites

Märk att inom autofilterområdet ingår även rubrikraden så det är nog denna du menar räknas.

 

Samt detta utryck

myRow.Cells(2, Y_DAG)

tar alltså värdet från raden UNDER myRow! Det är väl inte vad du menar att göra? Du menar väl

myRow.Cells(1, Y_DAG)

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

Hmm, men om jag inte skriver:

 

myRow.Cells(2, Y_DAG)

 

Så börjar den med att ta med rubrikraden i Autofilteret, vilket gör att det blir fel i resten av koden. Alltså den börjar aldrig att räkna dagarna för första datumen blir "Datum" och inte "20061011", dessutom blir resultatet ett dag för mycket igen..

 

Eller har jag fel i koden någon annastans?

 

Link to comment
Share on other sites

myRow.Cells(2, Y_DAG)

Struntar allstå i om cellen är gömd eller ej, den tar en cell i raden under den funna raden.

 

Enklast är nog att med en If-sats sortera bort den första raden:

If (myRow.Row <> 1) Then

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...