Permalänk
Medlem

Knapp excel

Jag skulle vilja ha en knapp i excel (i spreadsheeten då) som tar informationen i t.ex sheet1!A4, sheet1!A9 osv och förflyttar dom till förbestämda kolumner en annan excel workbook (som inte är aktiv). Varje gång man trycker på knappen skall alltså samma information lagras i en ny rad i den förbestämda kolumnen.

Förslag på hur man kan ordna detta?

Exempel: När jag trycker på knappen första gången skall informationen från A1 och B1 flyttas till workbook2, A1, B1. Nästa gång jag trycker skall dom läggas i A2, B2. Och nästa gång i A3, B3.. Ni förstår principen...

Edit: Samma knapp ska också skriva ut en viss del av dokumentet.

Visa signatur

i7 920 @ 4.4 Ghz - HT On | HD5870 | Vertex SSD | Thermochill 120.4 - Heatkiller 3.0 - EK5870 | Silverstone TJ07
TJ07 WeeMaan Edition :D

Permalänk
Medlem

Macro är det du efterfrågar. Finns inspelningsfunktionalitet så du behöver inte koda största delen, dock måste du nog programmera lite (VB) för att göra kontrollen efter nästa tomma rad.

Permalänk
Medlem
Skrivet av jonke:

Macro är det du efterfrågar. Finns inspelningsfunktionalitet så du behöver inte koda största delen, dock måste du nog programmera lite (VB) för att göra kontrollen efter nästa tomma rad.

Okej, tack för svar.
Gjorde ett macro som för över information till en annan workbook, sparar och avslutar. Såhär ser koden ut.

Sub Macro1() ' ' Macro1 Macro ' ' Sheets("Årsanmälan").Select Range("C5:C8").Select Selection.Copy Workbooks.Open ("C:\excel\salarydata.xlsm") ActiveSheet.Paste ActiveWorkbook.Save ActiveWindow.Close Sheets("Löneräkning").Select End Sub

Nu är jag inte någon programmeringsnisse direkt, men man borde ju kunna klämma in en IF sats där jag lämnade mellanrum?
Som säger att om A1 är ledig klistra in där, annars klistra in till B1, annars C1 osv.?

Men, datan jag skall skicka innehåller namn samt värden. I excelfilen som allt skall kopieras till vill jag ha kolumner med namn och sedan skall värdena klistras in i den kolumnen.
Alltså borde man ha kod som kollar upp namnet i ena cellen man skall kopiera mot namnen i kolumnbörjan (A1, B1, C1 osv) och om den matchar så skall datan läggas i dom första tomma raderna i den kolumnen. Om inte så skall den lägga namnet i första kolumnen som är ledig och lägga datan i raderna under.

Någon som är bra på att koda som vill ge mig en liten början?

Visa signatur

i7 920 @ 4.4 Ghz - HT On | HD5870 | Vertex SSD | Thermochill 120.4 - Heatkiller 3.0 - EK5870 | Silverstone TJ07
TJ07 WeeMaan Edition :D

Permalänk

Jag har inte tid att koda åt dig men kan ge några råd. Först gillar jag inte det där med att markera saker, då det slöar ner systemet. Men det är ofta enklare att koda så och då kan man använda sig av följande kod för att både göra systemet snabbare och mindre irriterande för användare som måste se excel markera saker.
Innan du börjar greja:
Worksheets.Application.ScreenUpdating = False
Efter när du är klart med allt.
Worksheets.Application.ScreenUpdating = true

Sedan för att stega bland kolumnerna så an du använda dig av följande kod i någon loop.
Worksheets("Löneräkning").Cells(stega & ",1")

När du öppnar en excelfil kan det vara bra att spara en referens.
dim wb As Workbook
Set wb = Workbooks.Open(FileToOpen, True, True)

Se till så att variabler måste deklareras för att undvika fel, skriv denna kodsnutt överst.
Option Explicit

Sist lycka till, problemet med kodning brukar vara att det uppstår oväntade problem/regler och saker som man måste ta hänsyn till.

