PC Review


Reply
Thread Tools Rate Thread

Cell Colour depending on Value in Range

 
 
=?Utf-8?B?VHJldm9yIFdpbGxpYW1z?=
Guest
Posts: n/a
 
      27th Jun 2007
Hi All

I need to be able to colour cells in a range that total a specified value,
plus, if possible add some notification to tell the user if the specified
value can't be matched exactly.

EXAMPLE:
If the specified value is 20, only cells A1:A3 would be coloured or
if the specified value is 40 cells A1:A4 would be coloured with a message
box to say that 40 couldn't be matched.

A
1 10
2 5
3 5
4 10
5 20

Any help would be appreciated.

Thanks

Trevor
 
Reply With Quote
 
 
 
 
=?Utf-8?B?VG9tIE9naWx2eQ==?=
Guest
Posts: n/a
 
      27th Jun 2007
Will the cells always be contiguouis as you example shows:

Assuming looking for a macro:
if so, then you would just loop down accruing the sum until the target is
matched or exceeded.

It gets much more complex beyond that although Harlan Grove has an macro to
identify all combinations that sum to a specified amount.

Or are you looking for a conditional formatting formula? If so, how many
cells are we talking about? (although, except for exhaustive enumeration, I
don't know there is a good formula for this).

--
Regards,
Tom Ogilvy


"Trevor Williams" wrote:

> Hi All
>
> I need to be able to colour cells in a range that total a specified value,
> plus, if possible add some notification to tell the user if the specified
> value can't be matched exactly.
>
> EXAMPLE:
> If the specified value is 20, only cells A1:A3 would be coloured or
> if the specified value is 40 cells A1:A4 would be coloured with a message
> box to say that 40 couldn't be matched.
>
> A
> 1 10
> 2 5
> 3 5
> 4 10
> 5 20
>
> Any help would be appreciated.
>
> Thanks
>
> Trevor

 
Reply With Quote
 
=?Utf-8?B?VHJldm9yIFdpbGxpYW1z?=
Guest
Posts: n/a
 
      27th Jun 2007
Hi Tom

A macro would be best as not sure if users would add rows etc.

I can suss out looping through the range and applying colours, so thats the
route for me!

Thanks for your help.

Trevor

"Tom Ogilvy" wrote:

> Will the cells always be contiguouis as you example shows:
>
> Assuming looking for a macro:
> if so, then you would just loop down accruing the sum until the target is
> matched or exceeded.
>
> It gets much more complex beyond that although Harlan Grove has an macro to
> identify all combinations that sum to a specified amount.
>
> Or are you looking for a conditional formatting formula? If so, how many
> cells are we talking about? (although, except for exhaustive enumeration, I
> don't know there is a good formula for this).
>
> --
> Regards,
> Tom Ogilvy
>
>
> "Trevor Williams" wrote:
>
> > Hi All
> >
> > I need to be able to colour cells in a range that total a specified value,
> > plus, if possible add some notification to tell the user if the specified
> > value can't be matched exactly.
> >
> > EXAMPLE:
> > If the specified value is 20, only cells A1:A3 would be coloured or
> > if the specified value is 40 cells A1:A4 would be coloured with a message
> > box to say that 40 couldn't be matched.
> >
> > A
> > 1 10
> > 2 5
> > 3 5
> > 4 10
> > 5 20
> >
> > Any help would be appreciated.
> >
> > Thanks
> >
> > Trevor

 
Reply With Quote
 
=?Utf-8?B?VG9tIE9naWx2eQ==?=
Guest
Posts: n/a
 
      27th Jun 2007
Copy the code below (written by Harlan Grove) into a code module, and set the
references as
instructed in the comments.

Then run findsums and highlight the ranges with your values when prompted.

HTH,
Bernie
MS Excel MVP

Option Explicit
'Begin VBA Code

Sub findsums()
'This *REQUIRES* VBAProject references to
'Microsoft Scripting Runtime
'Microsoft VBScript Regular Expressions 1.0 or higher

Const TOL As Double = 0.000001 'modify as needed
Dim c As Variant

Dim j As Long, k As Long, n As Long, p As Boolean
Dim s As String, t As Double, u As Double
Dim v As Variant, x As Variant, y As Variant
Dim dc1 As New Dictionary, dc2 As New Dictionary
Dim dcn As Dictionary, dco As Dictionary
Dim re As New RegExp

re.Global = True
re.IgnoreCase = True

On Error Resume Next

Set x = Application.InputBox( _
Prompt:="Enter range of values:", _
Title:="findsums", _
Default:="", _
Type:=8 _
)

If x Is Nothing Then
Err.Clear
Exit Sub
End If

y = Application.InputBox( _
Prompt:="Enter target value:", _
Title:="findsums", _
Default:="", _
Type:=1 _
)

If VarType(y) = vbBoolean Then
Exit Sub
Else
t = y
End If

On Error GoTo 0

Set dco = dc1
Set dcn = dc2

Call recsoln

For Each y In x.Value2
If VarType(y) = vbDouble Then
If Abs(t - y) < TOL Then
recsoln "+" & Format(y)

ElseIf dco.Exists(y) Then
dco(y) = dco(y) + 1

ElseIf y < t - TOL Then
dco.Add Key:=y, Item:=1

c = CDec(c + 1)
Application.StatusBar = "[1] " & Format(c)

End If

End If
Next y

n = dco.Count

ReDim v(1 To n, 1 To 3)

For k = 1 To n
v(k, 1) = dco.Keys(k - 1)
v(k, 2) = dco.Items(k - 1)
Next k

qsortd v, 1, n

For k = n To 1 Step -1
v(k, 3) = v(k, 1) * v(k, 2) + v(IIf(k = n, n, k + 1), 3)
If v(k, 3) > t Then dcn.Add Key:="+" & _
Format(v(k, 1)), Item:=v(k, 1)
Next k

On Error GoTo CleanUp
Application.EnableEvents = False
Application.Calculation = xlCalculationManual

For k = 2 To n
dco.RemoveAll
swapo dco, dcn

For Each y In dco.Keys
p = False

For j = 1 To n
If v(j, 3) < t - dco(y) - TOL Then Exit For
x = v(j, 1)
s = "+" & Format(x)
If Right(y, Len(s)) = s Then p = True
If p Then
re.Pattern = "\" & s & "(?=(\+|$))"
If re.Execute(y).Count < v(j, 2) Then
u = dco(y) + x
If Abs(t - u) < TOL Then
recsoln y & s
ElseIf u < t - TOL Then
dcn.Add Key:=y & s, Item:=u
c = CDec(c + 1)
Application.StatusBar = "[" & Format(k) & "] " & _
Format(c)
End If
End If
End If
Next j
Next y

If dcn.Count = 0 Then Exit For
Next k

If (recsoln() = 0) Then _
MsgBox Prompt:="all combinations exhausted", _
Title:="No Solution"

CleanUp:
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.StatusBar = False

End Sub

Private Function recsoln(Optional s As String)
Const OUTPUTWSN As String = "findsums solutions" 'modify to taste

Static r As Range
Dim ws As Worksheet

If s = "" And r Is Nothing Then
On Error Resume Next
Set ws = ActiveWorkbook.Worksheets(OUTPUTWSN)
If ws Is Nothing Then
Err.Clear
Application.ScreenUpdating = False
Set ws = ActiveSheet
Set r = Worksheets.Add.Range("A1")
r.Parent.Name = OUTPUTWSN
ws.Activate
Application.ScreenUpdating = False
Else
ws.Cells.Clear
Set r = ws.Range("A1")
End If
recsoln = 0
ElseIf s = "" Then
recsoln = r.Row - 1
Set r = Nothing
Else
r.Value = s
Set r = r.Offset(1, 0)
recsoln = r.Row - 1
End If
End Function

Private Sub qsortd(v As Variant, lft As Long, rgt As Long)
'ad hoc quicksort subroutine
'translated from Aho, Weinberger & Kernighan,
'"The Awk Programming Language", page 161

Dim j As Long, pvt As Long

If (lft >= rgt) Then Exit Sub
swap2 v, lft, lft + Int((rgt - lft + 1) * Rnd)
pvt = lft
For j = lft + 1 To rgt
If v(j, 1) > v(lft, 1) Then
pvt = pvt + 1
swap2 v, pvt, j
End If
Next j

swap2 v, lft, pvt

qsortd v, lft, pvt - 1
qsortd v, pvt + 1, rgt
End Sub

Private Sub swap2(v As Variant, i As Long, j As Long)
'modified version of the swap procedure from
'translated from Aho, Weinberger & Kernighan,
'"The Awk Programming Language", page 161

Dim t As Variant, k As Long

For k = LBound(v, 2) To UBound(v, 2)
t = v(i, k)
v(i, k) = v(j, k)
v(j, k) = t
Next k
End Sub

Private Sub swapo(a As Object, b As Object)
Dim t As Object

Set t = a
Set a = b
Set b = t
End Sub
'---- end VBA code ----

--
Regards,
Tom Ogilvy


"Trevor Williams" wrote:

> Hi Tom
>
> A macro would be best as not sure if users would add rows etc.
>
> I can suss out looping through the range and applying colours, so thats the
> route for me!
>
> Thanks for your help.
>
> Trevor
>
> "Tom Ogilvy" wrote:
>
> > Will the cells always be contiguouis as you example shows:
> >
> > Assuming looking for a macro:
> > if so, then you would just loop down accruing the sum until the target is
> > matched or exceeded.
> >
> > It gets much more complex beyond that although Harlan Grove has an macro to
> > identify all combinations that sum to a specified amount.
> >
> > Or are you looking for a conditional formatting formula? If so, how many
> > cells are we talking about? (although, except for exhaustive enumeration, I
> > don't know there is a good formula for this).
> >
> > --
> > Regards,
> > Tom Ogilvy
> >
> >
> > "Trevor Williams" wrote:
> >
> > > Hi All
> > >
> > > I need to be able to colour cells in a range that total a specified value,
> > > plus, if possible add some notification to tell the user if the specified
> > > value can't be matched exactly.
> > >
> > > EXAMPLE:
> > > If the specified value is 20, only cells A1:A3 would be coloured or
> > > if the specified value is 40 cells A1:A4 would be coloured with a message
> > > box to say that 40 couldn't be matched.
> > >
> > > A
> > > 1 10
> > > 2 5
> > > 3 5
> > > 4 10
> > > 5 20
> > >
> > > Any help would be appreciated.
> > >
> > > Thanks
> > >
> > > Trevor

 
Reply With Quote
 
 
 
Reply

Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
colour of a row depending on cell value =?Utf-8?B?TWFheA==?= Microsoft Excel Misc 6 8th Feb 2007 05:30 PM
Change colour of cell depending on content blain Microsoft Excel Programming 9 17th Jun 2006 01:47 PM
Re: Change colour of cell depending on content tony h Microsoft Excel Programming 0 16th Jun 2006 10:16 AM
How can i change cell colour depending on month of date in cell? andy75 Microsoft Excel Misc 2 6th Jan 2006 07:46 AM
Summing a range depending on cell background colour =?Utf-8?B?UmU6IEluc2VydGluZyBhbiBvcHRpb24gYnV0dG9u Microsoft Excel Programming 3 21st Jun 2005 05:10 PM


Features
 

Advertising
 

Newsgroups
 


All times are GMT +1. The time now is 11:06 PM.