Avatar billede dougheffernan Nybegynder
23. september 2003 - 14:36 Der er 15 kommentarer og
2 løsninger

Funktion til at finde unikke værdier

Jeg har et Data ark, som indeholder nogle arbejdsnumre (A3->) som også indeholder nogle datoer og ud/ind stemplingstider.
Er det muligt at søge kolonnen igennem og kun få få talt et givent arbejdsnummer én gang?

Eks. på ovenstående:

4322 21/09-2003 fornavn1 efternavn1 07:55 16:06
4322 22/09-2003 fornavn1 efternavn1 08:00 16:00
4322 23/09-2003 fornavn1 efternavn1 08:10 16:15
4325 21/09-2003 fornavn2 efternavn2 08:11 15:55
4321 23/09-2003 fornavn3 efternavn3 08:14 16:14

Jeg vil så kun have listet følgende (altså i numerisk rækkefølge):
4321
4322
4325
Avatar billede christj Nybegynder
23. september 2003 - 22:43 #1
Een måde er at lave en pivot tabel på din liste.

Hvis du derefter har brug for at arbejde videre med listen kan du kopiere den og indsætte den med "indsæt speciel" som værdier.
Avatar billede christj Nybegynder
23. september 2003 - 22:48 #2
Een måde er at lave en pivot tabel på din liste.

Hvis du derefter har brug for at arbejde videre med listen kan du kopiere den og indsætte den med "indsæt speciel" som værdier.
Avatar billede aheiss Praktikant
23. september 2003 - 23:11 #3
Forudsat dine data starter i A3 og nedefter, vil følgende makro danne den sorterede liste i kolonne I :

Sub koersel()
Dim omrode As Range
Dim sort As Range
Set omrode = ActiveSheet.Range("a:a")
Set sort = ActiveSheet.Range("i:i")
For a = 3 To 60000
    If omrode(a, 1) = "" Then
    GoTo neste
    End If
        sort(a, 1) = Left(omrode(a, 1), 4)
Next
neste:
        sort.Select
        Selection.sort Key1:=Range("i:i"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
sortering:
For b = 1 To 60000
    If sort(b, 1) = "" Then
    Exit Sub
    End If
If sort(b, 1) = sort(b + 1, 1) Then
    sort(b, 1).Delete shift:=xlUp
    GoTo sortering
End If
Next
End Sub
Avatar billede bak Forsker
24. september 2003 - 09:11 #4
Sub listuniq()
Dim NoDupes As New Collection
Dim strCheck As String
Dim Fra As Range, Til As Range, Cell As Range
Dim i As Long
    Set Fra = Application.InputBox("marker inputområde (een kolonne)", "Inputområde", , , , , , 8)
    Set Til = Application.InputBox("marker 1. celle i outputområde", "outputområde", , , , , , 8)
    On Error Resume Next
    For Each Cell In Fra
        NoDupes.Add Cell.Value, CStr(Cell.Value)
    Next Cell
    Err.Clear
    On Error GoTo 0
    For Each Item In NoDupes
        Til.Offset(i, 0) = Item
        i = i + 1
    Next
    Range(Til, Til.Offset(i - 1, 0)).Sort Key1:=Til, Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub
Avatar billede bak Forsker
24. september 2003 - 09:14 #5
Denne makro gør start set den samme som aheiss's, men måske lidt hurtigere.
I første box skal du marker de celler du ønsker de unikke værdier fra og i den anden markerer du første celle af outputområdet.
Avatar billede aheiss Praktikant
24. september 2003 - 13:23 #6
Ja det må siges at være en mere elegant løsning. Dog vil et valg af en hel kolonne ("A:A"), ved egentlig brug af blot 1000 rækker gøre kørslen en del mere tidskrævende en nødvendig. Men man kunne jo justere til :
Avatar billede aheiss Praktikant
24. september 2003 - 13:24 #7
Sub listuniq2()
Dim NoDupes As New Collection
Dim strCheck As String
Dim Fra As Range, Til As Range, Cell As Range
Dim i As Long
Set Fra = Application.InputBox("marker inputområde (een kolonne)", "Inputområde", , , , , , 8)
If Fra.Rows.Count = 65536 Then
  kolon = Application.WorksheetFunction.Find(":", ActiveSheet.UsedRange.Address(ReferenceStyle:=xlR1C1), 1)
  start = Application.WorksheetFunction.Find("R", ActiveSheet.UsedRange.Address(ReferenceStyle:=xlR1C1), kolon)
  slut = Application.WorksheetFunction.Find("C", ActiveSheet.UsedRange.Address(ReferenceStyle:=xlR1C1), kolon)
  rakke = Mid(ActiveSheet.UsedRange.Address(ReferenceStyle:=xlR1C1), start + 1, slut - start - 1)
Set Fra = Range(Fra(1, 1), Fra(rakke, 1)) 'ActiveSheet.UsedRange.Rows.Count, 1)) 'Ad"R" & rakke & "C" & kolonne
End If
    Set Til = Application.InputBox("marker 1. celle i outputområde", "outputområde", , , , , , 8)
    On Error Resume Next
    For Each Cell In Fra
        NoDupes.Add Cell.Value, CStr(Cell.Value)
    Next Cell
    Err.Clear
    On Error GoTo 0
    For Each Item In NoDupes
        Til.Offset(i, 0) = Item
        i = i + 1
    Next
    Range(Til, Til.Offset(i - 1, 0)).sort Key1:=Til, Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub
Avatar billede bak Forsker
24. september 2003 - 16:33 #8
enig aheiss. her er mit forslag
Sub listuniq()
Dim NoDupes As New Collection
Dim strCheck As String
Dim Fra As Range, Til As Range, Cell As Range
Dim i As Long
    Set Fra = Application.InputBox("marker 1. celle i inputområde (een kolonne)", "Inputområde", , , , , , 8)
    Set Fra = Range(Cells(Fra.Row, Fra.Column), Cells(65536, Fra.Column).End(xlUp))
    Set Til = Application.InputBox("marker 1. celle i outputområde", "outputområde", , , , , , 8)
    On Error Resume Next
    For Each Cell In Fra
        NoDupes.Add Cell.Value, CStr(Cell.Value)
    Next Cell
    Err.Clear
    On Error GoTo 0
    For Each Item In NoDupes
        Til.Offset(i, 0) = Item
        i = i + 1
    Next
    Range(Til, Til.Offset(i - 1, 0)).Sort Key1:=Til, Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub
Avatar billede aheiss Praktikant
24. september 2003 - 16:59 #9
Smart nok. Den der End(xlUp)..xlDown osv. er ret effektiv må man sige. Jeg bør have den i tankerne noget oftere :-)
Avatar billede bak Forsker
24. september 2003 - 18:17 #10
Tak, det glæder mig at du er istand til at gennemskue mine lidt mærkelige koder og kan komme med forbedringsforslag.
Avatar billede dougheffernan Nybegynder
25. september 2003 - 08:33 #11
:)
Det var lige godt fandens, både hurtigt og godt!