*edit*

Glömde en sak.

Koden:
Workbooks.Open ("C:\excel\salarydata.xlsm")
ActiveSheet.Paste

Så antar du att excelfilen stängdes ner när rätt blad var aktiverat, detta kan leda till konstiga problem. Aktivera rätt blad före.

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
Skrivet av bud_bundy:

Jag har inte tid att koda åt dig men kan ge några råd. Först gillar jag inte det där med att markera saker, då det slöar ner systemet. Men det är ofta enklare att koda så och då kan man använda sig av följande kod för att både göra systemet snabbare och mindre irriterande för användare som måste se excel markera saker.
Innan du börjar greja:
Worksheets.Application.ScreenUpdating = False
Efter när du är klart med allt.
Worksheets.Application.ScreenUpdating = true

Sedan för att stega bland kolumnerna så an du använda dig av följande kod i någon loop.
Worksheets("Löneräkning").Cells(stega & ",1")

När du öppnar en excelfil kan det vara bra att spara en referens.
dim wb As Workbook
Set wb = Workbooks.Open(FileToOpen, True, True)

Se till så att variabler måste deklareras för att undvika fel, skriv denna kodsnutt överst.
Option Explicit

Sist lycka till, problemet med kodning brukar vara att det uppstår oväntade problem/regler och saker som man måste ta hänsyn till.

*edit*

Glömde en sak.

Koden:
Workbooks.Open ("C:\excel\salarydata.xlsm")
ActiveSheet.Paste

Så antar du att excelfilen stängdes ner när rätt blad var aktiverat, detta kan leda till konstiga problem. Aktivera rätt blad före.

Tack för svar!
Har nu fullt fungerande löneräknings kalkylblad i excel, den tar uppgifter från ett register över anställda (excel sheet) och räknar ut det som behövs och skickar sedan över uppgifterna till ett annat kalkylblad där dom sparas.
Håller nu även på lagar ett snyggare gränssnitt i Visual Basic som skickar data från Textboxar till excelfilen och skriver ut, sparar osv per automatik så inte användaren behöver göra mera än nödvändigt.
Inget fancy, men gör det den ska på ett enkelt sätt. (Koden är antagligen en jävla röra dock. )

Återkommer säkert med fler frågor framåt kvällen.

Edit: Här är koden från macrot som sparar till ett annat kalkylblad.

Worksheets.Application.ScreenUpdating = False Sheets("Årsanmälan").Select Range("C5:G5").Copy Workbooks.Open ("C:\excel\salarydata.xlsm") Range("A1000").Select ActiveCell.End(xlUp).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ActiveWorkbook.Save ActiveWindow.Close Sheets("Löneräkning").Select Worksheets.Application.ScreenUpdating = True

Koden för inmatningen i programmet lagat i Visual Basic.
Kort sagt fyller man bara i dom textboxar som inte excel kan räkna ut själv för att det ska bli mera överskådligt.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim XLapp As Excel.Application Dim wbkMVR As Excel.Workbook Dim wksLineA1 As Excel.Worksheet XLapp = CreateObject("Excel.Application") XLapp.Visible = True XLapp.Workbooks.Open("C:\salary.xlsm") wbkMVR = XLapp.ActiveWorkbook wksLineA1 = wbkMVR.Sheets(2) wksLineA1.Name = "Löneräkning" wksLineA1.Cells(4, 2).Value = arbetstagare.Text wksLineA1.Cells(5, 2).Value = loneperiod.Text wksLineA1.Cells(8, 2).Value = timmar1.Text wksLineA1.Cells(8, 4).Value = timmar2.Text wksLineA1.Cells(9, 2).Value = timmar501.Text wksLineA1.Cells(10, 2).Value = timmar1001.Text wksLineA1.Cells(17, 6).Value = forskott.Text wksLineA1.Cells(18, 6).Value = hyra.Text XLapp.DisplayAlerts = False wksLineA1.PageSetup.PrintArea = "$A$1:$F$22" wksLineA1.PrintOutEx() XLapp.Run("Macro2") wbkMVR.Close(SaveChanges:=False) XLapp.Quit() XLapp = Nothing wbkMVR = Nothing wksLineA1 = Nothing MsgBox("Utskrivet och sparat till databas!")

