07. februar 2023 - 13:06Der er
29 kommentarer og 1 løsning
VBA auto-sortering af tabel, hvor data er cellereferencer
Først: Jeg har ingen forstand på VBA. Min brug af VBA begrænser sig til kode, jeg har fået eller kopieret.
Jeg har en tabel Lager, hvor jeg bruger nedenstående kode til automatisk at sortere efter kolonnen 2023:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim SalesTable As ListObject Dim SortCol As Range
Set SalesTable = ActiveSheet.ListObjects("Lager") Set SortCol = Range("Lager[2023]")
If Not Intersect(Target, SortCol) Is Nothing Then With SalesTable.Sort .SortFields.Clear .SortFields.Add Key:=SortCol, Order:=xlDescending .Header = xlYes .Apply End With End If
End Sub
Data i 2023-kolonnen leveres fra andre af projektmappens ark via cellereferencer. Når et lagertal ændres via indtastning i et af disse ark, sker der imidlertid ingen sortering i Lager-arket på baggrund af den nye værdi, som cellereferencen har leveret til dette. Hvis jeg derimod forsøgsvis indtaster et tal i tabellen, udføres sorteringen.
Kan det lade sig gøre at få tabellen til at auto-sortere på baggrund af 2023-kolonnens cellereference-leverede tal?
Hvis man ændrer indholdet (til fx 75) i Data1-fanens celle A1, ændres værdien i arket Lageroversigt via cellereference. Men der sker ingen sortering.
Hvis jeg derimod ved indtastning af tal ændrer værdien i Lageroversigtfanens celle L2 (som oprindeligt indeholder cellereferencen til førnævnte Data-1 celle A1, sorteres der.
Jeg fik det faktisk til at virke, men da jeg ikke rigtig ved, hvad jeg gør, er jeg nu der, hvor jeg ikke kan reproducere. Så det jeg sætter ind under Modul, bliver det samme under arket og omvendt.
Hvordan kan jeg sætte det ene ind det ene sted og det andet det andet sted?
Jeg har højreklikket på arket > Vis programkode. Der har jeg så valgt Insert > Module
I det Module1, der derved skabes, indsætter jeg den kode du skriver skal ligge i et modul.
Dernæst vælger jeg i Project Explorer mit ark med tabellen. Når jeg herefter indsætter det andet sæt koder, som du beskriver det, står denne kode både under arket og i modulet.
Dér var den. Det jeg ikke havde fundet ud af, var at jeg skulle i kodeeditoren skulle højreklikke på arket og derefter vælge VBAPoject Properties for at kunne få det i to forskellige vinduer for ark og modul.
Jeg er langt fra at forstå, hvad der egentlig foregår. Men nu virker det!
Mange tak for hjælpen, som jeg virkelig værdsætter!
Det er, efter at jeg har prøvet mig frem igen, nok mere præcist at sige, at det der drillede var, at de to vinduer for henh. ark og modul har ligget oveni hinanden, så jeg kun kunne se det ene, hvorfor jeg kun kunne indtaste det ene sted, og derfor fejlagtigt troede, at tingene blev blandet sammen. De to vinduer fremgår tydeligt at dit ark i #6 - hvis andre skulle have brug for tilsvarende hjælp.
Velbekomme du har i arket 2 event handler, de aktiverer makroen der indeholder sorteringskoden, dette er en god måde at bygge det op på da du kun skal rette et sted hvis du vil ændre sorteringen. Kan også gøres mere dynamisk ved at oveføre variabel-værdier til makroen, men det ser ikke ud til du har brug for det.
Du skriver i #7 "Kode man bruger i flere situationer er fornuftig at have i et modul så det kun skal vedligeholdes et sted." Men er der så ikke i den fil, du uploadede, byttet om på koderne til modul og ark? Det med "Lager[2023]", som nu står i modul-koden, er jo specifikt knyttet til mit Lager-ark, mens jeg ikke kan finde noget tabelspecifikt i koden, der står til arket.
Jeg ville prøve at bruge metoden til sortering i et andet ark i projektmappen, hvor tabellen hedder "Forhandler", og kolonnen hedder "Antal". Men det gik ikke. Men før jeg går videre med det, vil jeg lige høre, om jeg tager fejl mht. ovenstående.
Jeg prøvede lige at bytte om på koderne, men så virker det slet ikke. Jeg har så prøvet hvad jeg ellers kunne finde på, men intet virker.
Kan jeg få dig til at hjælpe mig med, hvad jeg skal gøre, når jeg i projektmappen har et andet ark, hvor den tabel, jeg skal have sorteret hedder Forhandler (i arket Forhandleroversigt), og den kolonne i tabellen, der skal sorteres efter hedder Antal.
Jo, det virker. En ting, jeg kunne ønske yderligere, er at placeringerne i Forhandler-tabellen opdateres, når en ny indtastning gør det relevant; det sker først, når jeg har skiftet til et andet ark og så derefter klikker mig tilbage på forhandler-arket. Er det muligt?
Jeg har andre tabeller i projektmappen, hvortil jeg vil tilføje denne autosortering, men jeg tror, at de teknikker, jeg nu er i besiddelse af, vil række til dette.
Jeg har lige opdaget en forskel mellem dine test-ark og så mit "virkelige" ark, som jeg overfører koderne til: Jeg har til de forskellige tabeller tilhørende diagrammer på selvstændige faner, diagrammer som egentlig er dem, jeg kigger på og ikke tabellerne, som leverer data til diagrammerne. I vores test-ark, har jeg tilføjet et diagram af data fra fanen Lageroversigt. Når jeg ændrer et tal i en af Data-fanerne og derefter klikker på diagrammet over Lageroversigten, opdaterer diagrammet sorteret i forhold til de nye værdier. Det gør diagrammerne i mit "virkelige" ark ikke; værdierne opdateres selvfølgelig, men den gamle sortering bibeholdes. Her skal jeg først klikke på fanen med den samlede lageroversigt, som så opdaterer sorteringen, hvorefter jeg kan klikke på diagrammet, som nu er opdateret i forhold til den nye sortering. Jeg vil selvfølgelig gerne have diagrammerne i mit ark til også at opdatere nysorteret, uden at jeg skal forbi et klik på det dataarket for at få dette opdateret først.
Har du nogen ide om, hvad det kan skyldes, at mine diagrammer ikke opdaterer med ny sortering? Kan jeg evt. indsætte noget kode, der sikrer at dataarkene opdaterer i baggrunden, uden at jeg behøver klikke på dem?
Når jeg efter at have indtastet et nyt tal i en af datafanerne klikker på diagramfanen, får jeg fejlmeddelelsen: Run-time error '-2147417848 (80010108)': Method 'Clear' of object 'SortFields' failed Når jeg derefter trykker på Debug-knappen, er .SortFields.Clear gulmarkeret i modulvinduet. Hvis jeg i stedet for at trykke på Debug, trykker på End-knappen, opdaterer diagrammet.
Jeg prøvede lige på min anden computer. Samme resultat. Er du sikker på, at den fil, som du ikke kan genskabe fejlen på, er den samme, som den du har uploadet?
Alternativt: Kan en forskel i Excel-version gøre en forskel? Min er 2013.
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.