Excel conditional formatting eller andra lösningar villkor highlight

Trädvy Permalänk
Medlem
Registrerad
Feb 2012

Excel conditional formatting eller andra lösningar villkor highlight

Känns som att conditional formatting är skräp? Man måste hänvisa direkt på dom celler och i det blad som ska ha villkoren, kommer det sedan nya rader så skapas nya villkor och ibland fungerar det inte.

Går det att göra på något smidigt sätt som inte involverar conditional formatting? Eller har jag helt enkelt inte riktigt använt det på rätt sätt?

1. Alla poster som har en negativ INT globalt ska visas rött , alltså flera kolumner och rader kommer att skapas/kopieras pastas in.

2. Vill higlighta current week I kol A har jag rader som heter Week , i kol B har jag veckonumret. Samma deal här som ovan nya rader

*Bladet kommer också att kopieras varje månad och sedan tömmas / ny månad.

Trädvy Permalänk
Medlem
Registrerad
Aug 2014
Skrivet av lappen81:

Känns som att conditional formatting är skräp? Man måste hänvisa direkt på dom celler och i det blad som ska ha villkoren, kommer det sedan nya rader så skapas nya villkor och ibland fungerar det inte.

Går det att göra på något smidigt sätt som inte involverar conditional formatting? Eller har jag helt enkelt inte riktigt använt det på rätt sätt?

1. Alla poster som har en negativ INT globalt ska visas rött , alltså flera kolumner och rader kommer att skapas/kopieras pastas in.

2. Vill higlighta current week I kol A har jag rader som heter Week , i kol B har jag veckonumret. Samma deal här som ovan nya rader

*Bladet kommer också att kopieras varje månad och sedan tömmas / ny månad.

1. Fixar du mycket enklare med talformattering, till exempel 0_ ;[Röd]-0\

2. Svårt att förstå vad du menar, du kanske kan posta ett exempelblad. Men om jag förstår lite rätt iaf:
conditional formatting för nya infogade celler kan du ordna i vba utan problem till exempel i worksheet.change eventet med FormatConditions objektet.

Private Sub Worksheet_Change(ByVal Target As Range)

End Sub

EDIT: du kommer nog kanske även behöva sätta talformattering för (1) i worksheet.change eventet, beroende på hur de nya cellerna infogas.

Z170-WS | Intel 6700K | Dominator 2x16GB 3000MHz | Samsung 950 Pro 2x512GB NVMe RAID0 | MSI 1080 Gaming X | Seasonic 520 Fanless | 7260 HMV-AC | Fractal Design Define R4 | Noctua NH-U12S@475RPM | Noctua P12@475RPM x5
Supermicro X10SLL-F | Supermicro 1U SC813MT-300C | XEON E3 1231v3 | Hynix 4x8GB ECC | 840 EVO | WD 6x 4TB RE
x220 | IPS | i7 | SSD | 9-cell

Trädvy Permalänk
Medlem
Registrerad
Feb 2012
Skrivet av ggwp:

1. Fixar du mycket enklare med talformattering, till exempel 0_ ;[Röd]-0\

2. Svårt att förstå vad du menar, du kanske kan posta ett exempelblad. Men om jag förstår lite rätt iaf:
conditional formatting för nya infogade celler kan du ordna i vba utan problem till exempel i worksheet.change eventet med FormatConditions objektet.

Private Sub Worksheet_Change(ByVal Target As Range)

End Sub

EDIT: du kommer nog kanske även behöva sätta talformattering för (1) i worksheet.change eventet, beroende på hur de nya cellerna infogas.

1. Det fanns visst fördefinierad talformatering för negativa nummer. Tack för tipset, fungerar mycket batter än conditional formatting.

enbart fått det att fungera med Copy Insert hittils, pastespecial fungerade inget bra. Får labba lite vid senare tillfälle, talformatteringen verkar fungera bra med denna lösning

2. Efter körning av nyvecka hamnar A15: Week B15: intCurrentWeek (nyVecka) . Dessa flyttar på sig när nya veckor (eller rader infogas) så steg 1 är ju egentligen att reda ut vilken cell I kolumn B som är vecko nummer. Borde räcka med att kolla om det är en INT på två siffror I kolumn B = vecka sen något i stil med
if "INT I någon cell i kolumn B" = DatePart("ww", Date, vbMonday, vbFirstFourDays) , highlighta

Sub NyVecka() Set tplRows = Range("3:9") tplRows.EntireRow.Copy Set dstRows = Range("10:17") With dstRows .EntireRow.Insert End With Range("10:17").EntireRow.Hidden = False intCurrentWeek = DatePart("ww", Date, vbMonday, vbFirstFourDays) strMonth = DateAdd("ww", intCurrentWeek, DateSerial(Year(Date), 1, 1)) Range("B15").Value = intCurrentWeek Range("B16").Value = strMonth Application.CutCopyMode = False End Sub

Trädvy Permalänk
Medlem
Registrerad
Aug 2014

@lappen81: Exakt. Du är ju redan inne i vba. Därför kan du egentligen kanske välja mellan att sätta ett statiskt format i NyVecka(), eller sätta ett conditional format i NyVecka() med FormatConditions objektet som jag länkade ovan. Det är ju nödvändigt om datat kommer ändra sig efter du kört NyVecka().

