Avatar billede Baunster Nybegynder
18. oktober 2012 - 10:48 Der er 20 kommentarer og
1 løsning

Sammenligne tekstrenge

Hej,

Er der nogen der har en simpel funktion der kan gøre følgende:


Æbler
Æbler
Pærer                  Æbler
Pærer                  Pærer
Æbler                  Appelsiner
Appelsiner    ---->    Kiwi
Appelsiner              Bananer
Kiwi   
Bananer
Bananer
Æbler

Altså sammenligne om en tekststreng optræder flere gange. Og hvis den gør, så skal den kun skrives én gang. Strengene optræder i to forskellige ark.
Jeg har prøvet med

=HVIS((LOPSLAG(ark2!A31;Leverandør;3;1))=(LOPSLAG(ark2!A31;Leverandør;3;1));LOPSLAG(A14;Leverandør;3;1);"-")

Men jeg skal have hele min matrix af "frugter" med og her har jeg jo kun den ene af gangen hvilket jo derfor ikke giver det rigtige resultat.
Avatar billede anedi Ekspert
18. oktober 2012 - 11:14 #1
Hvis jeg forstår spørgsmålet rigtigt, kan du markere hele din liste med frugter. kopier den over i en ny kolonne.
Vælg "Data" i menuen.
Vælg Fjern dubletter.

Vh
Anedi
Avatar billede Baunster Nybegynder
18. oktober 2012 - 11:30 #2
Jeg vil helst undgå at bruge den funktion da der ud fra hver "frugt" er endnu en kolonne hvor der er data tilknyttet. Altså et antal "frugter". Dette antal vil blive fjernet eller blive tilknytte til en forkert række..
Avatar billede Baunster Nybegynder
18. oktober 2012 - 11:33 #3
Så måske rækken bare skal skjules, ja jeg i data-kolonnen har en sum.hvis(....) der lægger tallene for de ens "frugter" sammen..
Avatar billede anedi Ekspert
18. oktober 2012 - 12:54 #4
Er det korrekt forstået at du i et ark har en liste med frugtens navn og ved siden af har en liste med et antal? I denne liste kan frugtens navn forekomme flere gange.
Og at du i et nyt ark gerne vil have en liste, hvor frugtens navn kun optræder én gang, og ved siden af en liste der summerer antallet af frugter fra det første ark?

I så fald vil jeg stadig mene, at du kan kopiere hele listen i ark 1 og sætte den ind i ark 2, kolonne A. Vælg derefter fjern dubletter, som ovenfor.

I kolonne B indsættes din sum.hvis-funktion:
=sum.hvis('Ark1'!$A$1:$A$1000;A1;'Ark1'!$B$1:$B$1000)
Avatar billede Baunster Nybegynder
18. oktober 2012 - 13:35 #5
Det er ikke helt korrekt. Jeg vil ikke bruge funktionen "fjern dubletter" da den ikke er dynamisk. Det hele skal for mig køre automatisk. Jeg vil prøve at forklare det mere præcist. Det bliver nok mere indviklet end først antaget:

Jeg har to ark. I det ene ark har jeg én kolonne hvor jeg har nogle frugter listet som ovenfor.

Æbler
Æbler
Pærer                 
Pærer                 
Æbler                 
Appelsiner 
Appelsiner 
Kiwi   
Bananer
Bananer
Æbler

Disse skal hentes over i ark to. Dette har jeg gjort vha. =LOPSLAG(A1;ark1;4;1)osv. Dette er netop lavet for at holde ark2 dynamisk. Så hver gang jeg tilføjer en ny frugt i mit ark1 kommer det automatisk i ark2.

I mit ark2 får jeg henter jeg nogle data fra en database som jeg indsætter i en kolonne ud for hver frugt.
Så nu ser mit ark2 sådan ud:

Æbler              2
Æbler              4
Pærer              6   
Pærer              7   
Æbler              2   
Appelsiner        1
Appelsiner        10
Bananer            8
Kiwi              5
Bananer            14
Bananer            3
Æbler              21

Her ønsker jeg kun at hver frugt skal optræde én gang, men at den totale sum af de ens frugter skal stå ud fra den ene række der bliver tilbage.

Sådan:

Æbler              29
Pærer              13     
Appelsiner        11
Bananer            25
Kiwi              5

(håber det er rigtigt lagt sammen ;-))

Her har jeg så brugt:

=SUM.HVIS($A$1:$A$12;e13;$B$1:$B$12)

Jeg er ved at skrive noget vba-kode, (og har fundet lidt andetsteds) hvor jeg prøver at skjule de rækker der er hvor jeg finder de samme navne men går igen lidt død..

Private Sub Workbook_Open()
    Dim lRow As Long
   
    With Worksheets("Ark2")
        .Rows("1:65536").Hidden = False
        For lRow = .UsedRange.SpecialCells(xlCellTypeLastCell).Row To 1 Step -1
            If .Cells(lRow, 2).String = KAN I HJÆLPE HER? Then
                .Cells(lRow, 2).EntireRow.Hidden = True
            End If
        Next
    End With
