PC Review


Reply
Thread Tools Rate Thread

Allow only one value in range.

 
 
Michael
Guest
Posts: n/a
 
      16th Mar 2010
I am trying to write a script that has the result of only allowing one
value within a range at any time. So if the user puts new value in the
range the range is cleared except for the new value. The below works
but if the user moves the cursor into the range it gets cleared. I
only want to it clear and use the new value if a new value is entered
in it.

use the the Change event creates a recursive problem where it keeps
changing and repeating.

Any other ideas?


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim inputval As Variant
Dim c As Variant

inputval = Target.Value

'If Target.Row = 3 Then
For Each c In Range("testrng")
If c.Address = Target.Address Then
'MsgBox Target.Value
Range("testrng").Clear
Target.Value = inputval
End If
Next c
End Sub
 
Reply With Quote
 
 
 
 
Lars-Åke Aspelin
Guest
Posts: n/a
 
      16th Mar 2010
On Tue, 16 Mar 2010 14:21:29 -0700 (PDT), Michael <(E-Mail Removed)>
wrote:

>I am trying to write a script that has the result of only allowing one
>value within a range at any time. So if the user puts new value in the
>range the range is cleared except for the new value. The below works
>but if the user moves the cursor into the range it gets cleared. I
>only want to it clear and use the new value if a new value is entered
>in it.
>
>use the the Change event creates a recursive problem where it keeps
>changing and repeating.
>
>Any other ideas?
>
>
>Private Sub Worksheet_SelectionChange(ByVal Target As Range)
>Dim inputval As Variant
>Dim c As Variant
>
>inputval = Target.Value
>
>'If Target.Row = 3 Then
>For Each c In Range("testrng")
> If c.Address = Target.Address Then
> 'MsgBox Target.Value
> Range("testrng").Clear
> Target.Value = inputval
> End If
>Next c
>End Sub


To avoid recursion problem, disable the event handling while clearing
the range. Try this procedure

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("testrng"), Target) Is Nothing Then
inputval = Target.Value
Application.EnableEvents = False
Range("testrng").Value = ""
Target.Value = inputvalue
Application.EnableEvents = True
End If
End Sub

I changed Range().Clear to Range().Value = "" as clear will also
remove any formatting to the range. Use Clear if that is what you
want.

Hope this helps / Lars-Åke

 
Reply With Quote
 
OssieMac
Guest
Posts: n/a
 
      17th Mar 2010
Suggest in lieu of following
Range("testrng").Value = ""

use
Range("testrng").ClearContents

That doesn't take out formatting.

There is also ClearFormats and ClearComments and of course Clear which
actuallly means Clear All.

--
Regards,

OssieMac


"Lars-Ã…ke Aspelin" wrote:

> On Tue, 16 Mar 2010 14:21:29 -0700 (PDT), Michael <(E-Mail Removed)>
> wrote:
>
> >I am trying to write a script that has the result of only allowing one
> >value within a range at any time. So if the user puts new value in the
> >range the range is cleared except for the new value. The below works
> >but if the user moves the cursor into the range it gets cleared. I
> >only want to it clear and use the new value if a new value is entered
> >in it.
> >
> >use the the Change event creates a recursive problem where it keeps
> >changing and repeating.
> >
> >Any other ideas?
> >
> >
> >Private Sub Worksheet_SelectionChange(ByVal Target As Range)
> >Dim inputval As Variant
> >Dim c As Variant
> >
> >inputval = Target.Value
> >
> >'If Target.Row = 3 Then
> >For Each c In Range("testrng")
> > If c.Address = Target.Address Then
> > 'MsgBox Target.Value
> > Range("testrng").Clear
> > Target.Value = inputval
> > End If
> >Next c
> >End Sub

>
> To avoid recursion problem, disable the event handling while clearing
> the range. Try this procedure
>
> Private Sub Worksheet_Change(ByVal Target As Range)
> If Not Intersect(Range("testrng"), Target) Is Nothing Then
> inputval = Target.Value
> Application.EnableEvents = False
> Range("testrng").Value = ""
> Target.Value = inputvalue
> Application.EnableEvents = True
> End If
> End Sub
>
> I changed Range().Clear to Range().Value = "" as clear will also
> remove any formatting to the range. Use Clear if that is what you
> want.
>
> Hope this helps / Lars-Ã…ke
>
> .
>

 
Reply With Quote
 
Michael
Guest
Posts: n/a
 
      17th Mar 2010
