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-05-24T12:29:28+00:00

    Att du använder gröna knappar för valda huvudområden är tydligt för användaren och givetvis en finess som inte går att klaga på. Det jag reagerade på tidigare var de knappar som du nu bytt mot checkbox, vilket jag tycker blev renare och tydligare (men allt är väl en smaksak).

    Visa-knappen, ja jag håller med om din följdtanke: få fram info direkt när man bläddrar med SpnBut. Om man kan göra det enkelt för användaren, så gör det. Jag jobbade många år på ett stort svensk telekomföretag, med bl a verksamhetsutveckling och kvalitet, och en hel del av min tid var att hjälpa avdelningar med sina processer, där Excel (datahantering, rapporter, sammanställningar) var huvudverktyget. Man lärde sig snabbt att om mallar eller liknande blir minsta krångliga/bökiga/icke-intuitiva så faller det i graven rätt snabbt. Håll det så enkelt du kan - för användaren. Det avancerade sker ju under ytan såsom kod och andra smarta trix.

    Så, själva koden då?

    Det du beskrivit passar fortfarande in på den kod jag visade i början. Lite tillägg måste göras så alla 14 OptBut kommer med, istället för de fyra som finns nu. Fortsätt bara med nya kodrader där OptionButton5, 6 & 7 t ex kommer kopplas mot kol 9, 10 och 11 (dvs I, J, K) osv med de övriga.

    Jag antar att koden för detta har/ska läggas i proceduren för knappen "Spara redigerat Ino-NR"?

    För dina X blir det samma princip. Här använder du de OptBut som finns i gruppen "Typ av anläggning" och matchar respektive OptBut mot sin motsvarande kolumn. Det jag dock inte riktigt hänger med på här är de grupper du visat. Finns det fem kategorier med enbart ETT val, och en sjätte (Teknik) som inte är ett val i sig utan har fyra undergrupper där någon måste väljas? Då finns det totalt nio olika alternativ där?

    Här kanske jag missförstått (och därför rekommenderade Chb), men kan man välja fler än ett av de olika alternativen; t ex Arbetsmiljö OCH Rutiner? Jag trodde först att det gick, och då gäller Checkbox som ett smart sätt. Kan man dock bara välja ett alternativ bland alla nio, då borde det vara OptBut eftersom det omöjliggör att flera val råkar vara valda.

    Var det här svaret till hjälp?

    0 kommentarer Inga kommentarer
  2. Anonym
    2019-05-24T09:41:02+00:00

    Hej,

    Nu har jag gjort om layouten på formuläret efter det vi hittills diskuterat fram. Checkboxar är ersatta av "OpnButt", kommandoknappar ersatta av "checkbox" samt att jag nu endast har EN "textbox" för beskrivandetext. (se nedan).

    Jag vill bara förklara för dig hur jag byggt upp formuläret och dess användning o funktion. Det hela bygger på att man jobbar med/mot ett huvudmål per inovationsnummer, som exemplet ovan "Ekonomisk framgång". Det kan alltså inte vara flera "gröna" kommandoknappar på samma Ino-NR.

    Jag vet att jag kankse "överarbetar" vissa saker, men jag vill ändå ha nåra av dom finesser/funktioner som jag nu lagt in, ex dessa kommandoknappar som tänds upp "gröna" om det finns innovationstext kopplad till det huvudmålet. Hoppas du förstår. . .

    Om man skapar ett NYTT Ino-NR från formuläret så kan man trycka på den aktuella knappen som då tänds upp och "flaggar visuellt" vad man är i för kategori huvudmål. Vidare så görs tillhörande "frame" (= enable=True) när knappen tänds och OpnButt kan väljas. Släcker man knappen så nollställs all "OpnButt" och ramen blir "låst" . . .

    Vidare så har jag lagt in liknande funktion för Chb-valen till höger, där ramen med "typ avanläggning" blir aktiv när Chb "Teknik" väljs. PÅ samma sätt föreg. knappbeskrivning hanteras denna ram och tillhörande OpnButt när Chb "Teknik" bockas ur.

    Allt detta för att få lite styrning och ordning i valen och sedermera uppgifterna som ska landa på BLAD1.

    Om CmdA1 är vald och någon av dess OpnButt så ska texten i TxtÄ1 ramla in på BLAD1 kolumn D-G, CmdA2 och dess OpnButt in på kolumn I-K, CmdA3 och dess OpnButt på kolumn M-P, CmdA4 och dess OpnButt på kolumn R-T.

    Är det ett NYTT Ino_NR som skapas så ska detta ske på första lediga rad. Är det et tbefintligt nummer som redigeras så ska det styras till den rad som Ino-NR:et finns på.

    Samma princip gäller för dom "X" som ska stämplas in längst till höger på bladet utifrån vilka CHB:er som valts på formuläret, liksom dom datum som satts.

    Allt detta ska nu kodas på smartats sätt med formulärets knappar längst ner.

    "Visa-knappen" är tänkt att användas när man väljer ett Ino-NR via SpnButt längst upp till höger på formuläret. anske onödig - kanske går att bläddra fram tillhörande information från baldet direkt när man ändrar i SpnButt. . ."?"

    Jag stannar där för nu och hoppas du hänger med på mitt upplägg. . .  Select Case-satserna har jag tangerat vid nåra gånger tidgare, men är inte bekväm på egen hand i nuläget. Förstår att den är mycket effektiv och "ren" i förhållande till If-End osv.

    /Väl mött. . .

    MagnusG_68

    Var det här svaret till hjälp?

    0 kommentarer Inga kommentarer
  3. Anonym
    2019-05-23T18:34:33+00:00

    Fråga 1) Ja, du tänker helt rätt. Jag skulle använda en textbox för de innovationsbeskrivningar en användare kan göra, och sen får valet av OptBut styra till vilken kolumn texten senare ramlar in i. Det enklaste sättet att styra rätt utifrån val av OptBut är att använda Select Case, vilket jag hade i min tidigare kod du fick. Jag kan återkomma till detta om du känner att Select Case är lite bortanför greppavstånd för sinnet.

    Fråga 2) Här blev jag aningen förvånad att du INTE använde Chb, som du använt i olika sammanhang tidigare. En Chb är just till för att tillåta val av olika slag, och sen agerar man (koden) på vilka val som gjorts. Chb till skillnad från OptBut möjliggör flerval, och det är det som jag gissar du är ute efter här. Därefter, utifrån klickade Chb, låter man nämnda X hamna i motsvarande kolumner på ditt blad. Genom klick på en Chb ser ju användaren vad som är valt och du behöver inte bekymra dig om att koda färger på knapparna. Det ser också tydligare ut för användaren att det är val det handlar om, vilket knappar inte visar lika tydligt.

    Fråga 3) Här kan du också använda Select Case för att styra så rätt fas i processen landar i rätt cell med sitt datum.

    Innan jag skriver en massa förklaringar om Select Case just nu, kolla i hjälpen lite snabbt vad den gör. T ex skriv Select Case i nån modul du jobbar med och ställ markören på Case, tryck F1. Då landar du i vba-hjälpen. Skrolla ned till "Example" och se ett exempel på hur man kan göra. Jag måste dock medge att exemplet inte på långa vägar visar den uppsjö av bra sätt man kan göra, men den är en start. Sen kan jag specifikt leda dig mer mot det du kanske kommer behöva. Kan också nämna, för att dämpa eventuell panikångest, funktionen är i princip skitsimpel på ren svenska, men man måste bara över den lilla tröskeln. Select Case är som en smartare variant av If - Then.

    Var det här svaret till hjälp?

    0 kommentarer Inga kommentarer
  4. Anonym
    2019-05-23T09:42:05+00:00

    Hej,

    Vi får nog ta detta i "omgångar" så att jag kan gruppera mina frågor och förklaringar på ett lämpligt sätt så du kan hjälpa på bästa sätt.

    Till att börja med så har du rätt i "kolumn A", där ska det sättas det NYA INO-NR som uprättas och allt eftersom så ska man kunna välja via "Spinn-buton-knappen det INO-NR man vill titta på eller redigera via UserForm1. Men först skapas allståvarje nytt nummer i första lediga rad i Kolumn A.

    Sedan. . .

    Jag har klistrat in din kod i modulen för knappen på UserForm1 som heter "Nytt Ino-NR". Formuläret ser just nu ut så här:

    Min fråga härifrån är följande:

    Räcker det med att ha EN TEXTBOX-RUTA som som sedan kopplas (tankas ner) mot den kolumn på blad 1 som valet via Opn-knappen är satt till? Dvs, jag bhöver INTE ha en textboxruta för varje huvudmål som jag har nu? Överarbetat och onödigt krångligt, känner jag nu. . .

    Min andra fråga är:

    Som du ser så har jag et tantal knappar längst till höger på formuläret, vilka jag tänkt mig ska "tändas" med röd knappfärg vid val och som sedan utifrån om den är aktiv eller ej, aktivera ett "X" i särkilda kolumner på BLAD1 - se nedan. . .

    Sista frågan och förklaringen i denna "runda", är som du ser allra längst ut så finns statusrutor, där jag för in datumstämpel enligt rubriceringarna. Detta sker genom dom datumval som kan göras enl ovan på UserForm1.

    Den röda tråden i allt detta är väl at tkunna göra en så kort och koncis kodning för resp funktion så att indatat ramlar ner på bladet där det hör hemma. Det är här jag brister och saknar efrarenhet och iställer använder mig av för mycket loppar och IF-End-satser.

    /MagnusG_68

    Var det här svaret till hjälp?

    0 kommentarer Inga kommentarer
  5. Anonym
    2019-05-22T14:44:12+00:00

    Istället för Checkbox skulle jag rekommendera att du använder OptionButton. Det säkrar att användaren inte kan råka ha två eller fler gjorda val. Med OptionButton (Alternativknapp) garanterar man att endast ett val finns. De är gjorda så att övriga släcks om man byter val, vilket är lämpligt i detta fall.

    Sen till koden för att styra texten till rätt cell.

    I och med att du kontrollerar Ino-NR separat så vet jag inte vilken kolumn du avser gäller som "första lediga rad". Normalt hade jag sökt i kolumn A där NR finns och plockat den första cell som är tom - nu står ett nr redan inskriven. För ett nytt fall, kommer numret alltid sättas innan man går in i Userform och skriver sin text? Dvs är Ino-NR04 i bilden ovan den första lediga raden?

    Följande kod kan läggas i din modul där kod för din Userform finns. Jag använder OptionButton, men du kan byta ut till Checkbox om du vill ha dessa kvar. Kom dock ihåg då att den första Chb som är klickad kommer väljas oavsett andra val. 

    Dim ws As Worksheet

        Dim c As Range

        Dim kol As Long

        Dim rad As Long

        Select Case True

            Case OptionButton1.Value: kol = 4

            Case OptionButton2.Value: kol = 5

            Case OptionButton3.Value: kol = 6

            Case OptionButton4.Value: kol = 7

        End Select

        Set ws = Worksheets(1)

        Set c = ws.Range("A6:A" & ws.Cells(Rows.Count, 1).End(xlDown).Row).Find(what:=ws.Range("B2").value, LookIn:=xlValues, LookAt:=xlWhole)

        If Not c Is Nothing Then 'träff finns

            ws.Cells(c.Row, kol) = text från din textbox i din Userform

        Else 'ingen träff

            rad = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

            ws.Cells(rad, kol) = text från din textbox i din Userform

        End If

    I början av koden kollas vilken Optionbutton som är aktiv, vilket kommer ge en motsvarande kolumnsiffra.

    Sen sätts vilket arbetsblad du samlar all innovationstext i. Är det inte blad 1 ändrar du värdet.

    Därefter söker vi efter ett Ino-Nr (jag har satt cell B2 som detta finns i, byt mot den cell du har). Samma kodrad anges också i vilket område vi söker efter Ino-NR. Jag gissade på från A6 och nedåt. Om första Ino-Nr börjar på annan rad, byt ut 6:an.

    Nu kommer vi till sektionen där koden delas beroende på om vi fick träff på ett Ino-NR eller ej.

    c är bara en variabel som får en cell kopplad till sig om en träff i A-kolumnen inträffar.

    Blir det en träff, dvs c är den cell som har Ino-Nr, så skriver vi din Userform-text i cellen för raden c.Row och kolumnen kol.

    Blir det ingen träff söks en första lediga rad, och texten skrivs nu i denna cell med motsvarande rad, och givetvis kolumnen kol.

    Obs. Här kommer problemet med det jag frågade i inledningen. Om Ino-NR04 är första lediga rad, och ny text ska hamna där, då ska Offset bort från kodraden som letar lediga raden, dvs vi ska inte förskjuta en rad nedåt utan stanna på sista rad med text.

    Så raden i slutet som börjar med *rad = ws.Cells(  )*ska istället vara:

    rad = ws.Cells(Rows.Count, 1).End(xlUp).Row

    Labba runt lite och kolla hur långt du kommer, sen får vi ta justeringar allteftersom frågetecken uppstår.

    Var det här svaret till hjälp?

    0 kommentarer Inga kommentarer