Just nu i M3-nätverket
Jump to content

Jämförselse mellan celler och collection


Ibasto

Recommended Posts

Hej!

 

Till och börja med är jag relativ färsk på VBA och excel

 

Jag ska göra ett diagram där följande info ska finnas.

Jag har ett antal grupper som utför jobb, ett jobb kan vara påbörjat avslutat eller varken eller. totalt, påbörjat och avslutat för varje grupp ska visas som stapeldiagram

Eftersom "grupperna" och är relativt många till antalet och varierar över tiden vill jag inte göra detta "förhand" med ett vanligt diagram.

 

Jag har gjort en funktion(eller vad det heter i VBA) som läser in och lagrar alla grupper i en collection

Dim utfLista As New Collection

Dim utfoerare As Variant

 

' se till att listan inte är tom vid start

utfLista.Add ("dummy")

 

For curRow = 3 To 800

utfoerare = Worksheets(1).Cells(curRow, 5)

 

'kolla för varje rad om utföraren finns i listan

For Each utf In utfLista

'om den finns: hoppas ur, annars kolla nästa

If (StrComp(utf, utfoerare) = 0) Then

fanns = True

GoTo hittat

Else

fanns = False

End If

 

Next

hittat:

If fanns = False Then

utfLista.Add (utfoerare)

End If

 

Next

 

Sen vill jag för varje grupp räkna påbörjade och avslutade. Detta markeras genom ett "x" i kolumn a resp b

Jag har försökt med följande:

 

For Each utf In utfLista

Worksheets("ordrar").Activate

 

'slå länge det finns ett ordernummer

Do While (Not (IsEmpty(ActiveSheet.Cells(curRow, 3))))

' Räkna påbörjade

If (StrComp(ActiveSheet.Cells(curRow, 5), utf)) Then

test = test + 1 ' bara för felsökning

If (Not (IsEmpty(ActiveSheet.Cells(curRow, 1)))) Then

sumStart = sumStart + 1

End If

End If

' Räkna avslutade

If (StrComp(ActiveSheet.Cells(curRow, 5), utf)) Then

If (Not (IsEmpty(ActiveSheet.Cells(curRow, 2)))) Then

sumEnd = sumEnd + 1

End If

End If

curRow = curRow + 1

Loop

 

' skriv ut resultatet

Worksheets("beräkningar").Activate

ActiveSheet.Cells(index, 2).Value = Str(sumStart)

ActiveSheet.Cells(index, 3).Value = Str(sumEnd)

ActiveSheet.Cells(index, 4).Value = Str(test)

 

'förbered nästa varv

sumStart = 0

sumEnd = 0

index = index + 1

Next

 

 

Det första att läsa in, lagra och skriva ut mina grupper funkar klockrent,

men när jag vill summera så räknar den alla påbörjade och avslutade för den första, och ingen för resten.

test variabeln test blir 787 ( = antalet ordrar) för första gruppen, dvs if satsen :

 

If (StrComp(ActiveSheet.Cells(curRow, 5), utf)) Then

är alltid sann, oavsett vilket cellinehåll det är för den förtsta gruppen.

Den första posten i min collection är strängen "dummy" som inte finns någonstans i excellarket.

 

Är det nån som kan hjälpa mig med vart jag tänker fel vore jag mycket tacksam. Kasnke finns det mycket enklare sätt att lösa detta på?

Jag misstänkter naturligtvis att jag inte riktigt använvder StrComp på rätt sätt men vet inte vad jag ska använda istället. Måste man casta till en string kanske för att kunna göra den jämförelsen, och hur gör man det i sånna fall? och varför blir "dummysträngen" sann?

 

Ibasto

 

Link to comment
Share on other sites

Sätter mig inte in i hela din kod eller vad du vill göra, men lite hjälp kan jag nog ge.

 

Börjar med StrComp.

StrComp returnerar 0 om de jämförda strängarna är lika, -1 eller +1 om mindre resp större

Dvs gör en värdekoll på vad StrComp returnerar

StrComp("Dummy", "tjoho") => värde skilt från 0

och Falskt = 0

 

dvs klart att din If sats alltid körs, att StrComp returnerar "sant"

 

Påpekande om koden:

Undvik

 Worksheets([GRÅ]"ordrar"[/GRÅ]).Activate

använd istället:

[color="#0000ff"]With[/color]  Worksheets([GRÅ]"ordrar"[/GRÅ])
   .Range([GRÅ]"A1"[/GRÅ]) = [GRÅ]"hej"[/GRÅ]
[color="#0000ff"]End[/color] [color="#0000ff"]With[/color]

Mycket snabbare (och enklare)

 

Och lite överkurs kanske. När du ska ut och skriva på arbetsbladet är det trevligt med namngivna områden som är enkla att hitta även om annat ändrats på bladet. Går inte in mer detalj än att säga att man kan nå ett namngivet område med

.Range("Område1")

 

Och annan metod? Tja, jag tänker på Pivottabeller som ett utmärkt verktyg att sammanställa data med. Vet dock inte om de är applicerbara på ditt problem. Annars gäller som vanligt att om det går att lösa ett problem med Excels formler eller metoder är de att föredra framför VBA.

 

 

 

 

