Makro i Excel - For dummies ?

Software d.  21. april. 2016, skrevet af Fonneren-
Vist: 1707 gange.

Fonneren-
 
Elitebruger
Tilføjet:
21-04-2016 09:16:00
Svar/Indlæg:
2235/138
Hej

Sidder og er blevet HELT blank på at få en makro til at virke i Excel, og efter at have fejlet med de mest simple guides føler jeg mig nu kun endnu dummere :) ....

Jeg har et Word dokument hvor der skal være et felt, der automatisk ændre datoen når at dokumentet bliver gemt (Opdateret)

Så vidt jeg kan forstå skal jeg først tillade makroer, herinde:




Og så skal jeg ind i Visual Basic, der ser sådan ud ved mig:




Har fundet frem til dette her, omkring hvordan koden skal laves:

http://www.excelforum.com/exce...

"Sub getChangeInfo()
Dim lastAuth, lastSave
lastSave = ActiveWorkbook.BuiltinDocumentProperties(12)
ActiveSheet.Range("A1") = "Last Saved: " & lastSave
End Sub"

Men hvordan pokker får jeg det oprettet, gemt og aktiveret i mit dokument? - Ved at irrerete mig over at noget så simpelt kan være så svært for mig :)
Die_Happy
 
Elitebruger
Tilføjet:
21-04-2016 11:30:39
Svar/Indlæg:
3385/80
Nu nævner du ikke hvilken relation det skal bruges. Men måske du bare kan bruge funktionen TODAY(). På dansk hedder den funktionen IDAG().

Hver gang arket åbnes så opdateres datoen i det felt hvor du har sat funktionen ind.


Svaret blev redigeret 1 gang, sidst af Die_Happy d. 21-04-2016 11:32:13.


Fonneren-
 
Elitebruger
Tilføjet:
21-04-2016 11:43:30
Svar/Indlæg:
2235/138
Det er et dokument som flere (3-4 stk) har adgang til, inden for noget grov planlægning af produktion.

Folk er bare ikke gode til selv at opdatere hvornår den sidst er gems (Opdateret), og derfor vil jeg gerne have det automatisk.

Så når dokumentet åbnes skal der ikke ske, men gemmes det derimod (Ændring lavet), skal vi kunne se den dato (Optimalt også hvilken bruger)


Die_Happy
 
Elitebruger
Tilføjet:
21-04-2016 14:22:46
Svar/Indlæg:
3385/80
Jeg ville gribe det lidt anderledes an og bare opdatere dato-feltet så snart der blev lavet ændringer i arket.

Har lige bikset koden sammen til det:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim DectectionRange As Range

Set DectectionRange = Range("A1:Z42")

Cells(1, 1) = Date

End Sub



Ændringer inden for området A1 til Z42 vil resultere i at A1 bliver opdateret med aktuel dato.


Svaret blev redigeret 1 gang, sidst af Die_Happy d. 21-04-2016 14:23:29.


Fonneren-
 
Elitebruger
Tilføjet:
21-04-2016 14:38:11
Svar/Indlæg:
2235/138
Se det kunne også være fornemt, kender for lidt til de muligheder der er kan jeg høre :) ....

Åbner jeg bare Visual Basic og så ?


Die_Happy
 
Elitebruger
Tilføjet:
21-04-2016 15:22:40
Svar/Indlæg:
3385/80
På dit andet screenshot har du VBA editoren åben. Der skal du bare dobbeltklikke på "Ark1" og indsætte koden. Du kan tilrette range og hvor den skal skrive datoen henne som du nu ønsker.


gammelgaard_mink
 
Elitebruger
Tilføjet:
21-04-2016 15:38:57
Svar/Indlæg:
979/49
Hvis løsningen bliver bekræftet, kan vi måske få en mere sigende overskrift på? Så er det letter at finde næste gang der er brug for det 🙂


@ngler
 
Redaktør
Tilføjet:
23-04-2016 00:22:31
Svar/Indlæg:
4033/364
jeg er ikke helt sikker..

vil du have et excelark der viser hvornår nogen har ændret i wordfil?


Die_Happy
 
Elitebruger
Tilføjet:
23-04-2016 10:22:39
Svar/Indlæg:
3385/80
Løsningen jeg kom med virker - jeg testede det inden jeg skrev det herinde. Det gør essentielt det han søger - en dato i en given celle opdateres hvis der er lavet ændringer.


