Behöver hjälp med script till Excel

Permalänk
Inaktiv

Behöver hjälp med script till Excel

Hej
Jag behöver lite hjälp av er att underlätta mitt användande av Excel, att göra det nu tar år och dar och är segt som ***. Det jag behöver hjälp med är:

Har ett stort antal mätningar som är gjorda olika dagar. Tyvärr är mätningen inte konsekvent utan tas lite när som helst. Jag skulle behöva få in de här mätvärdena på rätt datum i en lista där jag har alla dagar i rad. Kan se ut som detta:
...
12-jan 235
17-jan 169
2-feb 200
28-jan 150
...
och jag vill ha det:
....
12-jan 235
13-jan
14-jan
...
17-jan 169
18-jan
....
27-jan
28-jan 150
29-jan
....
2-feb 200
....

Det andra problemet jag har är att jag vill räkna antalet gånger i rad ett visst nummer uppkommer. T.ex

2
5
0
3
0
0
0
1
4

Ska ge en trea bredvid det sista 0:et.

Jag vet inte själv hur man gör, men jag har för mig det finns möjlighet att använda typ Visual basic eller liknande i Excel. Frågar Swec om hjälp och hoppas någon vet hur.

MvH

Permalänk
Medlem

Första delen:

Sub datum() A = 2 LastRow = Range("A" & Rows.Count).End(xlUp).Row While A < LastRow If Range("A" & A).Value - Range("A" & A - 1).Value > 1 Then Rows(A).Insert Range("A" & A).Value = Range("A" & A - 1).Value + 1 LastRow = LastRow + 1 End If A = A + 1 Wend End Sub

Men den koden gillade inte att du skrivit datumen i fel ordning (2 feb före 28 jan).
Om det inte är felskrivning, eller att det saknas över ett år i räkningen så får vi ändra lite.

Andra frågan.
Hur blir det 3?
Och bredvid på vilket sätt? I kolumnen bredvid eller i samma cell som talen?

Permalänk
Medlem

Insåg nyss att du aldrig berättade vilka kolumner dessa siffror finns i men jag antog A och B.

Ta en kopia på filen innan du gör något, efter att du kört ett makro kan man inte "ångra"

Permalänk
Inaktiv

Hej och ursäkta att jag inte skrev tillräckligt tydligt

Hur datumet är skrivet i tabellen ändrar jag lätt genom att formatera cellen annorlunda. Bara säg vilket som passar bäst till scriptet så anpassar jag mig :).

Tyvärr kan datumen vara skrivna i vilken ordning som helst, men det borde vara enkelt för mig att sortera efter, så det behövs inte tas hänsyn till om det komplicerar det.

Serierna sträcker sig över tiotals år så det måste scriptet kunna ta hänsyn till.

Del 2
Scriptet ska räkna hur många gånger en siffra kommer i följd och skriva ut resultatet lämpligen i cellen bredvid den sista upprepningen.

Scripten behöver inte vara i samma utan får gärna vara separata.

Hoppas detta klargör mitt behov lite och tack så enormt mycket för hjälpen, kommer underlätta något enormt.

Mvh snuffle

Permalänk
Medlem

Ja det är bara att sortera kolumnerna efter datum så borde första koden fungera.
Datumen du skrivit har inget årtal så excel kommer utgå från att det är 2012 skulle jag tro.
Hur vet du vilket som är vilket år? Du skrev att mätdatan är under tiotals år.

Dessa siffrorna som ska räknas vilken kolumn är de i?

Du kan inte lägga upp en mindre del av dokumentet med fakesiffror, det blir betydligt lättare.
Ser man inte hur dokumentet ser ut kan man förstöra mycket i vba

Permalänk
Medlem

Om jag förstår din andra request rätt så kan du alltid köra med följande kod direkt i cellerna till höger om kolumnen med data:
=IF(A2=A1;B1+1;1)

alternativt i nästa kolumn använda dig av:
=IF(B3=1;B2;"")

