29. marts 2008 - 18:01Der 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?
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
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...
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?
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
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
-> 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?
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?
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
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?
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)
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))
Synes godt om
Ny brugerNybegynder
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.