aheiss, dit første forslag gør LIGE det jeg vil have, det er godt nok ikke fordi vi har så mange arbejdsnumre (17) og ikke så mange poster i kolonnen (max. 150), men en hybrid af de 2 forslag ville være dejligt. :)

Jeg vil altså have bak's forslag, men med din "manglende" nødvendighed for "aktivt" at vælge kolonne/kolonnestart. Samtidig vil jeg ikke have den til at tage det aktive sheet, men sheetet Data. Kan det lade sig gøre og hvordan ser koden SÅ ud?
Avatar billede dougheffernan Nybegynder
25. september 2003 - 08:38 #12
Da jeg bruger Option Explicit, ser jeg jo at den brokker sig over Item, hvilken datatype er Item?
Avatar billede aheiss Praktikant
25. september 2003 - 09:42 #13
Skal outputområdet også være fast ? Her er en ny kode. Du skal stå i det ark hvor data skal vises. Skift " ' " mellem række 8 og 9, for at vælge aktivt outputområde eller fast "I1". Item er Variant    :

Sub listuniq()
Dim NoDupes As New Collection
Dim strCheck As String
Dim Fra As Range, Til As Range, Cell As Range, fra2 As Range, item As Variant
Dim i As Long
    Set Fra = Sheets("Data").Range("a:a")
    Set fra2 = Range(Fra(3, 1), Fra(65536, 1).End(xlUp))
    'Set Til = Application.InputBox("marker 1. celle i outputområde", "outputområde", , , , , , 8)
    Set Til = Range("i1")
    On Error Resume Next
    For Each Cell In fra2
        NoDupes.Add Cell.Value, CStr(Cell.Value)
    Next Cell
    Err.Clear
    On Error GoTo 0
    For Each item In NoDupes
        Til.Offset(i, 0) = item
        i = i + 1
    Next
    Range(Til, Til.Offset(i - 1, 0)).sort Key1:=Til, Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub
Avatar billede dougheffernan Nybegynder
30. september 2003 - 09:44 #14
Jeg VILLE jo gerne have resultatet i et andet ark (kender intet til Excel object-modellen), men dette er også fint nok. Takker for hjælpen, aheiss.
Smid et svar, så jeg kan rewarde dig.
Avatar billede aheiss Praktikant
30. september 2003 - 16:22 #15
Her et svar. Hvis jeg husker det kigger jeg lige på det i morgen - det med et andet ark - hvis du altså stadig er interesseret ! :-)
Avatar billede dougheffernan Nybegynder
01. oktober 2003 - 14:02 #16
aheiss, det ER jeg! :)
Takker indtil videre
Avatar billede aheiss Praktikant
02. oktober 2003 - 10:46 #17
Det er såmend rimeligt simpelt. Nedenstående lægger dataene i ARK2 Fra celle A1 og nedefter. Dvs. du selv lige må rette outpuområdet til :
____________________________________________________________________
Sub listuniq()
Dim NoDupes As New Collection
Dim strCheck As String
Dim Fra As Range, Til As Range, Cell As Range, fra2 As Range, item As Variant
Dim i As Long
    Set Til = Sheets("Ark2").Range("a1")  'RET SELV OUTPUTOMRÅDE
    Set Fra = Sheets("Data").Range("a:a")
    Set fra2 = Range(Fra(3, 1), Fra(65536, 1).End(xlUp))
    On Error Resume Next
    For Each Cell In fra2
        NoDupes.Add Cell.Value, CStr(Cell.Value)
    Next Cell
    Err.Clear
    On Error GoTo 0
    For Each item In NoDupes
        Til.Offset(i, 0) = item
        i = i + 1
    Next
    Range(Til, Til.Offset(i - 1, 0)).Sort Key1:=Til, Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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