End Sub

Håber det giver mere mening...
Måske det bare at finde den rigtige sammenligning i det stykke VBA-kode?
Avatar billede Baunster Nybegynder
19. oktober 2012 - 10:45 #6
Jeg har selv været yderligere igang, og har skrevet lidt mere på en VBA-kode, der ser sådan ud:

Public Sub HideMinusOne()
Dim tekstilType As String
Dim tekstilTestResultat() As String
Dim tekstilCount As Long
'Dim dyn_datatabel() As String

tekstilType = Range("a2")
ReDim Preserve tekstilTestResultat(tekstilType)
           
            With ActiveSheet
        .Rows("1:65536").Hidden = False
            For tekstilCount = .UsedRange.SpecialCells(xlCellTypeLastCell).Row To 1 Step -1
                tekstilTestResultat(tekstilCount) = tekstilType
            Next
           
            If .Cells(tekstilTestResultat, 1).Value = 100 Then
                .Cells(tekstilTestResultat, 1).EntireRow.Hidden = True
            End If
        End With
End Sub

Det skal siges at linjen der tjekker om værdier er lig 100 kun er lavet for at se om jeg overhovedet kan få rutinen til at skjule noget. Når jeg kan det vil jeg begynde at rode med at sammenligne strenge.

Men jeg er slet ikke kommmet helt derned endnu. Jeg bliver bremset helt i toppen:

ReDim Preserve tekstilTestResultat(tekstilType)

Her får jeg en "type mismatch"

Kan nogen fortælle hvorfor? Jeg synes ellers at både tekstilTestResultat og tekstilType er erklæret som strenge..

Håber virkeligt at nogen kan hjælpe. Sidder godt nok fast!
Avatar billede tbak Nybegynder
20. oktober 2012 - 09:11 #7
Er løsningen ikke bare at lave en pivottabel af dataene i ark2?
Avatar billede Slettet bruger
21. oktober 2012 - 08:50 #8
Jeg vil ikke gå ind på en VBA-tankegang, men hvis du kan leve med en formel, så måske følgende, hvor jeg forudsætter, at du har dine data i A1:B13:

Frugt    Antal
Æbler    2
Æbler    4
Pærer    6
Pærer    7
Æbler    2
Appelsiner    1
Appelsiner    10
Bananer    8
Kiwi    5
Bananer    14
Bananer    3
Æbler    21

I for eksempel D2 indtaster du følgende matrixformel:

=INDEKS($A$2:$A$13;SAMMENLIGN(0;TÆL.HVIS($D1:D$1;$A$2:$A$13);0))

Formlen kopieres nedad og vil returnere #I/T når unikke frugter er udtømt. Dennne #I/T værdi lader sig selvfølgelig undertrykke, hvis det er et "must".
Avatar billede Slettet bruger
21. oktober 2012 - 10:08 #9
Korrektion.
Formlen i D2 skulle have været:

=INDEKS($A$2:$A$13;SAMMENLIGN(0;TÆL.HVIS($D$1:D1;$A$2:$A$13);0))
Avatar billede Baunster Nybegynder
22. oktober 2012 - 09:38 #10
Hej,

@tbak: Kan du uddybe løsningen med Pivottabel? Dette er jeg ikke så meget inde i?

@dkhandnu: Det virker jo fint. Men jeg vil så gerne have at de rækker hvor der bliver returneret #I/T bliver skjult automatisk. Her skal jeg vel ud i noget VBA-kode?
Avatar billede Slettet bruger
22. oktober 2012 - 09:55 #11
Ingen grund til at bruge VBA her.
Du kan for eksempel bruge:

=HVIS.FEJL(INDEKS($A$2:$A$13;SAMMENLIGN(0;TÆL.HVIS($D1:D$1;$A$2:$A$13);0));"")

Eventuelt kan du erstatte "" med 0 og så lave en brugerdefineret formatering der skjuler nulværdier.

Hans
Avatar billede Baunster Nybegynder
22. oktober 2012 - 10:20 #12
Det er SUPER! Det eneste der er at jeg i nederst række får et "0" hvorefter rester af rækkerne bliver "" (tommer) som jeg gerne vil ha'. Har du også et quick fix på det?:-)
Avatar billede Slettet bruger
22. oktober 2012 - 10:22 #13
Jeg er ikke med på, hvad du mener.
Avatar billede Baunster Nybegynder
22. oktober 2012 - 10:29 #14
Jeg får:

Æbler
Pærer
Appelsiner
Bananer
Kiwi
0
""
""
""

Eller bare:

Æbler
Pærer
Appelsiner
Bananer
Kiwi
0
Avatar billede Slettet bruger
22. oktober 2012 - 10:33 #15
Med:

