Avatar billede hubertus Seniormester
29. marts 2008 - 18:01 Der er 13 kommentarer og
1 løsning

Find største score og find dernæst personen der opnåede scoren

Jeg har et range på 10 celler i række 9 fra kolonne c til l (C9:l9). Jeg skal her have afgjort hvilken celle, der indeholder det største tal. Der er let nok, men det er ikke selve tallet som er interessant. Hver celle repræsenterer en person, som står i kolonne c fra c17 og fremefter.

Eks. hvis h9 har størst score, så skal jeg have den til at søge den person op som har opnået denne score. Personerne er listet i cellerne c17 til c26.
Hvordan får jeg løst denne opgave ved hjælp af VBA?
Avatar billede kabbak Professor
29. marts 2008 - 18:50 #1
Skriver personen i A1

Public Sub hvemVinder()
Dim Score As Variant, Vinder As Variant, I As Integer, Max As Double
    Score = Range("C9:L9")
    Vinder = Range("C17:C26")
    Max = Application.WorksheetFunction.Max(Range("C9:L9"))
    For I = 1 To UBound(Score, 2)
        If Score(1, I) = Max Then
          Range("A1") = Vinder(I, 1)
            Exit Sub
        End If
    Next
End Sub
Avatar billede jkrons Professor
29. marts 2008 - 19:24 #2
Måske er det bare mig, og måske virker kabbaks løsning tuilfredsstillende, men det forekommer mig, at der mangler en information om sammenhængen mellem indholdet af C9:L9 og C17:C26.

Hvis vinderen står i H9, hvordan ved man så, hvilket navnene i C17:C26 denne score repræsenterer? Altså om det fx er navnet i C17 eller C18 eller...
Avatar billede hubertus Seniormester
30. marts 2008 - 11:17 #3
Der er fint sammenhæng som ligger i for next løkken. :O)
Kabbak -> scoren er et resultat af flere dommers indtastning i andre sheets, så tallet fremkommer vha. en formel, der henter resultaterne fra dommernes sheets. Kan din kode udvides således at den løbene viser vinderen. Dvs. hver gang en dommer indtaster, så gennemløbes koden. Det jeg efterlyser er en event rutine, der reagere på dommernes indtastning.
Hvis der er to ens værdier, så får jeg kun den første, kan jeg ikke få dem begge?
Avatar billede kabbak Professor
30. marts 2008 - 19:47 #4
Nu får du den som funktion

Public Function Vindere()
Application.Volatile
Dim Score As Variant, Vinder As Variant, I As Integer, Max As Double, Temp As String
    Score = Range("C9:L9")
    Vinder = Range("C17:C26")
    Max = Application.WorksheetFunction.Max(Range("C9:L9"))
    Temp = ""
    For I = 1 To UBound(Score, 2)
        If Score(1, I) = Max Then
          Temp = Temp & Vinder(I, 1) & " & "
         
        End If
    Next
Vindere = Left(Temp, Len(Temp) - 2)
End Function

I den celle du vil have vinderne, skriver du

=vindere()
Avatar billede kabbak Professor
30. marts 2008 - 19:50 #5
Når der tastes i andre ark, skal vi have arknavn med, her [Ark1]

Public Function Vindere()
Application.Volatile
Dim Score As Variant, Vinder As Variant, I As Integer, Max As Double, Temp As String
    Score = [Ark1].Range("C9:L9")
    Vinder = [Ark1].Range("C17:C26")
    Max = Application.WorksheetFunction.Max([Ark1].Range("C9:L9"))
    Temp = ""
    For I = 1 To UBound(Score, 2)
        If Score(1, I) = Max Then
          Temp = Temp & Vinder(I, 1) & " & "
         
        End If
    Next