/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

Hej,

 

Ditt första steg att hitta de unika posterna i en lista går att lösa med formler om man vill, det kräver dock några mellansteg. Se mer hos XL-Dennis, denna outsinliga källa av XL-kunskap. http://www.xldennis.com/unikavarden.htm

 

För att summera tabellvärden valda med flera villkor går det utmärkt att använda matrisformler. (http://www.xldennis.com/sammanstalladata.htm) Om du ändå ska skriva ut resultatet i ditt ark kan du låta makrot skapa dessa matrisformler. Fördelen är att formlerna uppdateras automatiskt när ordrar kryssas som påbörjade eller klara, makrot behöver bara köras om det dyker upp nya (unika) poster i listan.

 

Var det något sånt här du tänkte dig? (se bifogad bild)

 

Kolumnerna E, F och G är genererade med följande makro:

 

[color="#0000ff"]Sub[/color] FilterAndCount()

[color="#006400"]'Initiations[/color]
[color="#0000ff"]Dim[/color] colUniqueList As [color="#0000ff"]New[/color] collection
[color="#0000ff"]With[/color] Worksheets(1)
  [color="#0000ff"]Set[/color] rnValues = _
      Range(.Range([GRÅ]"A2"[/GRÅ]), Range([GRÅ]"C2"[/GRÅ]).[color="#0000ff"]End[/color](xlDown))
[color="#0000ff"]End[/color] [color="#0000ff"]With[/color]

[color="#006400"]'Find unique entries[/color]
[color="#0000ff"]For[/color] [color="#0000ff"]Each[/color] c [color="#0000ff"]In[/color] rnValues.Columns(3).Rows
  [color="#0000ff"]For[/color] [color="#0000ff"]Each[/color] e [color="#0000ff"]In[/color] colUniqueList
      [color="#0000ff"]If[/color] c.Value = e [color="#0000ff"]Then[/color]
          GoTo Break
      [color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
  [color="#0000ff"]Next[/color] e
  colUniqueList.Add c.Value
Break:
[color="#0000ff"]Next[/color] c

[color="#006400"]'Calculate and write results[/color]
i = 2
[color="#0000ff"]With[/color] Worksheets(1)
  [color="#0000ff"]For[/color] [color="#0000ff"]Each[/color] e [color="#0000ff"]In[/color] colUniqueList
      .Cells(i, 5) = e
      .Cells(i, 6).FormulaArray = _
        [GRÅ]"=SUM(("[/GRÅ] + _
        rnValues.Columns(3).Address(ReferenceStyle:=xlR1C1) _
        + [GRÅ]"=RC[-1])*("[/GRÅ] + _
        rnValues.Columns(1).Address(ReferenceStyle:=xlR1C1) _
        + [GRÅ]"<>"[/GRÅ][GRÅ]""[/GRÅ][GRÅ]"))"[/GRÅ]
      .Cells(i, 7).FormulaArray = _
        [GRÅ]"=SUM(("[/GRÅ] + _
        rnValues.Columns(3).Address(ReferenceStyle:=xlR1C1) _
        + [GRÅ]"=RC[-2])*("[/GRÅ] + _
        rnValues.Columns(2).Address(ReferenceStyle:=xlR1C1) _
        + [GRÅ]"<>"[/GRÅ][GRÅ]""[/GRÅ][GRÅ]"))"[/GRÅ]
      i = i + 1
  [color="#0000ff"]Next[/color] e

  Range(.Range([GRÅ]"E2"[/GRÅ]), .Range([GRÅ]"E2"[/GRÅ]).[color="#0000ff"]End[/color](xlDown).Offset(0, 2)).Sort _
        key1:=.Range([GRÅ]"E2"[/GRÅ])

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

[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

 

mvh

/Johan

 

Edit: Lite extra radbrytningar, fönstret blir så smalt när man använder kodtaggen ...

 

[bild bifogad 2005-07-28 20:09:01 av Pejo]

[inlägget ändrat 2005-07-28 20:13:46 av Pejo]

[inlägget ändrat 2005-07-28 20:15:38 av Pejo]

733973_thumb.jpg

Link to comment
Share on other sites

Tack och bock!

 

Det fungerar precis som jag tänkt mig.

Har ansett mig relativt van med excel, men faktum är att jag inte tittat på matrisformler tidiagre. Kan tänka mig att de är vädigt användbara.

 

Jag började peta runt med formler just av den anlednig du nämner, men efterom jag gick bet där så fick det här bli näst bästa. Och nu har det blivit en kombination av bägge.

Jag är mycket nöjd.

 

Monshi:

Tackar för tipsen. Användningen av StrComp borde jag ha haft bättre kläm på innan jag postade, men ibland när man går bet blir man blind :(

 

Saker som att undvika .activate är ovärdeliga tips för en nybörjare som har hjälpen i excel som största kunskapskälla. Nu ska jag lägga till XLdennis till listan

 

Poäng till er båda

 

Ibasto

 

Link to comment
Share on other sites

Archived

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



×
×
  • Create New...