Kom gärna med synpunkter.

Visa signatur

i7 920 @ 4.4 Ghz - HT On | HD5870 | Vertex SSD | Thermochill 120.4 - Heatkiller 3.0 - EK5870 | Silverstone TJ07
TJ07 WeeMaan Edition :D

Permalänk

Svårt att ge kommentar, men det jag reagerade på var att.

Range("C5:G5").Copy Workbooks.Open ("C:\excel\salarydata.xlsm") Range("A1000").Select ActiveCell.End(xlUp).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False

Om jag inte missminner mig, så kommer denna kod att kopiera data till det excelblad som var aktivt när salarydata.xlsm sparades förra gången. Detta går enkelt att testa sig fram om så är fallet.
Även om du bara har ett blad i excelfilen, så kan någon ambitiös person skapa en extra excelblad för något. Fast adresserar du ett visst excelblad, så har du problem med folk som kan få för sig att byta namn på ditt blad. (placering, ja samma dilemma där). Jag själv själv kör dock med excelbladens namn.

Worksheets.Application.ScreenUpdating = False skulle jag ha haft direkt efter att rutinen för knappen körs. Likaså XLapp.Visible = True skulle jag ha sätt sist.

Det var det som jag såg.

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
Skrivet av bud_bundy:

Svårt att ge kommentar, men det jag reagerade på var att.

Range("C5:G5").Copy Workbooks.Open ("C:\excel\salarydata.xlsm") Range("A1000").Select ActiveCell.End(xlUp).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False

Om jag inte missminner mig, så kommer denna kod att kopiera data till det excelblad som var aktivt när salarydata.xlsm sparades förra gången. Detta går enkelt att testa sig fram om så är fallet.
Även om du bara har ett blad i excelfilen, så kan någon ambitiös person skapa en extra excelblad för något. Fast adresserar du ett visst excelblad, så har du problem med folk som kan få för sig att byta namn på ditt blad. (placering, ja samma dilemma där). Jag själv själv kör dock med excelbladens namn.

Worksheets.Application.ScreenUpdating = False skulle jag ha haft direkt efter att rutinen för knappen körs. Likaså XLapp.Visible = True skulle jag ha sätt sist.

Det var det som jag såg.

Det kommer nog inte bli ett problem eftersom ingen ska in och rota bland excelfilerna förutom eventuellt jag själv, när detta är klart skall allt som användaren behöver gå att göra via programmet jag håller på med i Visual Basic. Och mycket riktigt har den bara 1 sheet.
Screenupdating samt Visible skall jag titta närmare på, lite störande när man trycker på knappen i programmet och det börjar hända massa saker på skärmen.

Du som verkar ha lite koll kanske vet hur jag kan lösa detta smidigast.
Jag har namn i kolumn A i databas bladet, samt data i kolumn B-F.
Jag har en cell där man kan skriva i namn och sen via SumIF så får den summorna av datan i dom olika kolumnerna.
Men jag skulle även vilja få den att visa alla rader i kolumn B-F där namnet överenstämmer med det man skrivit.
Vilken (vilka) funktioner kan man använda sig av då?

Visa signatur

i7 920 @ 4.4 Ghz - HT On | HD5870 | Vertex SSD | Thermochill 120.4 - Heatkiller 3.0 - EK5870 | Silverstone TJ07
TJ07 WeeMaan Edition :D

Permalänk
Skrivet av WeeMaan:

Du som verkar ha lite koll kanske vet hur jag kan lösa detta smidigast.
Jag har namn i kolumn A i databas bladet, samt data i kolumn B-F.
Jag har en cell där man kan skriva i namn och sen via SumIF så får den summorna av datan i dom olika kolumnerna.
Men jag skulle även vilja få den att visa alla rader i kolumn B-F där namnet överenstämmer med det man skrivit.
Vilken (vilka) funktioner kan man använda sig av då?