Fonneren-
 
Elitebruger
Tilføjet:
23-04-2016 10:34:38
Svar/Indlæg:
2235/138
Der er intet Word med indover, en fejl det kom med :) ....

Skal forbi arbejdet senere idag, og så regner jeg med at teste det på vores dokument.


@ngler
 
Redaktør
Tilføjet:
23-04-2016 18:26:46
Svar/Indlæg:
4033/364
#8

Din kode vil virke (næsten da), men din Range A1:Z42 har ingen betydning, da den ændres underordnet hvor i arket du er, og af mystiske årsager har du en range der hedder Target, som ikke bruges..?

et muligt alternativ

Private Sub Worksheet_Change(ByVal Target As Range)
' taget fra http://www.ozgrid.com/forum/sh... #4
If Intersect(Target, Range("D1:Z42")) Is Nothing Then Exit Sub

ActiveSheet.Range("A1").Value = Now()
End Sub


det er en "skidt" kode , medmindre man har et specifikt behov.. fordi
Det er kun en bestemt range man kigger på i et specifikt ark.
Worksheet_change er farlig , da Excel skal køre den igennem hele tiden og det giver dårlig performance med mange formler..

prøv evt. at lave en

Public taeller as integer før subben

og så sætte
Debug.Print taeller
taeller = taeller + 1 før din end sub..

den kører ca. 180 gange igennem hvis du ændrer 2 celler..(i immediate window, CTRL+G)

Jeg ville nok (da det er krav man skal se hvornår det sidst er gemt, selvom det står i excel menu>forbered>egenskaber > avanceret)..


Dobbelt klik på "denne projektmappe" (dit andet billede i VBA editoren)

Sæt denne kode ind
(i toppen af vinduet kan du til venstre se workbook og til højre beforesave... - nok på dansk, da min er engelsk) - dvs. det er noget den laver når den gemmer..

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'http://hwt.dk/Forum/342019/Mak...
Dim lastAuth, lastSave
lastSave = ActiveWorkbook.BuiltinDocumentProperties(12)
'Du kan ændre sheets(1) til sheet("navn") - så den altid gemmer det i det samme ark
Sheets(1).Range("A1") = "Sidst gemt: " & lastSave & " af " & Environ("Username")

End Sub

Den gemmer så hvem det er der sidst har gemt..

ActiveWorkbook.BuiltinDocumentProperties(12) er egentlig bare hvem der sidst har gemt.. man kan også bruge NOW() , da den er lavet sådan at når arket gemmes køres koden.


Hvis du egentlig bare vil lave en makro.. så kan du vælge indsæt > modul, og så sætte din makro ind der.. den kører dog ikke, det skal gøres fx. med F8 (kører trin for trin, eller F5 - i vba editoren)..


Svaret blev redigeret 1 gang, sidst af @ngler d. 23-04-2016 18:29:13.


Die_Happy
 
Elitebruger
Tilføjet:
23-04-2016 20:46:41
Svar/Indlæg:
3385/80
Det var et levn fra tidligere kode. Her kigger den specielt på det valgte range:


Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Target.Worksheet.Range("A1:Z42")) Is Nothing Then
Cells(1, 1) = Date
End If

End Sub



Der skal en hel del formler til før det bliver et problem. Og har man så mange formler, så bør man alligevel slå automatisk beregning fra.


Fonneren-
 
Elitebruger
Tilføjet:
24-04-2016 00:20:25
Svar/Indlæg:
2235/138
Der er bestemt ikke mange formler i arket, og vi sidder alle på nyere Lenovo i7 maskiner, så frygter bestemt ikke at den skal kigge tingene igennem et par gange :) ....

Hvis vi kan se hvornår der sidst er lavet ændringer, og optimalt brugeren er det helt super:

"24-04-2015 - HKR"


@ngler
 
Redaktør
Tilføjet:
24-04-2016 13:20:05
Svar/Indlæg:
4033/364
well har lige tjekket intersect gør en kæmpe forskel i hvor mange gange koden køres...

#12
username("environ") skriver brugernavnet på den der er logget ind der ændrer koden.. det kan være en fordel at tilføje mappen med makroen til a

