14. januar 2010 - 17:32Der er
15 kommentarer og 1 løsning
Sortering af låste celler evt. med VBA
Jeg har et regneark hvor alle næsten alle celler er u-låste. De eneste celler der er låst (når jeg aktiverer ark-beskyttelsen) er matrixen (E3:F300). Jeg har optaget en makro (før jeg har aktiveret ark-beskyttelsen) der sorterer matrixen (A3:R300) i henhold til søjle F. Dette virker fint så længe ark-beskyttelsen ikke er slået til. Men når jeg låser arket, virker min makro-knap ikke længere.
Det allerbedste vil være, hvis det låste (som beskrevet ovenfor) excel-ark kan auto-sortere matrixen (A3:R300) hver eneste gang jeg redigerer i en celle. Jeg har læst mikro lidt om VBA-programmering, men læst mange steder, at man kan rigtig meget med VBA.
Så sidder der nogen med VBA/Makro-erfaring der kan auto-sortere et delvist låst excel-ark, hver gang man redigerer en celle, vil jeg rigtig gerne vide hvordan man kan gøre dette.
I fanebladet: "Provider" skal al min data skrives. I fanebladet: "Kunde bestillinger" skriver jeg KUN varenummeret (Søjle D). Ud fra varenummeret henter Søjle E og F deres data fra fanebladet "Provider".
Hvis det giver nogen mening :)
Det handler altså om at skrive de rå data ind i "provider", og så lade det andet faneblad hente data derfra.
Højreklik på K.B arket's fane Vælg Vis programkode og indsæt koden der Koden kører (sorterer) hver gang du ændrer noget i området D3:D5000
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("D3:D5000")) Is Nothing Then Exit Sub ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False, AllowSorting:=True Range("A3:Q300").Select Selection.Sort Key1:=Range("F3"), Order1:=xlDescending, Key2:=Range( _ "D3"), Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase _ :=True, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, _ DataOption2:=xlSortNormal Range("A3").Select ActiveSheet.Unprotect End Sub
Højreklik på Provider's arkfane Vælg Vis programkode og indsæt koden der Koden kører (sorterer) hver gang du ændrer noget i området D3:D50000
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A2:C50000")) Is Nothing Then Exit Sub Range("A2:C50000").Select Selection.Sort Key1:=Range("B2"), Order1:=xlDescending, Header:=xlNo, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal Range("A2").Select End Sub
I din første kode-stump får jeg en error. Hvis arket er ubeskyttet, så får kode-stumpen arket til at blive beskyttet efter en ændring af en af cellerne. MEN. Jeg får en bug - den sorterer ikke. Men du har ganske vist fået arket til at auto-"et-eller-andet" når jeg ændrer en celleværdi i matrixen.
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("D3:D5000")) Is Nothing Then Exit Sub ActiveSheet.Unprotect Range("A3:Q300").Select Selection.Sort Key1:=Range("F3"), Order1:=xlDescending, Key2:=Range( _ "D3"), Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase _ :=True, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, _ DataOption2:=xlSortNormal Range("A3").Select ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False, AllowSorting:=True End Sub
I det andet ark "provider" auto-sorterer den hver gang en celle ændres i matrixen (A3:A5000) Hvilket er super fint. Der er dog heller ikke nogen celler som er beskyttede.
Hvsi jeg vil have "provider" til kun at auto-opdatere ved indtastning i søjle C, er det så ikke sådan her det skal se ud?
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("C2:C50000")) Is Nothing Then Exit Sub Range("A2:C50000").Select Selection.Sort Key1:=Range("B2"), Order1:=xlDescending, Header:=xlNo, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal Range("A2").Select End Sub
Nu virker det i begge ark. Og jeg har testet, at jeg blot kan ændre de celler der får arket til at auto-sortere:
If Intersect(Target, Range("C2:C50000")) Is Nothing Then Exit Sub
1000 tak for assistancen. Nu har jeg tilmed noget mere jeg kan eksperimentere ud fra. Synes det der VBA er svært at komme rigtigt i gang med (uden bøger og kurser).
Hvis jeg kunne give dig 1000 points havde du fået det! Men læg et svar - så kan jeg berige dig med 150 af slagsen.
Igen tak for din hurtige assistance - og dine korte og præcise forklaringer.
ja som du ser i det andet arks kode, der fjernes beskyttelsen i linie 3 og sættes igen i næst sidste linie, Men hvis ikke det er nødvendigt, er det naturligvis bedst at undgå
Hvis jeg må komme med et tillægsspørgsmål ang. beskyttelsen af arket. Så har jeg fundet ud af hvordan (hvis arket er beskkyttet med en kode) at VBA-koden kan låse arket op ved at skrive
ActiveSheet.Unprotect Password:="DAK" (eksempel)
Man kan sikkert også få VBA-koden til at sætte koden tilbage igen, så koden ikke blot er blank.
Men i alle tilfælde kan jeg stadig højreklikke på fanebladet og se "programkode" - hvori kodeordet jo står. Og så er der jo ikke meget fidus ved at have en kode længere?
Jeg tænker på - kan "vis programkode" beskyttes, så man ikke kan se koden derfra? Eller er vi så ude i noget helt andet?
Det er ikke vigtigt. Jeg er blot nysgerrig, nu hvor jeg har lært lidt :)
Ja man kan godt skjule/beskytte koden i VBA (intet er dog 100% sikkert)
I VBA-editoren (ALT+F11) vælger du VBAProject Properties.. i menuen Tools Under fanen Protection sætter du flueben ved "Lock Project for viewing" og indtaster et kodeord
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.