Allt efter mottot:
"Varför göra det svårt när det kan vara busenkelt?"

Ett alternativ till den första frågan utan att använda visual basic skulle kunna vara att använda vlookup().
Skapa bara ett nytt worksheet med startdatum stegrandes till ditt slutdatum (med hjälp av "klicka dra"-metoden förslagsvis).
I nästa kolumn använder du dig av någon liknande formel såsom:
=vlookup(A1;"dittworksheetmeddata!dinData"; 2; FALSE)
eller kanske:
=if(iserror(vlookup(A1;"dittworksheetmeddata!dinData"; 2; FALSE));"";vlookup(A1;"dittworksheetmeddata!dinData"; 2; FALSE))

Visa signatur

P7P55D Pro | i5 750@3,20GHz | Freezer Xtreme Rev.2 | Dominator 1600Mhz 4GB | HD6990 | Corsair TX-850 | SSD 830 256GB | Samsung F1 1TB | P182 | G9 | UltraX Flat | DWA-556

Permalänk
Medlem
Skrivet av Tur:

Om jag förstår din andra request rätt så kan du alltid köra med följande kod direkt i cellerna till höger om kolumnen med data:
=IF(A2=A1;B1+1;1)

alternativt i nästa kolumn använda dig av:
=IF(B3=1;B2;"")

Det där funkar inte.
Om A2<>A1 ska B1+1? Då kommer det bli 1 i cellen.
Om A2=A1 ska det bli 1

Det blir siffror i alla cellerna då.

Sen vill du lägga till ytterligare en kolumn för att lösa den där "busenkla" lösningen?
Och efter det så får du nog lägga till en till kolumn som tar bort ytterligare det som inte ska vara där.
Du får nog fundera över det där mottot du har...

Citat:

Ett alternativ till den första frågan utan att använda visual basic skulle kunna vara att använda vlookup().
Skapa bara ett nytt worksheet med startdatum stegrandes till ditt slutdatum (med hjälp av "klicka dra"-metoden förslagsvis).
I nästa kolumn använder du dig av någon liknande formel såsom:
=vlookup(A1;"dittworksheetmeddata!dinData"; 2; FALSE)
eller kanske:
=if(iserror(vlookup(A1;"dittworksheetmeddata!dinData"; 2; FALSE));"";vlookup(A1;"dittworksheetmeddata!dinData"; 2; FALSE))

Så att lägga till ytterligare ett blad som blir en spegling på första bladet är att hålla det "busenkelt"?
Förvisso kommer det säkert fungera men nån dag kommer man glömma varför man har "två kopior" på det där och plocka bort orginalet vilket gör att det står #ERROR i nästan alla cellerna i det andra bladet.

I min värld är inte "busenkelt" att ha dubbla kopior och referenser kors och tvärs.
Men det kanske bara är jag.

Permalänk
Medlem

Vilken trevlig värld du bor i!

Nja, tanken bakom de korta kodsnutterna inne i worksheet istället för visual basic i "bakgrunden" är väl för att det är snabbare att skriva, väldigt visuellt i din data vad som händer (man kan följa varje steg i taget, vilket brukar förenkla om det kommer någon efteråt och försöker förstå vad man har gjort) och ibland lättare att bygga vidare på.

Men smaken är som baken och det beror lite på va Snuffe skall använda detta till. Min högst personliga åsikt är att min lösning passar bäst för att:
- Snabbt få fram den önskvärda informationen/data
Din lösning tycker jag passar honom utmärkt om han vill:
- Bygga ett trevligt system som han kan använda om och om igen för framtida mätningar

Vad tycker du?

Visa signatur

P7P55D Pro | i5 750@3,20GHz | Freezer Xtreme Rev.2 | Dominator 1600Mhz 4GB | HD6990 | Corsair TX-850 | SSD 830 256GB | Samsung F1 1TB | P182 | G9 | UltraX Flat | DWA-556

Permalänk
Inaktiv