en lidt mere universel kode, som skal sættes i denne projekt_mappe i VBA editoren.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Taget fra http://www.ozgrid.com/forum/sh... #4
'Sidste celle fundet her: http://www.rondebruin.nl/win/s...
'lavet af @ngler til http://hwt.dk/Forum/342019/Mak...
Dim LastColumn, lastrow As Long
Dim slut As String


With ActiveSheet
LastColumn = .Range("A1").SpecialCells(xlCellTypeLastCell).Column
lastrow = .Range("A1").SpecialCells(xlCellTypeLastCell).Row
End With
slut = Cells(lastrow, LastColumn).Address 'sidste brugte celle i aktive ark


'Slut kan ændres, så det kun er et bestemt range
If Intersect(Target, Sh.Range("a1:" & slut)) Is Nothing Then Exit Sub

'sheets1 er første fane, kan ændres til sheets("navn")
Sheets(1).Range("a1").Value = "Sidst ændret: " & Now() & " af: " & Environ("username")


End Sub


Svaret blev redigeret 2 gange, sidst af @ngler d. 24-04-2016 13:21:22.


Die_Happy
 
Elitebruger
Tilføjet:
24-04-2016 17:31:46
Svar/Indlæg:
3385/80
#12 I så fald ville jeg udvide til dette:


Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Target.Worksheet.Range("A1:Z42")) Is Nothing Then
Cells(1, 1) = Date & " - " & Environ("Username")
End If

End Sub


Igen super simpelt, og gør hvad du ønsker :)

EDIT: Glemte at nævne at den trækker brugernavnet fra Excel.


Svaret blev redigeret 1 gang, sidst af Die_Happy d. 24-04-2016 17:32:44.


Fonneren-
 
Elitebruger
Tilføjet:
25-04-2016 08:28:40
Svar/Indlæg:
2235/138
14: Lige prøvet denne kode, men får denne her fejl:




Kan se den sætter dato, navn ind i feltet godt nok, men denne fejl popper også op - Hvad kan det skyldes ?


@ngler
 
Redaktør
Tilføjet:
25-04-2016 08:50:24
Svar/Indlæg:
4033/364
du har ikke låst nogle celler eller lign?



ellers læg arket op, så er det måske nemmere.


Fonneren-
 
Elitebruger
Tilføjet:
25-04-2016 08:56:44
Svar/Indlæg:
2235/138
Er der et sted man kan søge efter låste celler ?

- Det er et ark der er lavet inden min tid, så der kan sikkert nemt ligge ting gemt bagved.

Eftersom at der er en del virksomheds følsomme data er der ikke et ark jeg lige kan smide op, ellers havde jeg gjort det for at gøre det nemmere for jer der hjælper.


@ngler
 
Redaktør
Tilføjet:
25-04-2016 10:17:49
Svar/Indlæg:
4033/364
Du kan prøve at ændre den del af koden som den kigger i til det område i ændrer . Det er den del som hedder "A1:Z42". Hvis det er et adskilt område A1 til b10 og d1 til d10, hedder det "A1:B10,D1:D10"
Du kan evt tage en kopi af arket, slette koden og se om du kan skrive i a1 til z42


@ngler
 
Redaktør
Tilføjet:
25-04-2016 10:32:28
Svar/Indlæg:
4033/364
En skidt løsning kan være at efter første linje (sub delen)

Skriv On Error resume next

Alternativt (måske bedre)

On error goto fejl

'koden fra tidligere indlæg

'erstat end sub med disse fire linjer:

Exit sub
Fejl:
Range("a1") = date & "-" & environ("username")
End sub




Fonneren-
 
Elitebruger
Tilføjet:
25-04-2016 10:59:53
Svar/Indlæg:
2235/138



Lige et billed af hvad det drejer sig omkring, lavede lige en grov tom kopi uden data ....


@ngler
 
Redaktør
Tilføjet:
25-04-2016 11:23:54
Svar/Indlæg:
4033/364
Mit bedste bud er at rækken med overskriften er skrivebeskyttet... ( men du kan prøve at slette dem)
Så rangen skal starte på A6 (den celle der står test.. Og slutte i den kolonne dit data slutter i række ??, dvs så langt ned du forventer at i bruger det. (mit eksempel er dynamisk, hvor den anden kode har en fast range)