VBA-kod excell 2010

Anonym
2019-05-22T13:19:42+00:00

Hej P3excel!

Jag sitter med likartade funderingar som vi haft tidiagre, men i ett annat projekt med ett excelldatablad jag byggt upp för att samla  och koppla innovationsideer från min arbetgrupp.

Min första fundeirng är hur jag enklast skriver kod för att styra inmatad textbeskrivning från "txtÄ1" i formulär (UserForm1) där jag har fyra kategorival som väljs via checkboxar (ChbFörvärv(D), ChbAdmin(E), ChbBuissness(F), ChbModell(G)).

Beroende på vilken av dessa checkboxar som är vald, ska texten i txtÄ1 hamna på Blad1 och antingen i kolumn D, E, F eller G beroende på Chb-valet.

Beorende på om det är ett HELT NYTT "case", dvs nytt innovationsnummer, så ska allt styras ner mot första lediga rad.

Alternativet är att man väljer ett BEFINTLIGT Ino-NR och då ska tetxten styras ner till den raden och dom kolumnerna.

Jag stannar där med mina frågor och hoppas än en gång på ditt ovärderliga stöd i detta.

//MagnusG_68

Microsoft 365 och Office | Excel | För hemanvändning | Windows

Låst fråga. Den här frågan har migrerats från Microsoft Support Community. Du kan rösta på om det är till hjälp, men du kan inte lägga till kommentarer eller svar eller följa frågan.

0 kommentarer Inga kommentarer

51 svar