Jag tackar för all hjälp, men jag tror att ett script man kör en gång är det lämpligaste.

Jag la upp en fil på http://www.filedropper.com/script_4 där jag visade hur jag tänkt mig. Hoppas det kan tydliggöra min förklaring.

Återigen, tack så jättemycket för hjälpen!

Permalänk
Medlem
Skrivet av Tur:

Vilken trevlig värld du bor i!

Nja, tanken bakom de korta kodsnutterna inne i worksheet istället för visual basic i "bakgrunden" är väl för att det är snabbare att skriva, väldigt visuellt i din data vad som händer (man kan följa varje steg i taget, vilket brukar förenkla om det kommer någon efteråt och försöker förstå vad man har gjort) och ibland lättare att bygga vidare på.

Men smaken är som baken och det beror lite på va Snuffe skall använda detta till. Min högst personliga åsikt är att min lösning passar bäst för att:
- Snabbt få fram den önskvärda informationen/data
Din lösning tycker jag passar honom utmärkt om han vill:
- Bygga ett trevligt system som han kan använda om och om igen för framtida mätningar

Vad tycker du?

Jag tycker det som ger rätt resultat är det som gäller.
Vill man ha upplägget:
datum värde antal
så ska det vara det och inte två extra kolumner som förvirrar och tar extra plats, och framför allt inte ett extra blad.

Ditt var inte en lösning det var en kompromiss som gick runt problemet.
Det är vad jag tycker.

Skrivet av Snuffle:

Jag tackar för all hjälp, men jag tror att ett script man kör en gång är det lämpligaste.

Jag la upp en fil på http://www.filedropper.com/script_4 där jag visade hur jag tänkt mig. Hoppas det kan tydliggöra min förklaring.

Återigen, tack så jättemycket för hjälpen!

Bara att kopiera in koden i en modul i VBA editorn och köra.

Sub datum() ' Fyller i datumen som saknas A = 3 LastRow = Range("A" & Rows.count).End(xlUp).Row While A < LastRow If Range("A" & A).Value - Range("A" & A - 1).Value > 1 Then Rows(A).Insert Range("A" & A).Value = Range("A" & A - 1).Value + 1 LastRow = LastRow + 1 End If A = A + 1 Wend End Sub Sub rakna() ' Räknar nollorna och fyller i antal i C-kolumnen LastRow = Range("B" & Rows.count).End(xlUp).Row A = 2 While A <= LastRow If Range("B" & A).Value = "0" Then B = 1 While Range("B" & A + B).Value = "0" B = B + 1 Wend Range("C" & A + B - 1).Value = B A = A + B - 1 End If A = A + 1 Wend End Sub

Detta ska funka om upplägget på din orginalfil är precis som det du laddade upp.
Koden förutsätter alltså (bara för att vara klar över det) att du har en "rubrik" i rad 1 och att datumen är sorterade.
Tänk på att du inte bara sorterar A kolumnen när du sorterar utan markerar både A och B, annars kommer värde och datum inte hänga med varandra i sorteringen.

När du kör koden kan det ta en stund eftersom du har många värden, så datorn har inte nödvändigtvis hängt sig.

TA EN KOPIA INNAN OCH JÄMFÖR NOGA RESULTATET EFTER.

Permalänk
Inaktiv

Toppenbra script! Tack så jattemycket!

Verkar vara en liten bugg i datum scriptet, den fyller endast ut till näst sista värdet. De sista värdena kommer alltså direkt efter varandra. Jag antar att det är lätt att fixa men jag har ju som sagt ingen kunskap inom detta.

Permalänk
Medlem

Ja självklart...
Det ska vara While A <= LastRow
Det räcker alltså med att lägga till ett = i koden så funkar den som den ska.

Permalänk
Medlem
Skrivet av Agonotheta:

Jag tycker det som ger rätt resultat är det som gäller.
Vill man ha upplägget:
datum värde antal
så ska det vara det och inte två extra kolumner som förvirrar och tar extra plats, och framför allt inte ett extra blad.

