Avatar billede meiland Mester
11. maj 2020 - 23:03 Der er 13 kommentarer og
1 løsning

VBA: Finde værdi i kolonne

Hej eksperter.

Jeg har i  A3:A8 række værdier stående
500
600
750
900
1150
1500

I C3 står den værdi, som jeg forsøge af finde i A3:A8. Hvis C3 ikke findes, skal jeg finde den værdi, der er tættest på - rundet op.
resultatet skrives til celle D3. Der ses bort fra værdier mindre end 500 og større end 1500
Eks:
510 => værdi = 600
1149 => værdi = 1150
750=> værdi =750
Avatar billede Jan K Ekspert
12. maj 2020 - 00:04 #1
I D3:

=INDEKS(A3:A8;SAMMENLIGN(SAND;A3:A8>C3;0))

Hvis værdier under 500 helt skal udelukkes prøv med

=HVIS(C3<500;"";INDEKS(A3:A8;SAMMENLIGN(SAND;A3:A8>C3;0)))

Så vises der en tom celle, hvis C5 er mindre end 500.
IO begge tilfælde skal formlerne indtastes som matrixformel. Det vil sige at der skal afsluttes med Ctrl+Skift+Enter.
Avatar billede jens48 Ekspert
12. maj 2020 - 00:06 #2
=HVIS(ELLER($C$3<500;$C$3>1500);"";HVIS($C$3=LOPSLAG($C$3;$A$3:$A$8;SAND);$C$3;INDEKS($A$3:$A$8;SAMMENLIGN($C$3;$A$3:$A$8;1)+1)))
Avatar billede Jan K Ekspert
12. maj 2020 - 00:09 #3
Værdier større end 1500 giver #I/T! men det kan du også komme3 uden om

=HVIS(C3>1500;"";HVIS(C3<500;"";INDEKS(A3:A8;SAMMENLIGN(SAND;A3:A8>C3;0))))

Stadig en matrixformel
Avatar billede kim1a Ekspert
12. maj 2020 - 08:33 #4
Hvorfor er det at opslag ikke er en mulighed? Er det blot mig som synes det er unødig besværligt med længere formler?

=HVIS(C3<500;"";lopslag(C3;A3:A8;1;SAND))
Avatar billede thomas_bk Ekspert
12. maj 2020 - 08:59 #5
Man skal huske med lopslag at såfremt at tallene der søges i ikke er sorteret fra mindst til størst kan resultatet man får med parameteren Sand være forkert.
Avatar billede xl-Enthusiast Ekspert
12. maj 2020 - 09:13 #6
#3 returnerer 900 hvis opslagsværdien er 750 (og i øvrigt ikke nødvendigt med matrixindtastning)

#4 returnerer 500 hvis opslagsværdien er 510.

Hvis spørgeren eller andre har Office 365 med adgang til XLOOKUP kan følgende bruges:

=XLOOKUP(C3;A3:A8;A3:A8;;1)

dansk: =XOPSLAG(C3;A3:A8;A3:A8;;1)
Avatar billede xl-Enthusiast Ekspert
12. maj 2020 - 09:39 #7
Glemte:

"Der ses bort fra værdier mindre end 500 og større end 1500"

så derfor =HVIS(((C3<500)+(C3>1500));"";XOPSLAG(C3;A3:A8;A3:A8;;1))

hvis ikke Office 365 så:

=HVIS(((C3<500)+(C3>1500));"";INDEKS(A3:A8;SAMMENLIGN(SAND;A3:A8>=C3;0)))
Avatar billede meiland Mester
12. maj 2020 - 10:13 #8
kim1a:
Opslag kan ikke bruges, da den runder ned, hvis værdien ikke findes. Jeg skal runde op i stedet for.

Jan K/jens48:
Alle jeres formler virker efter hensigten. For at holde det simpelt foretrækker jeg

=INDEKS(A3:A8;SAMMENLIGN(SAND;A3:A8>C3;0))

så skal jeg "bare" have lavet en om til VBA...

Hvis jeg "oversætter" formlen til VBA (læs forsøger :-) ), får jeg fejlen Type mismatch.
Men hvor fejlen er, kan jeg ikke lige se.

Sub find_nærmeste()
værdi = Range("C3").Value

Range("C4") = Application.WorksheetFunction.Index(Sheets("Ark1").Range("A3:A8"), Application.WorksheetFunction.Match(1, Sheets("Ark1").Range("A3:A8") > værdi), 0)

End Sub
Avatar billede thomas_bk Ekspert
12. maj 2020 - 10:26 #9
Måske du mangler en 'dim' for at definere din variabel 'værdi'

Personligt holder jeg også helst æ,ø og å ude af kodning.
Avatar billede xl-Enthusiast Ekspert
12. maj 2020 - 10:53 #10
@meiland

Du skriver:

Alle jeres formler virker efter hensigten. For at holde det simpelt foretrækker jeg

=INDEKS(A3:A8;SAMMENLIGN(SAND;A3:A8>C3;0))

men i dit oprindelige indlæg skriver du, at:

750=> værdi =750

Får du det resultat med ovenstående formel, som du foretrækker?
Avatar billede meiland Mester
12. maj 2020 - 11:42 #11
@xl-Enthusiast
Du har ret.... Den var lige smuttet for mig. TAK

Så er det jens48 jeg skal arbejde videre med.
Avatar billede jens48 Ekspert
12. maj 2020 - 11:47 #12
Prøv med denne makro:

Sub find_nærmeste()
Dim Value As Long
Dim x As Integer
Value = Range("C3").Value
If Value < 500 Or Value > 1500 Then
Range("C4") = ""
Else
x = WorksheetFunction.CountIf(Range("A3:A8"), "<" & Value)
Range("C4") = Range("A3").Offset(x, 0)
End If
End Sub
Avatar billede meiland Mester
12. maj 2020 - 11:53 #13
Så lykkedes det vist...

Jeg takker for alle indlæg

Sub test()

vaardi = Range("C3").Value

If vaardi < 500 Then Tykkelse = 500
If vaardi > 1500 Then Tykkelse = 1500

If vaardi >= 500 And vaardi <= 1500 Then
    If vaardi = Application.WorksheetFunction.VLookup(vaardi, Sheets("Ark1").Range("A3:a8"), True) Then
        Tykkelse = vaardi
    Else
        Tykkelse = Application.WorksheetFunction.Index(Sheets("Ark1").Range("A3:A8"), Application.WorksheetFunction.Match(vaardi, Sheets("Ark1").Range("A3:A8"), 1) + 1)
    End If
End If
   
    Range("C4").Value = Tykkelse

End Sub
Avatar billede xl-Enthusiast Ekspert
12. maj 2020 - 12:33 #14
#11

Ja, eller også kunne du bare have brugt:

=INDEKS(A3:A8;SAMMENLIGN(SAND;A3:A8>=C3;0))

som foreslået nederst i #7.
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