Sortera efter: Mest användbara
  1. Anonym
    2019-07-02T20:18:59+00:00

    Hej,

    Det är inte riktigt så illa med min förtåelse men jag blir förvirrad när jag ska utföra vissa moment och det upplevs som om det ligger "ytterligare fel-buggar" som gör att jag ex inte får koden att stega . . . Att markera "stopp" i marginalen har jag testat nåra ggr tidigare, men just stegningen och hur man kör igång den (vart markören ska stå etc), blir en ovan aktivitet ´som läget känns just nu. . . men vi prioriterar inte det just nu utan återkommer då jag inser värdet av att kunna kontrollera kodningen och få fram vörden av variabler m.m.

    Vill bara förklara mig. . . (gammal fakta):

    Beträffande kommandknapparna som jag "städat bort" från bladet så var syftet att endast ha EN knapp, vilket jag också uppfattade som din rekomendation, vid tidigare mailkorrespondens.

    Nuvarande "ÖPPNA-knapp" är i min vision att den ska bara öppna formuläret. I formuläret sedan gör man valet om man vill skapa NYTT Ino-Nr, eller titta på befintligt, vilket man då gör genom at tbläddra fram önskat Ino-NR via SpnInoNr och TxtInoNr. Sedan ska kodningen via "SPARA-knappen" (CmdSave) styra mot ett NYTT eller befintligt InoNr på Bladet, dvs nytt nummer på första lediga rad, eller uppdatera information/data på befintlig rad för valt InoNr.

    Hör har jag tolkat dina rekomendationer att inte ha för många "knappar" som generar onödig mängd kod och kan skapa "otydlighet" för användaren.

    Vidare. . .

    Först vill jag utrycka min ödmjukaste tacksamhet för din otroligt pedagogiska informativa beskrivning av kodningen etc. Helt fantastiskt, verkligen. Din processbild var lysande och hela den beskriver ju det tänk jag nämnt ovan.

    Jag har kollat i min Subrutin för CmdSave, och försökt säkerställa så att koden för "Set c =..." ska vara komplett och riktig i min Sub, dock syns inte hela kodsträngen i gula fältet som du infogat, där jag blir osäker på vad som ska stå efter ". . . Find(what:=ws.Range("C1").Value, . . . "

    I min Subrutin just där, så ser det ut enl bild nedan, EFTER ovanstående kod.

    Ska hela den harangen stå där?? Känns konstigt. . . som du ser är den ju felmarkerad med rött. . .

    Det som för mig känns mest frustrerande just nu är att jag tror mig ha en förståelse för InoNr-styrningen, men tappar liksom den förståelsen när jag läser din text om INO-numret som söks och att det ev ska göras från C1 och attj ag tidigare angett B2. . .

    Om vi tittar in på bladet så ser det ju ut så här: cell B2 och  C1 som du ser är ju inga celler som har någon rubrik eller InoNr-värde. Det är ju i kolumn A (A6) som det första InoNr:et ska hamna. Däärefter fylls det ju på som vi nämnt ner mot A1000. . .

    Det som gör mig förbryllad i grunden är ju hur cell A6 - som blir det första InoNr som skapas - ska kunna skrivas in av formuläret. Det är enlit mig SpnInoNr och TxtInoNr på formuläret som ska vara "verktyget" som används när man HAR befintliga nummer som redigeras. I min värld bläddrar då SpnInoNr-knappen på formuläret bland numrena i kolumn A6:A1000. I Subrutinen som du ser i infogad som bild i föreg svar, ligger ju kodraden "ws.Cells(rad, 1) = TxtInoNr". Det är ju den som sätter in rät text i kolumn A.

    Men - när man skapar NYTT nummer så måste ju koden skrivas så att den skriver in det nya nummer-id:t (ex "InoNr34"), om och när man skapar ett sådant, på nästa lediga cell i kolumn A.

    Ärendetexten som skrivs in i formuläret görs i "TxtIno1" och den ska ju då hamna enl val OptBut kol 4-20.

    Avslutningsvis så känner jag att allt nu hänger på att få klarhet i hur "InoNr01", "InoNr02, osv hamnar i Cell A6, A7 osv.

    Huvudstrukturen har jag egentligen klar för mig, där allt ska hanteras enkelt från formuläret med TVÅ val, precis som du beskrivit i din processkarta ovan. Det är i själva subrutinen för SPARA-knappen och styrande parameter/objekt som jag "kämpar med". . .

    /Väl mött - och stort TACK!!

    MagnusG_68

    Var det här svaret till hjälp?

    0 kommentarer Inga kommentarer
  2. Anonym
    2019-07-02T13:55:08+00:00

    Vi avvaktar med debuggen så länge, jag märker att du inte har riktig förståelse för den kod som finns i nuläget.

    Det viktiga är att du hyfsat förstår koden så du kan justera och lägga till efter behov. Jag inser nu att det är bättre att du skriver den kod som kommer användas istället för att jag gör det. Annars halkar du bara med och jag vet inte vad du uppfattat.

    Angående INO-nr så var det inte listan av nummer i A-kolumnen jag efterfrågade utan det nummer som användaren valt; antingen som ett nytt nummer eller att kika i befintligt ärende. Denna fanns på B2 eller C1 tidigare. Det gör inget att du städat undan saker på bladet, vi måste då bara justera för det.

    Jag visar i bilden nedan det tänk jag har angående din ärendehantering, och främst då vad som händer när man sparar (nya eller uppdaterade) ärenden. Denna bild var vad jag ville förmedla när jag sa att vi har olika programmeringstänk. Inte att du är ny eller har långa loopar. Det handlar om skapandet av en överblick så man inte bygger in krångel. Här ser du tanken med EN spara-knapp. Hade du haft två knappar fanns risken att vid förändringar på bladet skulle du få justera på flera ställen i koden - vilket kanske är hanterbart med enbart två olika knappar, men det är ändå onödigt.

    Jag har ändrat en sak i koden (den hjälpen ger jag idag). Det är raden med Set c =

    Den kodraden är kärnan för att sätta rätt rad som det senare ska skrivas i.

    Jag förenklade koden i början till att bara vara ws.Range("A1:A1000")

    Det betyder att INO-nr söks i det intervallet, istället för dynamiskt (vet inte riktigt var dina listor börjar och slutar). Jag utgår från att antalet ärenden inte överstiger 1000 st (annars får man justera framöver).

    Nästa viktiga del är det som är markerat i rött på samma kodrad. Det är själva INO-numret som söks. Här sökte jag i C1, men det står B2 i den kod du har. Men eftersom det inte längre finns något INO-nummer i den cellen kan vi inte använda den. Du måste sätta var INO-numret kommer att finnas så det går att söka efter detta. Finns den i en textbox på ditt Userform så är det mot denna du ska peka mot i koden och inte cell B2.

    Du har rätt i att det blir fel om txtIno1.Text används. Det är en justering du gjort någonstans längs vägen. Den kod du fått tidigare anger antingen txtÄ1 eller bara text, vilket innebär att det är ärendetexten som ska in där, inte INO-nr överhuvudtaget. Vet inte varför du ändrat detta, men det måste ändras tillbaka.

    Bilden visar i vänsterkanten de olika kodavsnitten som gör de olika inskrivningarna på bladet, men du har av nån anledning raderat de kommentarerna jag skrivit i koden som fanns där initialt. Det är alltid bra att ha kommentarer i koden, så lägg gärna till med vanan att göra egna kommentarer. Man tackar sig själv över detta i framtiden, tro mig.

    Slutligen. "hur är det tänkt att fungera?"

    Ja, det är du som ska svara på det, du sitter i förarsätet. Jag försöker bara lotsa dig igenom terrängen, men du måste sätta och ha en överblick över hur hanteringen ska fungera. Skapa gärna en struktur på papper eller liknande där du kan skissa upp hela hanteringsförfarandet. Att lasta in saker allteftersom utan huvudstruktur blir rörigt, och då blir det svårare att guida.

    Var det här svaret till hjälp?

    0 kommentarer Inga kommentarer
  3. Anonym
    2019-07-01T19:14:51+00:00

    Hej,

    Inte min avsikt att göra dig "förvirrad". Jag har bara försökt rensa upp dels på bladet, dels på formuläret med "onödiga kommandoknappar".  Här det gäller löpnumrena för "Ino-Nr" så måste jag ha kommit åt hela den kolumnen när jag rensat bladet på en del "skräp" . Som du ser så ligger den nummerserien i kolumn A (1).

    Trixandet med att sätta "stopp" vid "Set ws"´=. . ." har jag gjort men när jag kör koden så öpnnas formuläret på bildskärmen, knepigt. . . ?? Även när jag trycker F8, dock är jag osäker på vart jag är någonstans i kodklocket när jag trycker - får ingen riktig kontroll på vad jag gör och vad som händer tråkigt nog. . .

    Dessförinnan testade jag att öppna formuläret från kanppen på bladet och gjorde dom val i formulöret jag önskade och tryckte sedan på "SPARA-knappen". Denna gång hönde det något iallafall. Jag fick ett felmeddelande och en felkod som pekade på raden med "ws.cells(rad, kol) = TxtInonr.text.. . .  Här hänger jag inte med - det blir ju fel om "TxtInonr" längst upp till höger på formuläret är tomt och koden ska jobba utifrån den. Denna textruta med tilhörande spinbutton ska endast användas då man vill bläddra bland befintliga nummer och redigera/ändra dessa. Då ska den styra! Här behöver jag verkligen uppdateras. . . hur är det täbkt att fungera? Se kodraden nedan - ska jag skriva in en 1:a inom parantesen för kolumn A? Eller hur ska den skrivas?

    Jag känner att jag "spårat ur" en aning just nu - tappat kontrollen. . .  Sorry!!

    Var det här svaret till hjälp?

    0 kommentarer Inga kommentarer
  4. Anonym
    2019-07-01T12:32:30+00:00

    En sak till som jag såg.

    Var är InoNr? Förr fanns den i B2, vilket också är där koden kollar om numret finns.

    Någonstans måste måste koden veta vilket nummer som det ska letas efter.

    Är det ett befintligt nummer sätts gällande rad till där numret finns, annars sätts en ny rad efter den sista.

    Jag tror dina justeringar "ställer till det", inte på ett fel sätt, men på ett sätt jag inte vet vad som gäller.

    Var det här svaret till hjälp?

    0 kommentarer Inga kommentarer
  5. Anonym
    2019-07-01T12:26:44+00:00

    Inget händer...

    Det var lite därför jag hade hoppats och nämnt tidigare att du ska testköra lite innan allt börjar ramla på plats.

    Ett tips inför kommande programmering: testkör alltid koden lite i taget allteftersom koden byggs ut mer och mer så slipper man stå men ett helt kodklock som inget händer med.

    Men, det ger oss ett ypperligt tillfälle att hoppa in på något som du absolut kommer behöva kunna när man köra vba - debug.

    Det finns flera j-kligt viktiga verktyg som hjälper programmeraren när något går fel, eller inte funkar alls, eller vad som nu kan gå galet.

    1. stoppa koden vid ett visst ställe
    2. stega igenom koden rad för rad
    3. hålla koll på vad variablerna har för värden

    plus en del annat.

    punkt 1 och 2 brukar man kombinera, dvs man bryter körningen vid en viss rad i koden, och sen kan man stega igenom kodrad för kodrad och se vad som händer, eller borde hända. Man kan stoppa koden på olika sätt, jag använder i princip alltid en brytpunkt som man sätter genom att klicka i vänstermarginalen på kodfönstret - på den rad där man vill att körningen ska stanna. I ditt fall vill vi stanna rätt tidigt för att se om vi får ett värde på variabeln rad, så klicka i vänsterkanten på samma rad som Set ws =... Om du gjort rätt ska hela raden bli markerad i rött.

    Kör koden.

    När du sen kommer tillbaka till vb-editorn pga stoppet kan du nu stega rad för rad genom att trycka F8 för varje stegning.

    Det är nu man kan kika på vad variablerna innehåller för värden, och det är som nämnts rad som är intressant i första hand. Så stega nedåt i koden med hjälp av F8 och se var rad får sitt värde, och vilket det blir. Man kan se en variabels värde genom att bara peka (inte klicka) på det i kodfönstret - ett litet textblock visas intill markören med värdet.

    Testa och labba lite med detta, så kan vi gå vidare med mer saker senare.

    Obs. Glöm inte att klicka i vänstermarginalen igen på samma ställe för att ta bort stoppet, annars kommer koden alltid stanna där när du kör.

    Var det här svaret till hjälp?

    0 kommentarer Inga kommentarer