25. juli 2006 - 14:38Der er
11 kommentarer og 3 løsninger
Opret betinget formatéring med makro
Case :
En bruger bestiller en rapport i Excel ( fra SAP ), indeholdende en række data i tabelform, som denne skal tage stilling til validiteten af. Er der fejl, skal dette rettes, men jeg vil gerne have en markering i cellen af ( baggrundsfarve ), at brugeren har rettet i data for den pågældende celle.
For hver gang brugeren bestiller en rapport, nulstilles alle celler/rækker i regnearket, så det skal kunne oprettes med en makro eller lignende efter rapportbestilling.
Følgende kode i Arkets kodemodul ændrer baggrundsfarve til grøn hvis der ændres i en celle i området A1:AV1000
Farverne kunne evt. resettes med en knap
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A1:AV1000")) Is Nothing Then Exit Sub Else Target.Interior.ColorIndex = 4 End If End Sub
excelent > den er lidt for følsom ... efter min mening, den skal kun reagere hvis der reelt sker ændring i feltet, eksempelvis ikke hvis brugeren kun har aktiveret cellen for at se decimaler ... er der en ande metode ?
Følgende 2 makroer forudsætter du har et ark med navn Rapport samt et ark med navn Kopi.
Kopier() kopierer indholdet af Rapport-arket til Kopi-arket Marker() farver celler i Rapport-arket som er ændret
Kopi-arket kan evt. skjules
Sub kopier() Sheets("Kopi").Activate Range(Range("A1"), ActiveCell.SpecialCells(xlLastCell)).Delete Sheets("Rapport").Activate Range(Range("A1"), ActiveCell.SpecialCells(xlLastCell)).Select Selection.Interior.ColorIndex = xlNone Selection.Copy Destination:=Sheets("Kopi").Range("A1") Range("A1").Select End Sub
Sub Marker() Dim r, c, r1, c1 Sheets("Rapport").Activate Range(Range("A1"), ActiveCell.SpecialCells(xlLastCell)).Select r = Selection.Rows.Count: c = Selection.Columns.Count: Range("A1").Select For r1 = 1 To r For c1 = 1 To c If Sheets("Rapport").Cells(r1, c1) <> Sheets("Kopi").Cells(r1, c1) Then Sheets("Rapport").Cells(r1, c1).Interior.ColorIndex = 15 End If Next Next End Sub
Dim preV Private Sub Worksheet_Change(ByVal Target As Range) If preV <> Target.Value Then Target.Interior.ColorIndex = 4 End If End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) preV = ActiveCell.Value End Sub
Du skal så de automatiske makroer fra når du opdatere data, så burde subertekst`s kode virke. det gør du sådan
Application.EnableEvents = False ' Din koder når du henter nye data Application.EnableEvents = True
Hvis det skulle ske at din kode skulle gå i fejl engang, så den ikke udfører den sidste linie, så lav en makro der kan genstarte de automatiske makroer
Public Sub StartAutomatiskeMakroer() Application.EnableEvents = True End Sub
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.