29. marts 2007 - 17:33Der er
16 kommentarer og 1 løsning
springe til en celle med det nr man taster ind
Jeg har idag en masse nr. i kollonne A
a1 1000 a2 1001 a3 1002 osv.
Numrerne er faste og skal ALDRIG ændres.
Kan det lade sig gøre at lave en makro gør at hvis man indtaster eks. 1002 i kolonne A, så springer excel til felt a3 som jo indeholder 1002. Hvis man skriver 1090, så springer den til a1091, da denne vil indeholde nr. 1090.
Jeg skal som sagt aldrig ændre i numrerne, men skal bruge det som en slags "nem" søgefunktion.
LAdf mig høre hvis I overhovedet ikke forstår hvad jeg mener med ovenstående
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$B$1" Then' her indtastes nr i B1, ret til en anden celle hvis det ønskes Cells((Target.Value - 1000) + 1, 1).Select End If End Sub
Jep denne løsning virker faktisk rigtig fint, men når man ikke selv programmerer kender man ikke systemets begrænsninger. Derfor kaster jeg lige et spørgsmål op i luften igen :-)
Kan man ikke lave en makro der gør følgende:
Så snart man sætter fokus på en celle i kolonne A skal en makro "gemme" den værdi som er i cellen. Eks. celle a1 = 1000 Hvis man så taster en ny værdi ind i en af cellerne i kolonne A (eks. i celle a1 indtastes værdien 2000): 1. Der skal flyttes fokus til den celle som indeholder værdien 2000 2. Herefter indsættes den værdi der oprindeligt var i celle a1 som man indtastede i (altså den værdi som blev kopieret allerede ved fokus. På den måde kan A1 stadig hedde 1000 og man kan få fokus i celle A1001 som har værdien 2000
Makroen skal altså 1. kopiere værdien i den aktive celle (så snart der er fokus i kolonne A / eller så snart der ændres i kolonne A) 2. springe til den celle som har den nyindtastede værdi (fuldstændig som det er løst ovenfor) 3. indsætte den oprindelige værdi igen i den celle hvor man skrev det søgte kontonr.
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub Application.EnableEvents = False rk = Target.Value - 999 Target = værdi Cells(rk, 1).Select Application.EnableEvents = True værdi = Cells(rk, 1).Value x = 1 End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If x = 0 Then værdi = Target.Value End Sub
Option Explicit Dim Old As Variant Private Sub Worksheet_Change(ByVal Target As Range) Dim I If Target.Column = 1 Then I = (Target.Value - 1000) + 1 If I < 1 Then Application.Undo: Exit Sub ' tjekker om det er et gyldigt nummer Application.EnableEvents = False 'slår de automatiske makroer fra, mens der skrives den gamle værdi Target = Old Application.EnableEvents = True Cells(I, 1).Select ' vælger den valgte række End If End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 1 Then Old = Target ' fanger den eksisterende værdi i den valgte celle End If End Sub
ja, det var jo 2 hurtige svar :-) Jeg har prøvet dem begge af og der er noget der ikke helt virker som det skal i dem begge. Og det er nok bare min egen skyld da jeg ikke har skrevet helt som mit ark er.....
Excelent! Din version hopper til den celle som den skal, men.... Den værdi som den gemmer i makroen er ikke korrekt. Så længe man ikke "piler" sig op og ned i i kolonne A så virker den, og får sat det korrekte tal ind i den celle som er ændret, men hvis man flytter fokus til en anden celle inden man taster et nyt nr ind, så sætter den ikke det rigtige tal ind.
kabbak Din version hopper også til den rigtige celle, men... Den måde din finder frem til cellen på er noget med nr - 1000. Da jeg har ophold i mine nr. virker dette ikke helt som det skal... I får lige et eksempel som det ser ud i virkeligheden: a6 1000 a7 1001 a8 1002 a9 1003 a10 1004 a11 1005 a12 tom a13 tom a14 1006 a15 1007 a16 1008 a17 1009 a18 1010 a19 1011 a20 1012 a21 tom a22 1013 osv. Der er altsp intet system i hvornår der er en tom celle og man kan altså ikke bruge linienr. til at finde ud af hvor fokus skal være.
jep, nu skrives der den korrekte værdi i den "gamle" celle. Men vi har desværre stadig problemet med at eks. celle a19 repræsentere værdien 1011 og ikke 1019.
Hvis jeg skriver 1019 sprnger den til a20 som repræsenterer 1012 som vist ovenfor
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub On Error Resume Next Application.EnableEvents = False rk = Target.Value '- 999 Target = værdi Cells.Find(What:=rk, After:=[A1], LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Select Application.EnableEvents = True værdi = ActiveCell.Value x = 1 End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If x = 0 Then værdi = Target.Value x = 0 End Sub
YES!!!!!! Nu var den der. Det virker rigtig godt. Mange tak for hjælpen. Det er jeg meget glad for. Så skal der bare svares så der kan inkasseres point. :-)
Jeg har lige fundet nogle uhensigtsmæssigheder i koden ,som jeg vil høre om vi lige kan nå at få rettet til :-)
1. Jeg har numrene 1000-6999 i min liste i kolonne A. Hvis jeg skriver et tal der er mindre eller større end disse tal eller hvis jeg kommer til at skrive et bogstav så sletter den det tal der står i den aktive celle i kolonne A. Det er ikke hensigtsmæssig da numrerne 1000-6999 ALTID skal være der. Hvis man således skriver et tal der ikke findes i kolonne A, skal makroen bare stoppe og ikke foretage sig noget. Er det noget der kan fikses?
2. Koden leder efter det indtastede tal i hele arket og springer til den første celle der har det "søgte" tal. Dette er ikke så godt da jeg evt. kunne have tallet 5000 stående i celle d55. Koden skal derfor kun lede efter det søgte tal i kolonne A Kan det lade sig gøre?
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub On Error GoTo ud Application.EnableEvents = False rk = Target.Value Target = værdi Cells.Find(What:=rk, After:=[A1], LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Select If ActiveCell.Column > 1 Then Cells(ActiveCell.Row, 1).Select værdi = ActiveCell.Value x = 1 ud: Application.EnableEvents = True End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If x = 0 Then værdi = Target.Value x = 0 End Sub
Problemet med at indtaste noget som ikke findes i kolonnen eks. "12000" eller "a" er løst, mange tak for det. Men hvis man eks. skriver "a" sætter den fokus i A1 det ville være meget rart at den sætter fokus på enten den celle man lige var i da man søgte efter et nr. eller i cellen lige under. Det skyldes at jeg eksempelvis kan stå i a3300 når jeg taster. Kan man få den til det?
Problemet med at den finder den første "søgte" værdi i hele arket driller også stadig. I celle a16 har jeg konto 1008 og i celle B16 har jeg en indtastet værdi som tilfældigvis er 1017. Hvis jeg nu skriver 1017 i kolonne a så skulle den hoppe til celle a26 (se nedenfor) da denne celle indeholder konto 1017, men den stopper istedet ved celle A16 som har værdien 1008, men som i samme række, altså B16 har en indtastet værdi på 1017 Det skal den ikke, den skal KUN søge i Kolonne A efter 1017 og derved stoppe når den finder tallet 1017 i KOL A (Celle A26)
Jeg kan godt selv se at ovenstående er noget speget, så jeg håber at det giver mening for andre end mig selv :o)
a6 1000 a7 1001 a8 1002 a9 1003 a10 1004 a11 1005 a12 tom a13 tom a14 1006 a15 1007 a16 1008 (i kolonne B står der tilfældigvis "1017" a17 1009 a18 1010 a19 1011 a20 1012 a21 tom a22 1013 osv. a23 1014 a24 1015 a25 1016 a26 1017
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub On Error GoTo ud Application.EnableEvents = False rk = Target.Value Target = værdi Range("A1:A10000").Find(rk, LookIn:=xlValues).Select værdi = ActiveCell.Value x = 1 ud: Application.EnableEvents = True End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If x = 0 Then værdi = Target.Value x = 0 End Sub
Dim Data As Variant Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub Application.EnableEvents = False For i = 1 To UBound(Data) If Data(i, 1) = Target Then Cells(i, 1).Select Exit For End If Next If i >= UBound(Data) Then Target.Select Target.Value = Data(Target.Row, 1) Application.EnableEvents = True End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Data = Range(Cells(1, 1), Cells(65500, 1).End(xlUp)) End Sub
Jeg har lige prøvet jeres 2 sidste forslag af og de virker begge 2 lige som de skal. jeg takker endnu engang.
Men da jeg har givet point i dette spørgsmål er der desværre ikke flere point at give.
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.