Avatar billede Dorte Mester
23. oktober 2019 - 13:02 Der er 21 kommentarer

Makro der flytter data tilbage til vilkårlige ark

Hej
Har et regneark med 10 ark. Ark1 er et samleark, mens de 9 øvrige er kalkulationsark til forskellige produkter.

Jeg har lavet et makro, der flytter data fra de 9 kalkulationsark til samleark.
Der flyttes kun data, hvis man har udfyldt kalkulationsarket. Det vil sige, at hvis man f.eks. har udfyldt ark. 3, 5 og 10, kommer data til at stå på linie 1,2 og 3 på samleark.

På samleark kan man på linie 1,2 og 3, i en ny kolonne skrive et beløb, som jeg gerne vil have flyttet tilbage på de rigtige kalkulationsark (3,5 og 10). Brugeren kan ændre navne på kalkulationsarkene, så arknavnene på ark 2-10 hedder ikke altid det samme.

Hvordan laver jeg den makro, der flytter fra samleark til de rigtige kalkulationsark ?

Håber nogen kan hjælpe med lidt input til det.

Hilsen Dorte
Avatar billede kim1a Ekspert
23. oktober 2019 - 13:56 #1
Kunne en ide være at berige din makro med en form for reference til hvor det er kopieret fra? Altså når linje 2 i ark 4 kopieres over til ark 1 så bagefter alt din data har du en kolonne hvor data kommer fra?

På den måde har du en nem løsning for at flytte beløb retur til samme sted efter ændring?
Avatar billede Dorte Mester
23. oktober 2019 - 15:12 #2
Tænker du, at jeg skal lave en kopiering af arknavnet i en kolonne på samleark ?
Eller har jeg misforstået ?
Avatar billede Dorte Mester
23. oktober 2019 - 15:23 #3
Hvis nu jeg så har et samleark med 3 kolonner. Kolonne A = tekst kopieret fra kalkulationsark. Kolonne B = arknavn kopieret fra kalkulationsark. Kolonne C = Manuel indtastet beløb på samlearket.


Hvad er koden så på den makro, der skal kopiere de indtastede beløb over på arket med det arknavn som står i kolonne B ?
Avatar billede Jan K Ekspert
23. oktober 2019 - 15:25 #4
#1 er en ok ide, men ikke nødvendigvis helt god. Altså at når du kopierer data, så også kopier arkinformationen med, så når du skal kopiere tilbage, ved du hvor det skal hen. Hvis du bare nogle tal stående i forskellige rækker, er det ikke nok til at remme det rigtige ark.

Men hvis arket skifter navn mellem kopiering fra og kopiering tilbage er du lige vidt. Hvis du i stedet bruger arkets nummer, vil det kunne virke, med mindre rækkefølgen af arkene også kan ændre sig.

Jeg ville nok bruge en celle i hvert ark til at indeholde en entydig reference til det konkrete ark, som ikke kan ændres, og så kopiere denne med frem og tilbage.
Avatar billede kim1a Ekspert
23. oktober 2019 - 19:08 #5
#4 jeg synes du tolker ret meget på mit korte forslag :-)
Hvis arket har det med at skifte navn skal du netop bruge den underliggende fane-navn i vba vil det være:
sheets(1) fremfor sheets("navn"), det var i min tanke, men nok ikke udtrygt helt skarpt.

Din ide med at have en entydlig reference til hver enkelt celle kan sagtens give mening, altså at når du tager tal x fra fanen "Aalborg" så kan den reference være "Aalborgtallet1"

Jeg vil dog stadig foreslå:

#2 Ja netop, jeg ville f.eks. sætte en reference i en kolonne der er cellens adresse (inkl. arknummer), så f.eks. B3-Sheet1 (nok nemmest i to kolonner) på den måde kan du utrolig nemt kopiere tal retur ved at have:

Så din vba skal se ud noget i til med:
for r = 1 to 10
DestinationsFane = sheets(cells(8,r))
DestinationsCelle = cells(7,r)
range(1,r).copy
sheets(destinationsfane).range(destinationscelle).paste
next

Bemærk der nok er en del fejl, det er bare lige helt uden tanke for ordentlig syntax.
Avatar billede Dorte Mester
24. oktober 2019 - 08:25 #6
Jeg takker mange gange for jeres input.
Jeg må lige prøve at lege lidt med det.
Avatar billede Jan K Ekspert
24. oktober 2019 - 09:32 #7
#5 Jeg forsøgte ikke at tolke, men konstaterede bare, at hvis arket skifter navn, kan navnet ikke bruges, og hvis det skifter placering kan den underliggende struktur heller ikke bruges. :-)
Avatar billede kim1a Ekspert
24. oktober 2019 - 10:35 #8
#7 måske jeg misforstår dig, men sheet(3) vil altid henvise til et bestemt ark uanset om hvad det har af navn og placering?
Avatar billede Dorte Mester
24. oktober 2019 - 11:09 #9
Da jeg stort set kun kan optage makroer, har jeg lidt svært ved at rette dem til.
Jeg har lavet nedenstående - men den vil ikke vælge det ark jeg skal indsætte det kopierede i.
Jeg har en celle på samleark (arknr. 1), der angiver arknummeret på det ark jeg skal hen på, men hvordan laver jeg koden (se linie med ???????)