Om jag förstår vad du menar, så en lopp som stegar neråt i Kolumnen A och utför beräkningar ifall namnet på kolumnen är rätt? Beroende på var du skriver resultatet, kan det hända att du behöver rensa resultatet när det ej ska visas.

Alltså något typ liknande såhär.
For i = 2 To antalExcelCeller
If (StrComp(Worksheets("Excelbladnamn").Range("A" & i ).Value, "strängen_du _jämnför_med", vbTextCompare) = 0) Then

antalExcelCeller går att räkna ut på flera sätt, som du gjorde ovanför. Eller kan du köra tills du kommer till en tom cell.
Om jag inte missminner mig, så finns det inga break till forloppar och man får använda gotos istället, om du nu skulle behöva använda break. (break i for_loppar är också fulkod för den delen)

*edit* Glömde StrComp, så att man jämför stränginnehållet, sedan är trim bra att använda lite här och där. Trim tar bort inledande och avslutande space. Alltså "katt " är inte samma sak som "katt".

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
Skrivet av bud_bundy:

Om jag förstår vad du menar, så en lopp som stegar neråt i Kolumnen A och utför beräkningar ifall namnet på kolumnen är rätt? Beroende på var du skriver resultatet, kan det hända att du behöver rensa resultatet när det ej ska visas.

Alltså något typ liknande såhär.
For i = 2 To antalExcelCeller
If (StrComp(Worksheets("Excelbladnamn").Range("A" & i ).Value, "strängen_du _jämnför_med", vbTextCompare) = 0) Then

antalExcelCeller går att räkna ut på flera sätt, som du gjorde ovanför. Eller kan du köra tills du kommer till en tom cell.
Om jag inte missminner mig, så finns det inga break till forloppar och man får använda gotos istället, om du nu skulle behöva använda break. (break i for_loppar är också fulkod för den delen)

*edit* Glömde StrComp, så att man jämför stränginnehållet, sedan är trim bra att använda lite här och där. Trim tar bort inledande och avslutande space. Alltså "katt " är inte samma sak som "katt".

Kanske var lite luddig beskrivning, men jag tror du gör det lite mera komplicerat än vad det behöver vara.
Bifogar en bild för att det ska bli lättare:

Det jag vill nu är alltså, när jag skriver namnet i den blåa rutan så räknar den ihop summorna.
Men jag vill även att dom ska visas i rader från t.ex G10-J10 och neråt.

Visa signatur

i7 920 @ 4.4 Ghz - HT On | HD5870 | Vertex SSD | Thermochill 120.4 - Heatkiller 3.0 - EK5870 | Silverstone TJ07
TJ07 WeeMaan Edition :D

Permalänk
Skrivet av WeeMaan:

Kanske var lite luddig beskrivning, men jag tror du gör det lite mera komplicerat än vad det behöver vara.
Bifogar en bild för att det ska bli lättare:

http://laddauppbilder.se/?di=913292087125

Det jag vill nu är alltså, när jag skriver namnet i den blåa rutan så räknar den ihop summorna.
Men jag vill även att dom ska visas i rader från t.ex G10-J10 och neråt.

Bilden fungerar inte här, men på jobbet.

Jag förstod heller inte riktigt vad du skulle göra, men som jag förstod det så skulle du få koda lite. Jag är dock ingen excelexpert, då jag mest arbetar med de andra programvarorna i office.

Nå som jag tolkade ditt problem så skulle MS Access vara en enklare lösning för problemet, om du vill ha utdrag etc. Dock är det en liten hög inlärningströske i MS Access.

Så detta inlägg kan du se som ett inlägg att jag inte riktigt vet vad du ska göra, kanske någon annan vet?

Som jag tolkade det skulle man lösa problemet precis som man löste det om det var ett vanligt språk. Alltså stega igenom och beräkna.

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".