Avatar billede lillebror Nybegynder
25. september 2004 - 13:14 Der er 21 kommentarer og
2 løsninger

Et VBA problem

Hejsa.
Jeg har en tabel der indeholder et vilkårligt antal rækker. i kolonnen J står der en masse tal. Det er så meningen at kolonne K skal indeholder tallene fra 1 til (antallet af rækker). Alt efter hvilket tal der er størst. DVS. hvis J1 indeholder 500.000 og J2 indeholder 25.000 så får K1 værdien 1 og K2 værdien 2. Hvis tallene er lige store, så skal den ene af dem have værdien 1 og den anden værdien to, det er lige meget hvilken der får hvad.

Dernæst vil jeg gerne vide hvordan jeg bagefter finder værdierne i et lodret opslag. Jeg har engang benyttet funktionen LOPSLAG, men jeg mener nok den kun vil slå noget op, hvis kilden står til venstre for. Det gør den ikke i det her tilfælde, og det kommer den heller ikke til. Altså noget med, hvordan jeg får rækkenummeret oplyst, når værdien af i K kolonnen er lig 1, 2, 3... osv.

Det var lige to spørgsmål jeg ikke lige kunne hitte ud af selv.
Avatar billede kabbak Professor
25. september 2004 - 13:55 #1
Prøv med funktionen Plads()

I K1 Skriver du =PLADS(J1;$J$1:$J$23;0), hvor J23 er den sidste række.
Træk formlen nedad til enden af dataerne i J kolonnen

Med hensyn til Lopslag, kan du ikke have kolonnen med plads foran i kolonne I, i stedet for i K kolonnen
Avatar billede kabbak Professor
25. september 2004 - 13:57 #2
Men hvis værdierne er lige store, får de samme plads, jeg ved ikke om man kan undgå dette
Avatar billede lillebror Nybegynder
25. september 2004 - 14:02 #3
Måske udtrykker jeg mig uklart. Overskriften sige VBA problem. Derfor vil jeg ikke arbejde med Excel, jeg vil gøre det gennem VBA.

Hvis jeg har 10 rækker altid, så kan jeg jo sagtens gøre det, men fordi det varierer så ændrer det sig efter hvad det skal bruges til, så det duer ikke... Desværre
Avatar billede sjap Praktikant
25. september 2004 - 14:27 #4
Jeg mener at den samme funktion i VBA kan kaldes med

Application.WorksheetFunction.Rank(J1,$J$1:$J$23,0)
Avatar billede kabbak Professor
25. september 2004 - 14:51 #5
Public Sub Plads()
Dim SH As Worksheet, RW As Long
Set SH = Worksheets("Ark1")
RW = SH.Range("J65536").End(xlUp).Row
For i = 1 To RW
SH.Range("k" & i).FormulaR1C1 = "=RANK(RC[-1],R1C10:R" & RW & "C10,0)"' insætter formel
Next
Set SH = Nothing
End Sub

Public Function Opslag(Værdi As Variant)
Dim RW As Long
RW = Range("J65536").End(xlUp).Row
temp = Range("J1:K" & RW)
For i = 1 To RW
If temp(i, 2) = Værdi Then' finder plads
Opslag = temp(i, 1)
Exit Function
End If
Next
Opslag = " Ikke fundet"
End Function
Avatar billede lillebror Nybegynder
25. september 2004 - 15:33 #6
Jeg har regnet din opslagsfunktion ud. Men jeg kan simpelthen ikke forstå det der FormulaR1C1, den giver nemlig ikke et resultat, som jeg kan fremprovokere ved at gøre det manuelt. Hvordan har du indstillet den der?
Avatar billede kabbak Professor
25. september 2004 - 15:41 #7
Man kan godt undvære R1C1

SH.Range("k" & i).Formula = "=RANK(RC[-1],R1C10:R" & RW & "C10,0)"' insætter formel
Avatar billede lillebror Nybegynder
25. september 2004 - 15:44 #8
Kan stadig ikke regne det ud.
"=RANK(RC[-1],R1C10:R" & RW & "C10,0)" Det her vil jeg gerne have forklaret
Avatar billede kabbak Professor
25. september 2004 - 15:49 #9
Rank = Plads
RC[-1] = samme række men cellen til venstre ' hvilken placering skal denne have
R1C10:R" & RW & "C10 = Række1 Kolonne10: Række RW kolonne 10' området den skal finde pladsen i