On Mar 17, 2:52*am, OssieMac <Ossie...@discussions.microsoft.com>
wrote:
> Suggest in lieu of following
> Range("testrng").Value = ""
>
> use
> Range("testrng").ClearContents
>
> That doesn't take out formatting.
>
> There is also ClearFormats and ClearComments and of course Clear which
> actuallly means Clear All.
>
> --
> Regards,
>
> OssieMac
>
>
>
> "Lars-Åke Aspelin" wrote:
> > On Tue, 16 Mar 2010 14:21:29 -0700 (PDT), Michael <mfg...@gmail.com>
> > wrote:

>
> > >I am trying to write a script that has the result of only allowing one
> > >value within a range at any time. So if the user puts new value in the
> > >range the range is cleared except for the new value. The below works
> > >but if the user moves the cursor into the range it gets cleared. I
> > >only want to it clear and use the new value if a new value is entered
> > >in it.

>
> > >use the the Change event creates a recursive problem where it keeps
> > >changing and repeating.

>
> > >Any other ideas?

>
> > >Private Sub Worksheet_SelectionChange(ByVal Target As Range)
> > >Dim inputval As Variant
> > >Dim c As Variant

>
> > >inputval = Target.Value

>
> > >'If Target.Row = 3 Then
> > >For Each c In Range("testrng")
> > > * *If c.Address = Target.Address Then
> > > * * * * * *'MsgBox Target.Value
> > > * * * * * *Range("testrng").Clear
> > > * * * * * * Target.Value = inputval
> > > * *End If
> > >Next c
> > >End Sub

>
> > To avoid recursion problem, disable the event handling while clearing
> > the range. Try this procedure

>
> > Private Sub Worksheet_Change(ByVal Target As Range)
> > * If Not Intersect(Range("testrng"), Target) Is Nothing Then
> > * * inputval = Target.Value
> > * * Application.EnableEvents = False
> > * * Range("testrng").Value = ""
> > * * Target.Value = inputvalue
> > * * Application.EnableEvents = True
> > * End If
> > End Sub

>
> > I changed Range().Clear to Range().Value = "" as clear will also
> > remove any formatting to the range. Use Clear if that is what you
> > want.

>
> > Hope this helps / Lars-Åke

>
> > .- Hide quoted text -

>
> - Show quoted text -


Thanks this was helpful but I am still having a problem. Now it
inserts the value and then clears it eventhough the clear is before
setting the target back to the input value. Am I mssing somethign
stupid?

Private Sub Worksheet_Change(ByVal Target As Range)
Dim isec As Range
Dim inputval As Variant

inputval = Target.Value
Set isec = Application.Intersect(Range("eventRngStable"), Target)
Application.EnableEvents = False
If isec Is Nothing Then
MsgBox "out of range"
Else


Range("eventRngStable").ClearContents


End If
Target.Value = inputvalue
Application.EnableEvents = True


End Sub
 
Reply With Quote
 
OssieMac
Guest
Posts: n/a
 
      17th Mar 2010
Hi Michael,

Try the following. There was no test for additional values equal to input
value. Also inputval was dimensioned then inputvalue used in the code. If you
include Option Explicit at the very top of the VBA editor page and then
before running the code, Select Debug -> Compile. The variables not properly
dimensioned will be highlighted before running the code.

The On Error should be used with Application.EnableEvents = False. If you
get an error in the code and it does not complete running to
Application.EnableEvents = True then events remain turned off until you
either turn them on with code or restart Excel.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim isec As Range
Dim inputvalue As Variant

inputvalue = Target.Value
Set isec = Application.Intersect _
(Range("eventRngStable"), Target)

On Error GoTo ReEnableEvents
Application.EnableEvents = False
If isec Is Nothing Then
MsgBox "out of range"
Else

If WorksheetFunction.CountIf _
(Range("eventRngStable"), _
inputvalue) > 1 Then

Range("eventRngStable").ClearContents
Target.Value = inputvalue
End If

End If

ReEnableEvents:
Application.EnableEvents = True

End Sub


--
Regards,

OssieMac


 
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
How do I enter formula sum(range+range)*0.15 sumif(range>=3) tkw Microsoft Excel Misc 2 1st Oct 2009 09:17 PM
subtracting a range from another range and getting a range result cartoper@gmail.com Microsoft Excel Discussion 4 3rd Feb 2007 05:47 PM
Excel Addin:Setting the range to the Excel.Range object range prop =?Utf-8?B?UnAwMDc=?= Microsoft Excel Worksheet Functions 5 24th Nov 2006 04:30 PM
Sum Range 1 when the elements in Range 2 are found in Range 3 james s shoenfelt Microsoft Excel Misc 1 3rd Nov 2003 11:34 PM
how to? set my range= my UDF argument (range vs. value in range) [advanced?] Keith R Microsoft Excel Programming 2 11th Aug 2003 05:55 PM


Features
 

Advertising
 

Newsgroups
 


All times are GMT +1. The time now is 07:08 AM.