Hej,

Någon som är duktig på Excel och kan hjälpa mig med ett problem?

Jag får en prognos på artiklar ifrån en kund i ett visst format medan affärssystemet kräver ett annat format för att läsa in siffrorna.

Någon som kan snickra ihop lite VBA kod som löser mitt problem?

Bifogar ett exempel på vad jag menar.
 
Nu var det så många år sedan jag skapade VBA-makron i Excel så jag vill inte riktigt ge mig på det. Dock så är det ju ganska enkelt att lösa omstruktureringen av datamaterialet med hjälp av pivot-tabeller. Det kräver ju lite handpåläggning vilket inte är särskilt effektivt men det är ju ändå bättre än att sitta och flytta varje rad för hand, om det nu ens är så du gör idag.

Personligen så hade jag valt att fixa problemet med inläsningen i det program som ska läsa in datamaterialet. Men då jobbar jag främst med SAS och ibland lite SQL och de är ju båda mycket enklare att använda för att flytta runt data-material.
 
Vi får prognoser i alla möjliga format och då fungerar Excel relativt bra och man slipper köpa anpassningar för varje kund, har gjort ett makro som hämtar upp kundens filer och skapar en ny csv i ett format som jag sedan läser in.

Skall testa bygga vidare på ditt förslag, man löser ju en del av problematiken iaf , behöver bara få till så det fungerar med automatik och anpassar sig efter filens längd som kan variera och även få till datumraden, kunden ger alltid 12mån prognos med start månaden efter så i exemplet skall Mån1 skall vara lika med oktober, Mån2 = november osv...

Någon som har en alternativ lösning att tipsa om?
 
Slängde ihop ett script som formaterat det aktiva bladet och skapar ett nytt blad för formaterad data. Kanske kan du bygga vidare på detta.

' reads from active sheet and creates a new sheet with formated data
Sub FormatPrediction()

'indexes
Dim inputArticleRow As Integer
Dim inputPredictionColumn As Integer
Dim outputArticleRow As Integer

'sheets
Dim outputSheet As Worksheet
Dim inputSheet As Worksheet

Set inputSheet = ActiveSheet
Set outputSheet = Sheets.Add

' do the formating
outputArticleRow = 1 ' start output at first row
For inputArticleRow = 3 To Blad1.Cells(Rows.count, "a").End(xlUp).Row 'start input at third row and read to last row that contains anything
For inputPredictionColumn = 2 To 6 ' read columns 2 to 6
outputSheet.Cells(outputArticleRow, 1).Value = inputSheet.Cells(inputArticleRow, 1).Value
outputSheet.Cells(outputArticleRow, 2).Value = Format(DateAdd("m", inputPredictionColumn - 1, Date), "YYYYMM") 'next month from current date as first prediction
outputSheet.Cells(outputArticleRow, 3).Value = inputSheet.Cells(inputArticleRow, inputPredictionColumn).Value

outputArticleRow = outputArticleRow + 1 ' adjust index for output
Next
Next

End Sub
 
  • Gilla
ullberg
  • Laddar…
Tack Janus och Pär,

Nu har jag ett par lovande varianter att testa, kvällen är räddad!! (y)
 
Pär: Testade ditt script och det är oerhört nära att göra precis det jag söker :D

Edit: Det gör ju exakt som jag önskade, var nog lite trött när jag testade först....

Klockrent!! Stort tack!!
 
Redigerat:
Nu kommer nästa dilemma, makrot fungerar nu perfekt men skulle vilja att makrot kördes direkt när man öppnade Excel om filen har ett visst namn.

Lägger jag in koden nedan i Excelboken så fungerar det perfekt och det startar så fort jag öppnar boken men eftersom prognosen mailas ifrån kunden så kan ju inte makrot finnas i den boken, lägger jag in samma kod i personal.xslb så får jag istället ett felmeddelande...

Sub auto_open()

If ActiveWorkbook.Name Like "Prognos*" Then

Prognos

Else

End If

End Sub

Kan givetvis ha ett "inläsningsark " med alla makro som hämtar in datan ifrån kundens fil men skulle vilja slippa att jobba med flera filer då de som skall hantera prognoserna har begränsade kunskaper i Excel.
 
B
Kan man ha makro i standardmallen?

Edit: Finns tydligen Personal Macro Workbook, http://wheatblog.com/2011/08/where-is-the-excel-personal-macro-workbook-located/
 
Redigerat:
Mikael_L
Earplugged skrev:
Klockrent!! Stort tack!!
Hehe
Jag hade skrivit:

int x = 1000
do {
printf( "Tack\n" );
} while ( x > 1 );

Fast kanske i VBA-språk då, nu avslöjade jag mig som C-hackare ... :surprised:
 
breakman skrev:
Kan man ha makro i standardmallen?

Edit: Finns tydligen Personal Macro Workbook, [länk]
Ja absolut kan man det, du kan skapa ett antal standardmakron som du ofta använder och som ligger med redo att användas när du öppnar vilken bok som helst och även koppla dessa makron till egna knappar i menyerna så man lätt kommer åt dom.
Saker man alltid vill skall hända när man öppnar Excel kan man lägga automatik på men jag lyckas inte få till villkorsstyrd automatik baserat på filnamnet... frågan är om det går och i så fall hur...
 
Mikael_L skrev:
Hehe
Jag hade skrivit:

int x = 1000
do {
printf( "Tack\n" );
} while ( x > 1 );

Fast kanske i VBA-språk då, nu avslöjade jag mig som C-hackare ... :surprised:
Kör inte detta på en Windowsdator bara, den kommer att hänga ;)

Är förresten inte Microsoft biztalk precis till för det problem TS har ;) Jag har använt det en gång...
 
Jag tror att det även går att ha separata filer med makron som ligger som "resurser" (i Word går det i alla fall). Fast jag vet inte var man hittar det numera... Hatar Office 2010, man hittar ju ingenting längre.
 
Känns som det mest är folk med andra programmeringskunskaper än i just VBA men gör ett försök iaf. :)

Någon som har en teori varför koden som Pär skrivit nedan fungerar perfekt om man sparar den som ett makro i en vanlig arbetsbok men så fort jag lägger den i den personliga makroboken så hoppar man istället direkt till slutet efter raden For inputArticleRow = 3...
(Någon som är skarpare kanske kan testa att klippa in koden i sitt Excel och se om ni får samma resultat)


' reads from active sheet and creates a new sheet with formated data
Sub FormatPrediction()

'indexes
Dim inputArticleRow As Integer
Dim inputPredictionColumn As Integer
Dim outputArticleRow As Integer

'sheets
Dim outputSheet As Worksheet
Dim inputSheet As Worksheet

Set inputSheet = ActiveSheet
Set outputSheet = Sheets.Add

' do the formating
outputArticleRow = 1 ' start output at first row
For inputArticleRow = 3 To Blad1.Cells(Rows.count, "a").End(xlUp).Row 'start input at third row and read to last row that contains anything
For inputPredictionColumn = 2 To 6 ' read columns 2 to 6
outputSheet.Cells(outputArticleRow, 1).Value = inputSheet.Cells(inputArticleRow, 1).Value
outputSheet.Cells(outputArticleRow, 2).Value = Format(DateAdd("m", inputPredictionColumn - 1, Date), "YYYYMM") 'next month from current date as first prediction
outputSheet.Cells(outputArticleRow, 3).Value = inputSheet.Cells(inputArticleRow, inputPredictionColumn).Value

outputArticleRow = outputArticleRow + 1 ' adjust index for output
Next
Next

End Sub
 
Du måste väl peka ut vilket objekt (d.v.s. vilken fil) som makrot ska jobba på?

D.v.s. det där ActiveSheet behöver även innehålla identiteten på den Workbook som gäller?
 
Nerre skrev:
Du måste väl peka ut vilket objekt (d.v.s. vilken fil) som makrot ska jobba på?

D.v.s. det där ActiveSheet behöver även innehålla identiteten på den Workbook som gäller?
Jag har testat med: Set inputSheet = ActiveWorkbook.ActiveSheet vilket inte gjorde någon skillnad, raden: Set outputSheet = Sheets.Add lägger till ett nytt blad i boken precis som den skall så i det fallet fungerar det ju ändå.

Detta gör mig galen... så nära men ändå inte...
 
Vi vill skicka notiser för ämnen du bevakar och händelser som berör dig.