,0)" Skal den størete have nr 1 eller skal den mindste ( 0 eller 1 )
Avatar billede lillebror Nybegynder
25. september 2004 - 15:53 #10
Nu har jeg så det problem at RANK returnerer samme værdi to gange i nogle tilfælde.
Det ville jo hjælpe hvis jeg lagde 0,000001 til det første tal og 0,000002 til det næste osv. Inden jeg fandt deres rank, men det er jeg ikke helt klar over hvordan man gør
Avatar billede lillebror Nybegynder
25. september 2004 - 16:01 #11
Jeg har et tillægsspørgsmål, og jeg er villig til at give flere point, hvis det skulle være.

Jeg har brug for at vide hvordan man finder den sidste character i en celle. Fordi jeg har nogle celler der hedder et navn efterfulgt af et tal, og der skal ske noget bestemt når det tal er 1
Avatar billede sjap Praktikant
25. september 2004 - 16:06 #12
I celle:
=HØJRE(D1;1)

I VBA:
Right(TekstStreng, 1)
Avatar billede kabbak Professor
25. september 2004 - 16:26 #13
Denne løser problemet med samme plads

Public Sub Plads()
Dim SH As Worksheet, RW As Long
Set SH = Worksheets("Ark1")
RW = SH.Range("J65536").End(xlUp).Row
For I = 1 To RW
SH.Range("k" & I).Formula = "=RANK(RC[-1],R1C10:R" & RW & "C10,0)"
Set myRange = SH.Range("K1:K" & I)
Set myRange1 = SH.Range("K" & I)
A = Application.WorksheetFunction.CountIf(myRange, myRange1)
If A > 1 Then
SH.Range("J" & I).Value = SH.Range("J" & I).Value + 0.000001
I = I - 1
End If
Next
Set SH = Nothing
Set myRange = Nothing
Set myRange1 = Nothing
End Sub
Avatar billede lillebror Nybegynder
25. september 2004 - 16:39 #14
Så er det vist blevet tid til at smide nogle svar, nu kører det nemlig som det skal
Avatar billede kabbak Professor
25. september 2004 - 16:40 #15
et svar ;-))
Avatar billede sjap Praktikant
25. september 2004 - 16:43 #16
Er det ikke lidt som at gå over åen efter vand. Hvis jeg har forstået funktionen korrekt, så er det eneste den gør, at skrive den formel som kabbak foreslog allerførst? Eller er der noget jeg har misforstået?
Avatar billede kabbak Professor
25. september 2004 - 16:46 #17
Det er korrekt, eneste forskel er at den selv finder ud af hvor mange data der er, det var jo vilkårlig antal.
Avatar billede sjap Praktikant
25. september 2004 - 16:48 #18
I øvrigt kunne i så have gjort det nemmere ved at bruge følgende formel

=PLADS(J1;$J$1:$J$5000;1)+TÆL.HVIS(J$1:J1;J1)-1

Så havde i sparet alt det der med 0.000001

Så må i selv vælge om i vil få en makro til at skrive formlen, eller gøre som kabbak foreslog i den første kommentar (dvs. bare skrive formlen i den første celle og kopiere den ned).
Avatar billede lillebror Nybegynder
25. september 2004 - 16:48 #19
Skal da lige forsøge at forklare formålet så.
i mit ark, der hedder Input har jeg 3 kolonner, en salgspris, afsætning og variable enhedsomkostninger og nogle andre variable.
Nedenunder disse overskrifter skriver man alle de mulige kombinationer der findes for disse variable.
I arket Output bliver tallene analyseret og der skal kombinationerne prioriteres efter hvor gode de er. Problemet ligger så i, at der skal laves en afsætningsplan, og hvis jeg reserverer hele J kolonnen til en PLADS funktion, så kan der jo ikke stå noget i den nedenunder min tidligere opstilling. Derfor vil jeg gerne have at den tager fra det sted hvor den starter til det sted hvor den slutter. I stedet for bare at tage hele lortet.

Håber det gav mening :)
Avatar billede sjap Praktikant
25. september 2004 - 16:49 #20
Ups! Formlen skal i jeres eksempel være følgende:

=PLADS(J1;$J$1:$J$5000;0)+TÆL.HVIS(J$1:J1;J1)-1

Den giver godt nok et forkert resultat hos mig, men mine testdata er ikke sorterede.
Avatar billede lillebror Nybegynder
25. september 2004 - 16:51 #21
Skal du ikke have nogle point sjap?
Avatar billede sjap Praktikant
25. september 2004 - 16:53 #22
Kun hvis du giver kabbak mest. Han har slidt mest for løsningen :0)
Avatar billede kabbak Professor
25. september 2004 - 16:54 #23
tak for point ;-))
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