=HVIS.FEJL(INDEKS($A$2:$A$13;SAMMENLIGN(0;TÆL.HVIS($D$1:$D1;$A$2:$A$13);0));"")

indtastet som matriksformel i D2 og herefter kopieret nedad får jeg:

Æbler
Pærer
Appelsiner
Bananer
Kiwi

og ikke andet.
Avatar billede Baunster Nybegynder
22. oktober 2012 - 10:53 #16
Mærkeligt! Det gør jeg også nu. Det kan være der havde sneget sig en fejl 40 ind. Eller en fejl-mandag. Nu funker det i hvert fald! Mange tak! Vil du give en kort forklaring om hvad formlen gør?
Avatar billede Slettet bruger
22. oktober 2012 - 12:06 #17
INDEKS-funktionen har følgende syntaks (se Excels hjælp)

INDEKS(matrix; rækkenr; kolonnenr)

Som det fremgår af Hjælp returnerer funktionen værdien af et element i matrix som vælges efter række- og kolonnenummerindeks.
Matricen i det her tilfælde er altså: $A$2:$A$13.

Rækkenummeret bestemmes af det andet argument i INDEKS-funktionen, som er:

SAMMENLIGN(0;TÆL.HVIS($D$1:$D1;$A$2:$A$13);0)

SAMMENLIGN-funktionen søger efter en opslagsværdi (her 0) i en opslagsmatrix (her TÆL.HVIS($D$1:$D1;$A$2:$A$13).

Hvis du aktiverer celle D2 og i formelfeltet markerer (med musen) præcist følgende del af formlen:

TÆL.HVIS($D$1:$D1;$A$2:$A$13)

og trykker på F9 vil du se følgende: {0\0\0\0\0\0\0\0\0\0\0\0}
som udtryk for, at $D$1:$D1 er forskellig fra alle elementer i $A$2:$A$13. Sammenlign vil herefter søge efter opslagsværdien (eksakt) 0 i matricen {0\0\0\0\0\0\0\0\0\0\0\0} og finder denne som matricens første element, hvorfor funktionen returnerer  1.
INDEKS-funktionen er hermed reduceret til:
=INDEKS($A$2:$A$13;1) som returnerer det første element i $A$2:$A$13, altså indholdet i $A$2 (=Æbler).

Prøv nu at aktivere D3. Bemærk at SAMMMENLIGN-formlen nu ser sådan her ud: SAMMENLIGN(0;TÆL.HVIS($D$1:$D2;$A$2:$A$13);0).

Marker nu præcist følgende del af formlen:

TÆL.HVIS($D$1:$D2;$A$2:$A$13

og tryk på F9 vil du se: {1\1\0\0\1\0\0\0\0\0\0\1} som udtryk for, at $D$1:$D2 indeholder "Æbler" (i D2) og "Æbler findes ikke i matricens tredje, fjerde og  sjette til ellevte element. SAMMELIGN-funktionen er hermed reduceret til:

SAMMENLIGN(0;{1\1\0\0\1\0\0\0\0\0\0\1};0).

Funktionen søger efter opslagsværdien (eksakt) 0 i matricen
{1\1\0\0\1\0\0\0\0\0\0\1} og finder denne som element nummer tre, hvorfor returværdien er 3.

INDEKS-funktionen er nu reduceret til:
= INDEKS($A$2:$A$13;3), hvorfor returværdien er det treje element i $A$2:$A$13, altså "Pærer". Og så videre efter samme skema.

Hvis du vil lære at begribe komplekse formler må du først og fremmest vænne dig til grundigt (i Excels hjælp) at studere de funktioner der indgår ligesom du må være fuldt fortrolig med anvendelse af F9-teknikken/Evaluer formel  værktøjet.
Avatar billede Baunster Nybegynder
22. oktober 2012 - 13:53 #18
Det giver mening! Men derfra og så selv komme i tanke om det er der stadig et stykke vej endnu :-)
Det kræver, som du siger, at man er fortrolig med de forskellige formler.

Men jeg siger mange tak! Jeg har nu et ark der fungerer helt efter hensigten!
Avatar billede tbak Nybegynder
22. oktober 2012 - 17:31 #19
Stil dig på ark2 et eller andet sted i dataene,
Tryk Indsæt/Tabel
Tryk Indsæt/Pivottabel
Træk Frugt til Rækkenavne
Træk Antal til Værdier

det giver dig sammentællingen pr. frugt.
Avatar billede Baunster Nybegynder
23. oktober 2012 - 08:33 #20
Har lige prøvet det kort, men kan ikke helt få det til at virke. Men må indrømme at jeg ikke har brugt ret meget tid på det da "dkhanknus" løsning fungerede fint for mig. Han må derfor gerne bede om at få mine 30 point
Avatar billede Slettet bruger
23. oktober 2012 - 08:40 #21
OK.
Hans
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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