Ditt var inte en lösning det var en kompromiss som gick runt problemet.
Det är vad jag tycker.

TA EN KOPIA INNAN OCH JÄMFÖR NOGA RESULTATET EFTER.

Oj.. Jag försöker en sista gång att öppna upp dina ögon för nya möjligheter:
Man skulle kunna tolka Snuffles request som att han ville ha information. Om vi utgår från denna tolkning så spelar det ingen roll om vi skapar 20 olika worksheets och 14 nya kolumner, så länge han slutligen får fram informationen han ville åt. Utifrån denna tolkning är vägen till informationen mindre viktig och självaste informationen, den slutliga kolumnen, det väsentliga. Om jag nu råkade "[gå] runt problemet" till att få fram den önskvärda informationen, ja då anser jag att mitt tillvägagångsätt är mer förenligt med paretoprincipen och därmed att föredra.

Förövrigt tycker jag att ditt script var en alldeles utmärkt lösning som jag själv gärna hade använt som en återkommande lösning på liknande problem.

Visa signatur

P7P55D Pro | i5 750@3,20GHz | Freezer Xtreme Rev.2 | Dominator 1600Mhz 4GB | HD6990 | Corsair TX-850 | SSD 830 256GB | Samsung F1 1TB | P182 | G9 | UltraX Flat | DWA-556

Permalänk
Inaktiv

Om man skulle passa på och efterfråga ett till script. Jag skulle behöva ett script som interpolerar mellan värden. Jag tänker mig en kolumn med värden med tomma celler mellan som fylls i med hjälp av scriptet. Gärna så man kan ha flera värden och flera tomrum.

1

4

Blir

1
2
3
4

Och

1

1.5

Blir

1
1.25
1.5

Hoppas det är förståbart.

Vänliga hälsningar
Snuffle

Skickades från m.sweclockers.com

Permalänk
Medlem

Behövs verkligen ett makro till det?

När jag provar markera rad 1-4 (i fösta exemplet) och sen väljer Fill -> Series så räknar Excel ut det automatiskt.
Samma för ditt andra exempel.

Men är det något jag missat som gör att den funktionen inte fungerar?

Permalänk
Inaktiv

Den funktionen har jag inte sett, bra att du uppmärksammade mig på den, men den fyller inte riktigt min funktion. Den klarar bara av ett tomrum mellan värden, jag skulle vilja att den klarar av flera tomrum med olika långt mellan värdena.

Jag skulle vilja att makrot interpolerar mellan värdena. Dvs.

1

2

4

resulterar i

1
1.33
1.66
2
3
4

Borde vara relativt enkelt, räkna antalet tomrum, ta skillnaden mellan värdena och dividera på antalet tomrum och sen fylla i tomrummen med värden. Hur man gör det kodningsmässigt är tyvärr ett mysterium för mig.

Hoppas det blev klarare nu.

Hälsningar
Snuffle

Permalänk
Medlem

Var rädd för det svaret...

Men det går att lösa det också..

Koden förutsätter A kolumnen men det går att ändra genom att ändra på tre ställen i koden markerade i koden.

Sub Fill_series() Dim BCell$, ECell$ While Range("A" & Rows.Count).End(xlUp).Row <> Mid(ECell, InStrRev(ECell, "$") + 1) ' Här där det står Range("A" On Error Resume Next BCell = Columns(1).SpecialCells(xlCellTypeBlanks)(0, 1).Address ' Här vid Columns(1) On Error GoTo 0 ECell = Range("A" & Mid(BCell, InStrRev(BCell, "$") + 1)).End(xlDown).Address ' Och sist här vid Range("A" Range(BCell, ECell).Select Selection.DataSeries Rowcol:=xlColumns, Trend:=True Wend End Sub

Koden förutsätter att sista värdet finns. Annars stannar den vid näst sista

Permalänk
Inaktiv

Du är helt underbar! Fantastiskt! Allting fungerar supersmidigt!