Avatar billede Klaus123 Mester
05. april 2016 - 10:49 Der er 6 kommentarer og
2 løsninger

VBA - Unikke værdier

Hej

Jeg har værdier (Ord) i celle F23 til F32 og igen fra D37 til D43. Cellerne kan godt være tomme.

Jeg vil gerne have listet de unikke værdier i cellerne fra C46 og frem til J46. Hvis der er flere unikke værdier end til J46 skal der komme en fejl meddelelse.

Venlig hilsen

Klaus
Avatar billede supertekst Ekspert
05. april 2016 - 13:55 #1
Prøv at Uploade et eksempel - alternativt sende det - @-adresse under min profil.
Avatar billede Sitestory Mester
05. april 2016 - 15:59 #2
Hej

Prøv nedenstående procedure.

Sub Unikke()

Dim lCount As Long
Dim rInput As Range
Dim rCell As Range
Dim colOrd As New Collection
Dim colRemove As New Collection

Set rInput = Range("F23:F32,D37:D43")

On Error Resume Next

'Ordene føjes til en collection med nøgle.
'Hvis det allerede forekommer, føjes ordet
'til en anden collection, colRemove.
For Each rCell In rInput
  If IsEmpty(rCell) = False Then
      colOrd.Add rCell.Value, rCell.Value
      If Err.Number = 457 Then
        colRemove.Add rCell.Value, rCell.Value
        Err.Number = 0
      End If
  End If
Next

'colRemove indeholder evt. dubletter, og vi
'gennemløber colRemove og fjerner dubletterne
'fra colOrd
If colRemove.Count > 0 Then
  For lCount = 1 To colRemove.Count
      colOrd.Remove colRemove.Item(lCount)
  Next
End If

'Nu gennemløbes de unikke værdier i colOrd,
'og de indsættes i celle C46 og mod højre.
'Hvis der er mere end 8 unikke ord, kommer
'en msgbox, og løkken afbrydes.
If colOrd.Count > 0 Then
  For lCount = 1 To colOrd.Count
      If lCount > 8 Then
        MsgBox "Der er mere end 8 unikke ord"
        GoTo BeforeExit
      End If
      Range("C46").Offset(0, lCount - 1).Value = colOrd.Item(lCount)
  Next
End If

BeforeExit:
Set colOrd = Nothing
Set colRemove = Nothing
Set rCell = Nothing
Set rInput = Nothing

End Sub
Avatar billede Klaus123 Mester
05. april 2016 - 16:19 #3
Hej Sitestory

Det er noget af det rigtige, men det er nok mig der har formuleret mig forkert.

Det er alle værdierne jeg gerne vil have listet, men kun en gang, således dubletterne kun fremgår en gang eks.

F23 til F32
A
B
C
B
A

D37 til D43
C
F
E
A

Bliver til
C46 og frem til J46
A B C E F
Avatar billede Sitestory Mester
05. april 2016 - 16:27 #4
Det forenkler jo sagen :-) Så skulle nedenstående være nok:

Sub Unikke()

Dim lCount As Long
Dim rInput As Range
Dim rCell As Range
Dim colOrd As New Collection

Set rInput = Range("F23:F32,D37:D43")

On Error Resume Next

'Ordene føjes til en collection med nøgle.
'Det sikrer, at ord kun tilføjes én gang.
For Each rCell In rInput
  If IsEmpty(rCell) = False Then
      colOrd.Add CStr(rCell.Value), CStr(rCell.Value)
  End If
Next

If colOrd.Count > 0 Then
  For lCount = 1 To colOrd.Count
      If lCount > 8 Then
        MsgBox "Der er mere end 8 unikke ord"
      End If
      Range("C46").Offset(0, lCount - 1).Value = colOrd.Item(lCount)
  Next
End If

BeforeExit:
Set colOrd = Nothing
Set rCell = Nothing
Set rInput = Nothing

End Sub
Avatar billede Klaus123 Mester
06. april 2016 - 07:56 #5
Tak skal du have. Det fungerer perfekt. Skriver du et svar.
Avatar billede Klaus123 Mester
06. april 2016 - 08:41 #6
Hej igen

Jeg får nu en fejl i linjen

Set rInput = Range("F23:F32,D37:D43")
Avatar billede Klaus123 Mester
06. april 2016 - 08:45 #7
Det kom til at virke efter genstart af computeren
Avatar billede Sitestory Mester
06. april 2016 - 16:07 #8
Det var godt :-)
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