For i = 2 To Sheets.Count
    Sheets(1).Select                              '=Samleark har nr. 1
    ActiveCell.Offset(1, 0).Select            ' flytter cursor 1 felt ned
    Application.CutCopyMode = False
    Selection.Copy
    ActiveCell.Offset(0, 4).Select            ' Denne celle indeholder arknr.

    Sheets(ActiveCell).Select      ??????????????
   
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Next i
Avatar billede kim1a Ekspert
24. oktober 2019 - 12:37 #10
For i = 2 To Sheets.Count
    Sheets(1).Select                              '=Samleark har nr. 1
    ActiveCell.Offset(1, 0).Select            ' flytter cursor 1 felt ned
    Application.CutCopyMode = False
    Selection.Copy
    ActiveCell.Offset(0, 4).Select            ' Denne celle indeholder arknr.

    Sheets(ActiveCell.value).Select      ' du skal have værdien i cellen går jeg ud fra
 
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Sheets(1).select      'du skal bruge en "tilbage" tror jeg for at Next i giver mening.
Next i
Avatar billede Dorte Mester
24. oktober 2019 - 13:39 #11
Hej igen

Så kører løkken som den skal :-). Men når den så kommer til en tom celle hvor arknr. står, går det galt. Hvordan får jeg løkken til at stoppe når celle med arknr. er tom.

Jeg har jo f.eks i alt 20 linier der kan kopieres, men måske er det kun 3 linier der er udfyldt. Der er jo før den her løkke kører, blevet kopieret fra kalkulationsark til samleark. Og det varierer jo, hvor mange kalkulationsark der er blevet udfyldt og dermed hvor mange linier der er på samleark.

For i = 2 To 20
    Sheets(1).Select                              '=Samleark har nr. 1
    ActiveCell.Offset(1, 0).Select            ' flytter cursor 1 felt ned
    Application.CutCopyMode = False
    Selection.Copy
    ActiveCell.Offset(0, 4).Select            ' Denne celle indeholder arknr.
    Sheets(ActiveCell.Value).Select       
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets(1).Select
    ActiveCell.Offset(0, -4).Select
Next i
Avatar billede kim1a Ekspert
24. oktober 2019 - 14:09 #12
Kan du ikke indføre en:
if activecell.value = "" then end sub
else

Du kan sætte den ind efter din:
ActiveCell.Offset(1, 0).Select 

Eller misforstår jeg dig at der kan være tal i alle rækker, men ikke noget i henvisningen? Det kan du lige overveje.

Det slår mig iøvrigt at når du bruger offset så behøver du ikke for i =2 to 20 overhovedet. Min tanke var at lade "i" være definerende for rækkenummer og i stedet skrive cellerne som adresser hvor i indgår.
Avatar billede Dorte Mester
24. oktober 2019 - 15:05 #13
Det er helt korrekt at den skal stoppe hvis cellen er tom, men det er efter activecell.offset (0,4).select  (det er hvis denne celle er tom).

Men den skal ikke -end sub-, for der kommer mere kode efter denne løkke.
Den skal bare hoppe ud af løkken og forsætte makroen.

Kan man det ?
Avatar billede Jan K Ekspert
24. oktober 2019 - 15:38 #14
#8
Måske taler vi forbi hinanden. Hvis jeg har tre ark, som er navngivet A, B og C og de ligger i den rækkefølge, er Sheets(1) ark A, men flytter jeg så ark C hen forrest er det nu Ark C, der er er Sheets(1).
Avatar billede kim1a Ekspert
24. oktober 2019 - 20:16 #15
#14 jeg er uenig, men det kan være min forståelse af vba. Hvis du går ind i editoren vil du se at arknummeret ikke flytter sig uanset hvor arket står i rækkefølgen med de andre, men det kan så være at Sheet(1) henviser til den rækkefølge de står i, fremfor hvad de reelt hedder. Der må i så fald være en måde at fange det arknummer som fanen får når de bliver lavet (for den forsvinder ikke, og et nyt ark vil altid få næste fortløbende tal.

#13 Du kan bruge denne så:
If .. Then Goto jmp
jmp:
Sakset herfra:
https://www.mrexcel.com/forum/excel-questions/536183-excel-vba-goto-command.html
Avatar billede Dorte Mester
25. oktober 2019 - 09:28 #16
Tusind tak for hjælpen. Jeg klarer mig herfra.
Avatar billede store-morten Ekspert
25. oktober 2019 - 10:19 #17
Sheets(1) er det første ark fra venstre.

An index number is a sequential number assigned to a sheet, based on the position of its sheet tab (counting from the left)
Avatar billede kim1a Ekspert
25. oktober 2019 - 17:12 #18
Så må der være en måde at henvise til det underliggende nummer arket får i VBA editoren.
Avatar billede Jan K Ekspert
25. oktober 2019 - 18:01 #19
#18 Det er der. Hvis et ark hedder Sheet1, i editoren kan du bruge det navn, i stedet for fanenavn eller placering, fx Sheet1.Range eller hvad du nu vil gøre.

Hvis Sheet1 hedder 'Jan' kan du fx omdøbe det til noget andet med

Sheet1.Name = "Kim" og så gør det ikke noget, hvis nogen i mellemtiden har omdøbt det til Peter.
Avatar billede kim1a Ekspert
25. oktober 2019 - 18:19 #20
Så sheet1 i stedet for sheet(1)?
Avatar billede Jan K Ekspert
25. oktober 2019 - 19:16 #21
Ja, eller Ark1, hvis du har en dansk version.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester