Permalänk
Medlem

VB-script, excel

Vet inte om detta ska placeras under "MS operativssystem" eller här. Men jag tror det är mest programmering så jag lägger det här.

Ska göra ett exceldokument som summerar vissa kolummner ifrån andra exceldokument. Det är alltid samma kolummer som ska summeras. Det är inte alltid samma filer som ska användas utan man ska kunna lägga till fler.

Har ganska begränsade programmeringskunskaper så var gärna lite övertydliga

/per

Permalänk
Medlem

Re: VB-script, excel

Det framgår inte hur man skall kunna välja filer så detta är ett exempel att summera alla öppnade filer utom den aktiva arbetsboken.

Exemplet förutsätter att Blad1 i varje fil innehåller de aktuella data som skall behandlas.

Den totala summan (formeln) skrivs i B15 i aktiva arbetsboken.

Sub SumFilesColums()
Dim v
Dim w As Object
For Each w In Workbooks
If w.Name <> ThisWorkbook.Name Then
v = v & "SUM([" & w.Name & "]Blad1!$B$1:$B$6)+"
End If
Next w
v = "=" & Left(v, Len(v) - 1)
Range("B15").Formula = v
End Sub

Visa signatur

jacko

Permalänk
Medlem

Ursäkta att jag var lite otydlig.

Antalet filer kan vara mellan 5 och 100 så det vore lite osmidigt att ha alla öppna samtidigt. Jag tänkte att man kunde få upp en ruta där man får välja en excelfil. Eller ännu bättre, att man väljer en folder där alla excelfiler ligger.

Sen vill jag att kolumerna summeras med varandra. Inte att summan av den enskilda kolummen summeras utan det summeras horisontellt. Hoppas du förstår vad jag menar

Permalänk
Medlem

I det här exemplet kan du enkelt välja filer efter behov, eni taget med hjälp av Ctrl-tangenter eller i i serier med Shift-tangent.

$B$1:$H$1 väljer horisontellt rad 1 från B till H. Det att ändra till vad man behöver.

Sub SumFilesColumsII()
Dim v
Dim vf
Dim i As Integer
Dim iPosRev As Integer
Dim sPath As String

On Error GoTo Error_handler:
v = Application.GetOpenFilename("xls files (*.xls), *.xls", , , , True)

For i = 1 To UBound(v)

iPosRev = InStrRev(v(i), "\")
sPath = Left(v(i), iPosRev)

vf = vf & "SUM('" & sPath & "[" & Mid(v(i), iPosRev + 1) & "]Blad1'!$B$1:$H$1)+"

Next i
vf = "=" & Left(vf, Len(vf) - 1)
Range("B20").Formula = vf

Exit Sub
Error_handler:
Exit Sub
End Sub

Edit: Ännu än en ny version

Visa signatur

jacko

Permalänk
Medlem

Tack för att du tar dig tid jacko!

Blev ett litet missförstånd igen tror jag =). Men jag behöver ungefär den funktionen också.

Här är ett exempel.

Fil A Fil B Nyfil
5 7 12
6 3 9
4 5 9
1 10 11

Forumet trycker ihop siffrona så det blir lite kluddigt, men på första raden Fil A =5, Fil B = 7 och Nyfil = 12 (summan).

Btw, vet du nån bra bok om makroprogramering? Kan ju inte hålla på såhär så fort jag vill ha nån liten funktion

Permalänk
Medlem

Oj då!

Är det alltid en och samma kolumn i varje fil som skall användas?
Är antalet rader alltid lika många i varje fil/eller vet man radantalet i förväg?
I vilken rad börjar data.
Frågan är egentligen att kanske behöva söka slutet av data för inte jobba med tomma rutor.

Det går att utveckla exemplet genom att sätta en for loop till för rader och formler så att den placeras på motsvarande rad i resultatbladet.

Har ingen koll på böcker. Jag har själv lärt genom att på arbetet programmerat rätt mycket i Excel (och VB, Access osv).

Visa signatur

jacko

Permalänk
Medlem

Det är alltid samma kolumn och det är alltid lika många rader, 50 st för att vara exakt. Rad 3 till rad 53 tror jag, inte säker, filen är på jobbet.

Ska köpa mig en bok och lära mig sånt här. Men det vore schysst om du kunde knacka in det sista också. Kommer inte vidare i projeketet annars.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Arnie
Det är alltid samma kolumn och det är alltid lika många rader, 50 st för att vara exakt. Rad 3 till rad 53 tror jag, inte säker, filen är på jobbet.

Ska köpa mig en bok och lära mig sånt här. Men det vore schysst om du kunde knacka in det sista också. Kommer inte vidare i projeketet annars.

Det är nog så att maxlängden på en formel är (troligen) 1024 tecken vilket innebär att om sökvägen + filnam blir 50 tkn så formeln klarar inte mer ca 20 filen.

Därför skrev jag om koden så att data från flerna läses till kolumner C, D, E osv samt radvisa summan för alla filer visas i kolumn B.

Om det är inte bra så här så det går att programmera så att ett ledigt blad används för insamling av data och sedan kopiera summakolumnen dit man vill ha den.

Sub SumFilesColumsIII()
Dim v
Dim vf
Dim i As Integer
Dim iRow As Integer
Dim iPosRev As Integer
Dim sPath As String
Dim rwIndex, colIndex
Dim iFileCount As Integer
Dim iDataRows As Integer

On Error GoTo Error_handler:
v = Application.GetOpenFilename("xls files (*.xls), *.xls", , , , True)
If VarType(v) = vbBoolean Then
Beep
MsgBox "Inga filer valda!"
Exit Sub
End If
iDataRows = 50
rwIndex = 3
colIndex = 2
iFileCount = UBound(v)

For i = 1 To iFileCount
iPosRev = InStrRev(v(i), "\")
sPath = Left(v(i), iPosRev)
vf = "='" & sPath & "[" & Mid(v(i), iPosRev + 1) & "]Blad1'!$B3"
With Worksheets("Blad1").Cells(rwIndex, colIndex + i)
.Formula = vf

End With
Next i

Range("B3").Select
ActiveCell.FormulaR1C1 = "=SUM(RC[1]:RC[" & iFileCount & "])"
Worksheets("Blad1").Range(Cells(rwIndex, colIndex), Cells(rwIndex, colIndex + iFileCount)).Select
Selection.AutoFill Destination:=Range(Cells(rwIndex, colIndex), Cells(rwIndex + iDataRows - 1, colIndex + iFileCount)), Type:=xlFillDefault

Exit Sub
Error_handler:
MsgBox Error
Exit Sub
End Sub

Visa signatur

jacko

Permalänk
Medlem

Det är ju helt underbart jacko! Precis så som jag ville ha det.

Tackar så mkt för hjälpen!

Permalänk

Grymt är det Visual basic som man ska lära sig för att bli bra på att koda basic i Excel eller? Är det värt att gå en 5p kurs i VB för det? *Jag har inte rört VB*

Jag såg även i den andra tråden hur smidigt basic var i Excel http://www.sweclockers.com/forum/showthread.php?s=&threadid=6...
Det är ju perfekt för diverse ekonomikalkyler etc. för inte tusan kodar man ett eget program till sånt.

Visa signatur

[Core i7-3930K med 32GB ram, 2*256GB SSD] & [Core i7 3770K med 16 GB RAM, 256GB SSD] som tillsammans har ett [HD 5850 1GB] och 3st 24".

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av bud_bundy
Grymt är det Visual basic som man ska lära sig för att bli bra på att koda basic i Excel eller? Är det värt att gå en 5p kurs i VB för det? *Jag har inte rört VB*

Jag såg även i den andra tråden hur smidigt basic var i Excel http://www.sweclockers.com/forum/showthread.php?s=&threadid=6...
Det är ju perfekt för diverse ekonomikalkyler etc. för inte tusan kodar man ett eget program till sånt.

Grunden i Excels kodning är ju Visual Basic = VBA = Visual Basic for Applications.
Sedan i Excel tillkommer mycket olika saker som inte finns i VB t.ex. diagramhantering osv. Men dessa Excel-specifika saker är lätthanterade genom att spela in makron och (oftast) modifiera dem så att de passa ihop med den övriga koden.
Så 5p kurs i VB är nog vettigt.

Visa signatur

jacko

Permalänk
Medlem

lite off kanske... men hur är det man får upp VB från exel? jag har för mig att det är något snabbkommando..

Visa signatur

E6300 | Thermalright Ultra-120 eXtreme + Noctua 120mm 1200rpm | Gigabyte GA-965P-DS3 | 3GB Corsair XMS2-6400 CL5

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av sunkBurk
lite off kanske... men hur är det man får upp VB från exel? jag har för mig att det är något snabbkommando..

Jag går in i menyn Verktyg->Makro->Spela in ett nytt makro
och slå in något i en ruta och stoppar inspelningen.

Då kan man komma in i VB via Verktyg->Makro->Makron->Redigera
eller Alt-F8.

Det finns kanske andra sätt också men det här fungerar i alla fall.

Visa signatur

jacko

Permalänk
Medlem

Nytt problem

Har ett litet nytt problem. Har två kolumner jag ska göra diagram av. http://pastebin.se/8890 . Ser lite knas ut på pastebin, men första kolumnen är tid, den andra är effekt, den tredje är en ny axel med tid.

Problemet är att jag vill att effektkolumnen lägger sig på den nya tidsaxeln. För att göra detta måste jag räkna ut nya värden på effekten som motsvarar den nya tidsaxeln. Det blir inte bra om man gör en generell funktion av den eftersom den inte motsvarar någon funktion, t.ex rät linje, eller nån polynomekvation.

Istället tänkte jag göra en funktion som tar två punkter i taget. Gör en ekvatation av detta, sedan sätter in den nya tiden. De punkter som väljs är dom som ligger på varsin sida om den nya tiden. T.ex vid 175h väljer den (125;55) och (188;54)

Har gjort en funktion som räknar ut effekten för den nya tiden (enpunktsformeln).

Function NyEffekt(h, x1, y1, x2, y2)
Dim k As Integer
k = (y2 - y1) / (x2 - x1)
NyEffekt = k * h + (k * x1 + y1)
End Function

h är tiden på den nya tidsaxeln. Dvs 175, 350 526 osv.

Nu till problemet. Måste på nåt sätt göra en funktion som letar reda på x1, y1, x2 och y2.

Nån form av loop som kollar i första kolumnen efter en tid som ligger mellan de tider som finns på nya tidsaxeln.

Exempel:
175h: x1= 125, y1 = 55, x2 = 188, y2 = 54
350h: x1 = 313, y1 = 52, x2 =375, y2 = 51
526h: x1 = 501, y1= 49, x2=563, y2 = 48

Hoppas ni fattar

Permalänk
Medlem

Re: Nytt problem

Citat:

Ursprungligen inskrivet av Arnie
Har ett litet nytt problem. Har två kolumner jag ska göra diagram av. http://pastebin.se/8890 . Ser lite knas ut på pastebin, men första kolumnen är tid, den andra är effekt, den tredje är en ny axel med tid.

Problemet är att jag vill att effektkolumnen lägger sig på den nya tidsaxeln. För att göra detta måste jag räkna ut nya värden på effekten som motsvarar den nya tidsaxeln. Det blir inte bra om man gör en generell funktion av den eftersom den inte motsvarar någon funktion, t.ex rät linje, eller nån polynomekvation.

Istället tänkte jag göra en funktion som tar två punkter i taget. Gör en ekvatation av detta, sedan sätter in den nya tiden. De punkter som väljs är dom som ligger på varsin sida om den nya tiden. T.ex vid 175h väljer den (125;55) och (188;54)

Har gjort en funktion som räknar ut effekten för den nya tiden (enpunktsformeln).

Function NyEffekt(h, x1, y1, x2, y2)
Dim k As Integer
k = (y2 - y1) / (x2 - x1)
NyEffekt = k * h + (k * x1 + y1)
End Function

h är tiden på den nya tidsaxeln. Dvs 175, 350 526 osv.

Nu till problemet. Måste på nåt sätt göra en funktion som letar reda på x1, y1, x2 och y2.

Nån form av loop som kollar i första kolumnen efter en tid som ligger mellan de tider som finns på nya tidsaxeln.

Exempel:
175h: x1= 125, y1 = 55, x2 = 188, y2 = 54
350h: x1 = 313, y1 = 52, x2 =375, y2 = 51
526h: x1 = 501, y1= 49, x2=563, y2 = 48

Hoppas ni fattar

Det är inte säkert att jag har fattat rätt.
Jag gjorde ett förslag från scratch:

http://www.flypicture.com/download/OTM4OTk=

Visa signatur

jacko

Permalänk
Medlem

Japp, precis så.

Kanske verkar lite korkat med att det blir 0 på det flesta rader, men det blir det inte sen när man summerar flera aggregat med varandra.

Tackar så mkt!

Permalänk
Medlem

Finns det 5p kurser i VBA/Avancerad Excel? Har letat lite men hittar inte, vore kanon om det fanns på distans alt. kvällskurs, nån vet vilka som håller dessa typer av kurser? (gärna gratis)

Visa signatur
Permalänk
Medlem

Behöver din assitans igen jacko

Det är ungefär samma grej som första grejen jag fråga om. Blev lite osmidigt att summera raderna på det sättet då det är inte bara en kolumn utan det är ~20st. Ska göra pivotdiagram av dessa sen och som det är nu så blir det lite krångligt att jobba med datan.

Istället tänkte jag att man kopierar in hela bladet och summererar bladen med varandra som sedan redovisas i ett eget blad. Precis som förut så ska ingenting summeras i varje enskilt blad utan varje kolumn ska summeras med motsvarande kolumn i nästa blad. Bladen som man kopierer in ska även byta namn till en sträng som står i en cell i den filen man kopierar bladet ifrån. Som tidigare så är varje kolumn 50 rader.

Ex.
FIL A:
blad: Beräkning, cell C3 = 10
blad:indata, cell D4 = 410-11

FIL B:
blad: Beräkning, cell C3 = 20
blad:indata, cell D4 = 410-18

FIL SUM
blad: 410-11, cell C3 = 10
blad: 410-18, cell C3 = 20
blad: sum, cell C3 = 30

Har verkligen försökt lösa detta men inte lyckats. Så jag är inte bara lat

En helt annan sak också. Hur gör man om man har en variabel i ett makro som man vill ska vara tillgänglig för alla andra makron?

Tack på förhand!

Permalänk
Medlem

Jag gjorde något slags "prototyp" där kanske cellerna är inte som du ville ha det. Jag fick inte riktigt ihop att i Ex. A t.ex. C3= 10 och D4 ='410-18 som jag antar är det som skall användas som fliknamn i sammanställningen.
Jag borde kanske haft några filer att jobba mot.

Jag har gjort enligt det som finns i bifogade exempelfiler för data.

http://www.flypicture.com/download/MTA0Mjc4

Globala variabler deklareras utanför någon funktion efter Option Explicit :

Option Explicit
Public aglobalVariabelhere

Sub SumFilesColumsIV()
Dim v
Dim vf
Dim i As Integer
Dim iRow As Integer

Visa signatur

jacko

Permalänk
Medlem

Funkade utmärkt.

Har ett litet annat dilemma som jag inte är säker på går att lösa. Försökte göra en "ta bort funktion" som raderar alla blad. Problemet är att man får upp en ruta där den frågar om man verkligen vill ta bort bladet. Lite jobbigt om det är 50 blad och den frågar varje gång. Går det få bort denna så att den raderar utan att fråga?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Arnie
Funkade utmärkt.

Har ett litet annat dilemma som jag inte är säker på går att lösa. Försökte göra en "ta bort funktion" som raderar alla blad. Problemet är att man får upp en ruta där den frågar om man verkligen vill ta bort bladet. Lite jobbigt om det är 50 blad och den frågar varje gång. Går det få bort denna så att den raderar utan att fråga?

Hej igen!
Exempel på lösningen:

Sub Makro1()
Application.DisplayAlerts = False
Sheets("Blad2").Select
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = True
End Sub

Visa signatur

jacko

Permalänk
Medlem

Ah, var ju inte så svårt.

Har en riktigt avancerad grej kvar som jag inte ens vet om det är möjligt att göra. Ska fundera ut hur jag vill ha det och försöka lite själv först innan jag ev ber om assistans. Isf skickar jag med exempelfiler.

På återhörande!

Edit: Ok jacko, här ska du få nånting riktigt svårt. Har messat dig en bunt med exempelfiler. Filen som ska öppnas är add_0301.xls. Sen trycker du på "Lägg till" och väljer de övriga filerna. Nu skapas en fin pivottabell med det tillhörande diagrammet "Energibalans".

Det andra diagramet är inte kopplat till pivotttabellen eftersom dess data inte ligger i "Källdata" fliken utan den ligger i blad1 som i sin tur är en summering av alla andra blad (det som du hjälpte mig med förra gången). Vore det möjligt att det diagrammet kunde kopplas till pivottabellen på nåt sätt? T.ex om man filterar i tabellen så att bara 410-0601 och 410-0602 är valda så ska enbart dessa summeras och visas i diagrammet. Läste nåt om att man kunde koppla pivottabellen till extern data så på nåt sätt borde det väl gå?

Grymt tacksam om det gick och fixa. Sen är det lite skitsaker som du kan titta på om du känner fört:

Då filen startas så kommer det upp en fråga om man vill "uppdatera från andra filer" eller nåt sånt. Vore skönt att slippa den.

Då inga filer är valda kan man ändå klicka på "namn" på tabellen och då ser man massa "gamla" filer som inte borde ligga där. Ska vara tommt där.

Dataområdet för pivottabellen ska helst anpassas till hur många filer man valt. Dvs har man valt 10 filer ska dataområdet vara 10xantalet kolumner.

Tack på förhand!

Edit2: Gick inte messa dig så jag lägger filerna här:
http://www.flypicture.com/download/MTEzNDQw

Permalänk

Gjorde ett försökt men hittade tyvärr inge lösning, inte säker på att det går