30. november 2007 - 18:54Der er
57 kommentarer og 1 løsning
flytning af data
Jeg ønsker forslag til hvordan man i en større projektmappe kan flytte data fra et ark til et andet. I ark 2 kan man i søjle a skrive "sagsnummer" i søjle b følger så "dato" og i c "timetal". Dette fortsætter ubegrænset nedefter (vil dog typisk være mellem 10 og 20 rækker pr. ark) Dette kan jo så også ske i ark 3 - 4 .. ja op til 54. De data der kommer, skal ind i ark 1. dvs en linie med sagsnummer og timer skal noteres. Kommer der senere, i andet ark, samme sagsnummer skal timerne for det givne sagsnummer adderes. Jeg forestiller mig at det hele sker automatisk. Forslag modtages med kyshånd. På forhånd tak
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
Forudsætter du har overskrifter i alle ark i række 1 sum ark er Ark1 ellers ret i anden linie
Sub Total() Set sh1 = Sheets("Ark1")
For Each sh In ActiveWorkbook.Sheets If sh.Name <> sh1.Name Then sh.Activate For t = 2 To sh.Cells(65000, 1).End(xlUp).Row If Application.CountIf(sh1.Range("A2:A20000"), Cells(t, 1)) < 1 Then sh1.Cells(sh1.Cells(65500, 1).End(xlUp).Row + 1, 1) = Cells(t, 1) sh1.Cells(sh1.Cells(65500, 2).End(xlUp).Row + 1, 2) = Cells(t, 3) Else x = sh1.Range("A1:A20000").Find(Cells(t, 1), LookIn:=xlValues).Address sh1.Range(x).Offset(0, 1) = sh1.Range(x).Offset(0, 1) + Cells(t, 3) End If Next End If Next
nu er jeg langt fra den skarpeste til excel, men jeg formoder at det skal kopieres ind i VBA. Det har jeg gjort, jeg har i ark 2 (dansk excel, hvis det har betydning) skrevet abc def ghi 100 200 400
men det sker der egentlig ikke det store ved. Hvad er det jeg ikke forstår
ja, den skal vise det faktiske billede og ikke tælle sammen. Vi skal registrere antal timer brugt på en sag så den må ikke lægge mere sammen end det der står
i øvrigt skal jeg køre macroen kan den automatiseres så den selv mærker hvis der er en ændring?
nej det opdagede jeg også lige, du får lige den reviderede kode, skift ud med den gamle
Sub Total()
Application.ScreenUpdating = False AktuelArk = ActiveSheet.Name: AktuelCelle = ActiveCell.Address Set sh1 = Sheets("Ark1"): sh1.Activate sh1.Range(Range("A2"), ActiveCell.SpecialCells(xlLastCell)).ClearContents For Each sh In ActiveWorkbook.Sheets If sh.Name <> sh1.Name Then sh.Activate For t = 2 To sh.Cells(65000, 1).End(xlUp).Row If Application.CountIf(sh1.Range("A2:A20000"), Cells(t, 1)) < 1 Then sh1.Cells(sh1.Cells(65500, 1).End(xlUp).Row + 1, 1) = Cells(t, 1) sh1.Cells(sh1.Cells(65500, 2).End(xlUp).Row + 1, 2) = Cells(t, 3) Else x = sh1.Range("A1:A20000").Find(Cells(t, 1), LookIn:=xlValues).Address sh1.Range(x).Offset(0, 1) = sh1.Range(x).Offset(0, 1) + Cells(t, 3) End If Next End If Next Sheets(AktuelArk).Select: Range(AktuelCelle).Select Application.ScreenUpdating = True
Der er flere måder at få den til at køre automatisk vi prøver lige med ændring i kolonne C i arkene d.v.s. hver gang du indtaster en tid i C opdateres Hvis du har mange ark og mange data, bliver det nok for tungt at arbejde med (hastighed),- så prøver vi en anden
indsæt følgende kode i alle arks kodemodul - dog ikke Ark1
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("C1:C2000")) Is Nothing Then Exit Sub Call Total End Sub
Dit virker ser det ud til, det er mere end hvad mit gøt, men det er fint nok til mig så kan jeg komme videre. Tak for din venlige indsats, læg venligst et svar og se evt denne http://www.eksperten.dk/spm/808383 ;-)
ok prøv denne (forudsætter du har overskrift i Total D5,E5 og i arkene E6,F6,G6):
Sub Total()
Application.ScreenUpdating = False ' Undgå at skærm flimrer når der skiftes ark m.v AktuelArk = ActiveSheet.Name: AktuelCelle = ActiveCell.Address ' Husker aktuel ark og celle Set sh1 = Sheets("Total"): sh1.Activate 'sh1 sættes=Ark1, er lettere at skrive flere gange : sh1 aktiveres sh1.Range(Range("D6"), ActiveCell.SpecialCells(xlLastCell)).ClearContents ' Værdier i Ark1 slettes For Each sh In ActiveWorkbook.Sheets ' Ark løkke starter If sh.Name <> sh1.Name Then ' Sikrer at Ark1 ikke testes sh.Activate ' Arkene aktiveres efter tur For t = 7 To sh.Cells(65000, "G").End(xlUp).Row ' Finder nederste række med værdi i kolonne D If Application.CountIf(sh1.Range("D6:D20000"), Cells(t, "G")) < 1 Then 'Test om aktuel sagsnr. findes i Total sh1.Cells(sh1.Cells(65500, "D").End(xlUp).Row + 1, "D") = Cells(t, "G") 'Skriver sagsnr i Total i næste tomme celle sh1.Cells(sh1.Cells(65500, "E").End(xlUp).Row + 1, "E") = Cells(t, "E") 'Skriver timer i Total i næste tomme celle Else ' Aktuel sagsnummer fantes allerede i Ark1 x = sh1.Range("D6:D20000").Find(Cells(t, "G"), LookIn:=xlValues).Address 'Finder cellen i Total hvor sagsnr er sh1.Range(x).Offset(0, 1) = sh1.Range(x).Offset(0, 1) + Cells(t, "E") ' Timer adderes til aktuel sagsnr End If Next End If Next Sheets(AktuelArk).Select: Range(AktuelCelle).Select 'Oprindelig Ark og celle gøres aktiv igen Application.ScreenUpdating = True ' Skærmopdatering sættes til igen
End Sub
---------------- og i alle ark skal den se således ud :
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("G7:G2000")) Is Nothing Then Exit Sub Call Total End Sub
Det så rigtig fint ud, der er dog to uforudsete ting
jeg har værdien 0 (nul) i tomme e felter i uge arkene, kan vi nøjes med kun at flytte data hvis der er et sagsnummer. Det løser også mit problem nummer to, nemlig sammenlægningen af timerne nederst i e, de flyttes nemlig også. Men som sagt ellers så det rigtig godt ud, takker. Jeg kan lave et nyt spm. med p hvis du ønsker
Der opdateres kun hvis du indtaster noget i området G7:G2000 Vi kan godt checke om det er et sagsnummer Hvilken type sagsnumre anvender du, og er de ens i antal tegn ?
og jeg har fået point nok, så vi klarer det fint uden :-)
Denne som skal i alle ark untagen Total checker for 5 tegn Man kan også teste for timer er indtastet Hvis du ønsker det, så lad mig høre, men får først tid efter arb.tid i morgen
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("G7:G2000")) Is Nothing Then Exit Sub If Len(Target.Value) = 5 Then Call Total End If If Len(Target.Value) <> 5 Then Beep: Beep End Sub
1. det må være nisserne :-) - den skal jeg lige tænke over
2. hvis jeg skriver det samme i kolonne E så melder koden fejl det er forståeligt nok da den ikke kan addere tekst i hvilken kolonne skriver du ryd indhold ?
prøv denne med en On Error handler, så du kan slette i ugeark søg også dine uge ark efter et 0, virker ok i mit ark
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("G7:G2000")) Is Nothing Then Exit Sub On Error Resume Next If Len(Target.Value) = 5 Then Call Total End If If Len(Target.Value) <> 5 Then Beep: Beep End Sub
ok det som er på selve arket kan kopieres, ikke koden, men tester lige om koden kan omskrives til at virke på alle ark hvis den indsættes i ThisWorkbook-moduler Hvilket område på uge1 arket skal kopieres til de andre ?
Det kommer bag på mig hvis kommentarer ikke fastholdes som i Uge1 Det gør de i mit eks-ark. kom lige med et eks på en kommentar som flytter fra ? til ?
Række/kolonne højde må kunne laves med kode kikker på det det er A1:I25 vi snakker om stadig ikke ?
Denne indsættes i ThisWorkbook (den checker alle ark) så skal der ikke være noget i ark-modulerne
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Intersect(Target, Sh.Range("G7:G2000")) Is Nothing Then Exit Sub On Error Resume Next If Len(Target.Value) = 5 Then Call Total End If If Len(Target.Value) <> 5 Then Beep: Beep End Sub
m.h.t kolonnebredde/rækkehøjde : marker det ark du har rettet ind desangående hold SHIFT tasten nede og klik på det sidste ark, så alle bliver markeret hvis du ikke kan se det sidste ark, bruger du bare pilene nede til venstre Kolonne: marker de lodrette streger som adskiller kolonnerne og træk kolonne en anelse større end den var, og så tilbage igen fortsæt med alle kolonner som har anden bredde end normal samme fremgangsmåde for rækker. så skulle alle markerede ark være med samme format som uge1
jeg er altså ikke så fedtet med p, det er vigtigere at få opgaverne løst. Man kan godt snyde ved at lade sagsnummer stå tomt eller rydde indholdet i den. Men kan man ikke i den oprindelige kode indlægge at der skal være udfyldt i alle kolonner fra a til g før der flyttes data
så skulle den checke for a til f i den aktuelle række du taster i, hvis den hver gang skal teste alle rækker i alle ark når du tilføjer et nyt sagsnummer, så skal vi rette i den anden kode, det må vente til i morgen. m.h.t når/hvis du sletter et sagsnummer - den skal jeg lige tænke over :-)
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Intersect(Target, Sh.Range("G7:G2000")) Is Nothing Then Exit Sub If Application.CountA(Sh.Range("A" & Target.Row & ":F" & Target.Row)) <> 6 Then Exit Sub On Error Resume Next If Len(Target.Value) = 5 Then Call Total End If If Len(Target.Value) <> 5 Then Beep: Beep End Sub
jeg har lige været borte et stykke tid men er nu tæt på at kunne afslutte.
Den opdaterer bare ikke når jeg ændre i eksempelvis c eller d er der et bud
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.