Ett tips för ditt script, byt till:

Sub NyVecka() Range("3:9").EntireRow.Copy With Range("10:17").EntireRow .Insert .Hidden = False End With Range("B15").Value = DatePart("ww", Date, vbMonday, vbFirstFourDays) Range("B16").Value = DateAdd("ww", intCurrentWeek, DateSerial(Year(Date), 1, 1)) Application.CutCopyMode = False End Sub

Du behöver inte hålla på med Set och With när du endast anropar rangen en enda gång. 2+ gånger på raken: använd With. 2+ gånger utspritt: använd Set. Du behöver inte heller sätta variabler när du bara använder dem 1 gång, sätt bara .Value direkt. Det blir iaf lite lättare att läsa om inget annat.

Z170-WS | Intel 6700K | Dominator 2x16GB 3000MHz | Samsung 950 Pro 2x512GB NVMe RAID0 | MSI 1080 Gaming X | Seasonic 520 Fanless | 7260 HMV-AC | Fractal Design Define R4 | Noctua NH-U12S@475RPM | Noctua P12@475RPM x5
Supermicro X10SLL-F | Supermicro 1U SC813MT-300C | XEON E3 1231v3 | Hynix 4x8GB ECC | 840 EVO | WD 6x 4TB RE
x220 | IPS | i7 | SSD | 9-cell

Trädvy Permalänk
Medlem
Registrerad
Feb 2012
Skrivet av ggwp:

@lappen81: Exakt. Du är ju redan inne i vba. Därför kan du egentligen kanske välja mellan att sätta ett statiskt format i NyVecka(), eller sätta ett conditional format i NyVecka() med FormatConditions objektet som jag länkade ovan. Det är ju nödvändigt om datat kommer ändra sig efter du kört NyVecka().

Ett tips för ditt script, byt till:

Sub NyVecka() Range("3:9").EntireRow.Copy With Range("10:17").EntireRow .Insert .Hidden = False End With Range("B15").Value = DatePart("ww", Date, vbMonday, vbFirstFourDays) Range("B16").Value = DateAdd("ww", intCurrentWeek, DateSerial(Year(Date), 1, 1)) Application.CutCopyMode = False End Sub

Du behöver inte hålla på med Set och With när du endast anropar rangen en enda gång. 2+ gånger på raken: använd With. 2+ gånger utspritt: använd Set. Du behöver inte heller sätta variabler när du bara använder dem 1 gång, sätt bara .Value direkt. Det blir iaf lite lättare att läsa om inget annat.

1. Kör på din kod, dock fungerar ju inte hidden = false så den kör jag utanför.
2a. När det gäller conditionalformatting på veckan, börjar jag istället fundera på istället för att pasta in en cell.value = veckonummer till att pasta in If formel för att kolla datumets vecka = (intweeknr (som ska med som tidigare). Om den är true kanske den kan visas som negativ om den är false som vanligt. Påsåvis borde jag kunna använda ditt tips tidigare om formattering på negative nummer globalt och highlighting.
* Eller ännu bättre en VBA som gör motsvarande sak om det är möjligt typ I cellen =If JämförVecka(35) = True Then (-35; 35) och I JämförVecka evaluera 35 mot dagens veckonummer. Kommer ju säkert tyvärr att behöva en separat cell där veckonumret redan är pastat och hänvisa till den.
2b påsåvis borde jag även kunna göra något liknande highlighta vilken dag det är (namn) förutom att negatev sträng på talformateringen inte riktigt kommer att fungera , får leta lite

* Får kolla på eventuella problem med att skapa nya blad senare länkarna (har ju dina tips I mina citat/gå tillbaka), vill undvika så mycket kod och conditions som möjligt (återanvända) för eventuella uppdateringar I framtiden, så ditt tips på minskad kod är super.

Tackar

Trädvy Permalänk
Medlem
Registrerad
Aug 2014

*

Sub NyVecka() Range("3:9").EntireRow.Copy With Range("10:17").EntireRow .Insert .Hidden = False End With intCurrentWeek = DatePart("ww", Date, vbMonday, vbFirstFourDays) Range("B15").Value = intCurrentWeek Range("B16").Value = DateAdd("ww", intCurrentWeek, DateSerial(Year(Date), 1, 1)) Application.CutCopyMode = False End Sub

När användaren skapar nya blad, kan du kontrollera bladet med Workbook.NewSheet eventet.

Z170-WS | Intel 6700K | Dominator 2x16GB 3000MHz | Samsung 950 Pro 2x512GB NVMe RAID0 | MSI 1080 Gaming X | Seasonic 520 Fanless | 7260 HMV-AC | Fractal Design Define R4 | Noctua NH-U12S@475RPM | Noctua P12@475RPM x5
Supermicro X10SLL-F | Supermicro 1U SC813MT-300C | XEON E3 1231v3 | Hynix 4x8GB ECC | 840 EVO | WD 6x 4TB RE
x220 | IPS | i7 | SSD | 9-cell