En familj av Microsoft-kalkylbladsprogram med verktyg för att analysera, kartlägga och kommunicera data.
Då tror jag att jag är med i matchen.
Vi börjar i andra änden och tar tipsen först, då detta kommer påverka din kod om du väljer att testa det.
Loopen med att nollställa dina checkboxar handlar om att gå igenom varje checkbox som finns på bladet och sätta värdet till False. Att skriva kod för varje checkbox, speciellt om man har massor, blir många onödiga rader.
Exempel på kod:
For Each cb In ws.OLEObjects
If Left(cb.Name, 3) = "Chb" Then
cb.Object.Value = False
End If
Next cb
Eftersom jag inte vet om du bara har checkboxar som objekt på bladet måste en koll göras så excel inte försöker sätta andra saker till False. If-satsen kollar att objektet cb har ett namn som börjar på Chb (jag utgår från att alla sina checkboxar heter som du visat tidigare; Chb1, Chb2, Chb3....Chb112)
Variablerna här är cb (för checkbox) och ws (för worksheet).
Du bör ha med en deklaration överst i koden för dessa där du skriver
Dim cb As Object
Dim ws As Worksheet
Sen kommer vi till det här med dynamiska blad, alltså vi låser inte in oss på bara Blad1. Direkt efter Dim-satserna i din kod skriver du
Set ws = Activesheet
Detta gör att variabeln ws nu kan användas överallt där vi vill skriva/läsa mot det blad som är aktivt, och inte bara mot ett och samma blad.
Om du lagt till Dim ws As Worksheet överst i koden kan du nu byta ut alla Blad1 mot ws. T ex Blad1.Range(…) blir ws.Range(…), Blad1.Chb1 blir ws.Chb1 … osv.
När du letar första lediga cell i en kolumn kan man låta excel kolla var denna finns via ett End-kommando. Det finns i princip två vägar här och i mina ögon är att leta nedifrån oftast säkrast. Vad menas med det då? Om vi kollar vad End-kommandot gör så är det enklast att visa genom en tangentbordskombination. Ställ dig överst i en kolumn som har sammanhängande celler med värden i sig. Tryck Ctrl+Pil Ned, vad händer? Du hamnar i den nedersta cellen med värden i den kolumnen. Detta är i princip likvärdigt med koden End(xlDown). Om du ställer dig i samma kolumn i en tom cell ett antal rader nedanför sista cellen med data i och trycker Ctrl+Pil Upp. Du hamnar i den sista cellen med data. Detta är likvärdigt med koden End(xlUp).
För- och nackdelar med de båda:
Om du har tomma celler i din kolumn är det alltid bäst att söka nedifrån. Har du bara en rubrik och resten av kolumnen är tom är det bäst att söka nedifrån.
Har du annan data nedanför den data du söker i är det bäst att söka uppifrån.
Hursomhelst, jag visar hur du med en kodrad får fram raden för första lediga cell genom att söka nedifrån upp.
i = ws.cells(rows.Count, 1).end(xlup).offset(1, 0).row
Eftersom End() pekar ut sista cellen lägger man till Offset(1,0), som betyder förskjutning, och vi förskjuter här med 1 rad och 0 kolumner, annars skriver vi över värdet i den sista cellen. Det är cellen EFTER sista cellen med data vi vill ha.
Variabeln i kan du nu använda för att skriva i rätt cell i A-kolumnen, typ:
ws.Range("A" & i) = ….
Observera att man inte behöver ha
Range("A" & i).Select
och sen
Range("A" & i) = nåt värde
för att skriva i en cell.
Du kan direkt skriva Range("W100") = 150 eller liknande för vilka celler som helst utan att du använder Select först.
Select har man bara om man aktivt vill ställa sig i en viss cell. Att använda Select slöar bara ned koden.
Du skulle kunna skriva textvärdet från din textbox till cellen i A-kolumnen med en enda rad. (Inga Select, inga loopar)
ws.cells(rows.Count, 1).end(xlup).offset(1, 0) = Txt1.Text
Laborera och kolla om du hängde med i allt detta. Tipset är att testa i en kopia av din riktiga fil, ifall det skulle skita sig rejält.
Minsta motstånd eller fågelholksuttryck, hör av dig.