Vindere = Left(Temp, Len(Temp) - 2)
End Function
Avatar billede hubertus Seniormester
31. marts 2008 - 19:34 #6
-> kabbak
Den første rutine 19:47:14 virker fint, hvis jeg f.eks. skriver et eller andet i en celle og trykker enter - derved genberegnes arket og resultatet fremkommer helt som det skal. Hvis ikke jeg gør noget, så sker der ikke en disse. Hvordan undgår jeg det?
Avatar billede kabbak Professor
31. marts 2008 - 21:49 #7
Den fra 19:50:44, skulle virke, du skal rette [Ark1], til navnet på dit ark
Avatar billede hubertus Seniormester
01. april 2008 - 10:27 #8
Jeg har prøvet rutinen fra 19:50, men jeg får følgende: #VÆRDI!. Jeg går ud fra at ark1 skal erstattes med navnet på det ark hvor resultatet samles på, er det ikke korrekt?
Avatar billede kabbak Professor
01. april 2008 - 11:05 #9
Jeg kan ikke se nogen fejl, men, jeg har lavet så der kun er et sted at rette arknavn.
Ja, det skal være navnet på det ark, der indeholder navne og værdier.

Public Function Vindere() As String
    Application.Volatile
    Dim Score As Variant, Vinder As Variant, I As Integer, Max As Double, Temp As String
    Dim Sh As Worksheet
    Set Sh = Worksheets("Ark1") ' Ret til dit ark
    Score = Sh.Range("C9:L9")
    Vinder = Sh.Range("C17:C26")
    Max = Application.WorksheetFunction.Max(Sh.Range("C9:L9"))
    Temp = ""
    For I = 1 To UBound(Score, 2)
        If Score(1, I) = Max Then
            Temp = Temp & Vinder(I, 1) & " & "
        End If
    Next
    Vindere = Left(Temp, Len(Temp) - 2)
    Set Sh = Nothing
End Function
Avatar billede hubertus Seniormester
01. april 2008 - 12:13 #10
Der er da bare helt perfekt - tak for hjælpen :O))
Så mangler der blot et svar - før jeg kan lukke - fikse du det?
Avatar billede kabbak Professor
01. april 2008 - 12:48 #11
et svar ;-))
Avatar billede hubertus Seniormester
02. april 2008 - 06:19 #12
Hej kabbak - jeg har brug for at finde 2 og 3 pladsen. Kan du også klare det? Skal det være som et nyt spørgsmål, eller kan jeg bare oprette et med nogle point for svar?
Avatar billede kabbak Professor
02. april 2008 - 20:03 #13
Ja det blev den jo ikke kortere af

Du skal nu bruge formlen =vindere(1) for førstepladsen
og  =vindere(2) og =vindere(3) for anden og tredjepladsen

Public Function Vindere(Nummer As Integer) As String
    Application.Volatile
    Dim Score As Variant, Vinder As Variant, I As Integer, Max As Double, Temp As String
    Dim Sh As Worksheet
    Set Sh = Worksheets("Ark1")    ' Ret til dit ark
    Score = Sh.Range("C9:L9")
    Vinder = Sh.Range("C17:C26")
    Max = Application.WorksheetFunction.Max(Score)
    Temp = ""
    If Nummer = 1 Then

        For I = 1 To UBound(Score, 2)
            If Score(1, I) = Max Then
                Temp = Temp & Vinder(I, 1) & " & "
            End If
        Next
        Vindere = Left(Temp, Len(Temp) - 2)
    ElseIf Nummer = 2 Then

        For I = 1 To UBound(Score, 2)
            If Score(1, I) = Max Then Score(1, I) = 0
        Next

        Max = Application.WorksheetFunction.Max(Score)

        For I = 1 To UBound(Score, 2)
            If Score(1, I) = Max Then
                Temp = Temp & Vinder(I, 1) & " & "
            End If
        Next
        Vindere = Left(Temp, Len(Temp) - 2)
    Else
        For I = 1 To UBound(Score, 2)
            If Score(1, I) = Max Then Score(1, I) = 0
        Next
        Max = Application.WorksheetFunction.Max(Score)
        For I = 1 To UBound(Score, 2)
            If Score(1, I) = Max Then Score(1, I) = 0
        Next

        Max = Application.WorksheetFunction.Max(Score)

        For I = 1 To UBound(Score, 2)
            If Score(1, I) = Max Then
                Temp = Temp & Vinder(I, 1) & " & "
            End If
        Next
        Vindere = Left(Temp, Len(Temp) - 2)

    End If
    Set Sh = Nothing
End Function
Avatar billede hubertus Seniormester
05. april 2008 - 08:27 #14
Næ, det kan du have ret i, men den virker!!!  og det var præcis det jeg søgte.
Jeg opretter lige et spørgsmål med nogle point.
Tak for hjælpen og god weekend. :O))
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