byronwall/bUTL

Create Function to allow InputBox or Selection

byronwall opened this issue · 11 comments

This is tied to #13 which will create a settings file. It would be good to allow the formatting to be applied to an input or to the Selection.

I guess Application.InputBox takes a parameter Default:= which can be used to start the box with a value. This works nicely for what I want, which is a default option to use Selection. I will create a Function that works on this idea with code like:

Set rng = Application.InputBox("Range:", "Range", Selection.Address, Type:=8)

image

I will wrap it in a Function so that there is some error checking (e.g. Chart is selected) and consistency across all the places where this can be used. That Function will also pair nicely with a settings file that can override the Input and default to Selection with no prompt.

That is a nice way to solve this. Is the .address required on the selection?

It looks like it. The documentation claims that it can be a Range but I can't seem to get it to work. It looks like it wants to coerce that default to its value and not take the Range object.

I will go ahead and create this Function and replace the various InputBox calls with it.

This has been added as GetInputOrSelection. It still needs a little work to take a parameter for the InputBox prompt. I did not replace any of the other places with this code yet. I only used it twice for issues related to error handling (see #31).

The outstanding work on this is then:

  • add a parameter for the input box text and title
  • replace all of the current InputBoxes with this function

This has been added, so I should re-clone to be updated?

You probably want to sync your fork with this one to get up to date. Depending on how you're configured, you should probably follow this and possibly this one first if you don't have upstream configured as a remote.

I try to use GitHub for Windows wherever possible (I'm lazy) but am not sure how it handles syncing a fork; I have not done that yet with it.

I just went and did a pull request on my from yours (web interface). All my projects are in my dropbox folder so syncing one machine will sync all machines. I don't have the client at work so I always end up in teamviewer syncing commits from my w7 home box, ha. The fork syncing process seems a little more complicated than the regular process, what with the upstream and everything. I tried setting it up in osx a while back with terminal and I think I ended up breaking something and backed it out.

I thought it might be more useful to add a parameter to the function -

Function GetInputOrSelection(msg As String) As Range
'etc
Set GetInputOrSelection = Application.InputBox(msg, Type:=8, Default:=strDefault)

This will help with subs like CategoricalColoring where the user needs to identify more than one range for different reasons -

Public Sub CategoricalColoring()
'+Get User Input
Dim rngToColor As Range
On Error GoTo errHandler
Set rngToColor = GetInputOrSelection("Select Range to Color")
Dim rngColors As Range
Set rngColors = GetInputOrSelection("Select Range with Colors")

By returning Nothing on cancel, all the existing errHandlers should still work - good stuff.

I think this issue is fairly resolved. There are probably a couple additional things to consider for this Function going forward:

  • Provide a parameter for the default range (maybe a boolean to use Selection or not). This will help with those second and third inputs where the selection is less meaningful.
  • Provide another parameter for the title on the InputBox. This can default to nothing or "Select range" or something.

Regarding the error handlers, we can probably take a second look at where some of those are placed now. Since the Function returns Nothing, we can now check for that (If ... Is Nothing Then : Exit Sub : End If) instead of having to catch a downstream error when Nothing.Value or something similar is attempted.

I was just struggling with something similar to the inputbox thing so I came back here looking for it. Apparently if you require Type 8 input (range) and have a range variable being set to the result, the inputbox will throw an error if the user hits cancel (and maybe when the range is blank). This makes it impossible to catch the error with an if this is nothing. I hate error handlers, so I broke the inputbox out into its own function. That way it handles its own errors and doesn't handle any other errors that pop up. Might be useful -

Private Function GetUserInputRange() As Range
    'This is segregated because of how excel handles cancelling a range input
    Dim userAnswer As Range
    On Error GoTo inputerror
    Set userAnswer = Application.InputBox("Please select a single column to parse", "Column Parser", Type:=8)
    Set GetUserInputRange = userAnswer
    Exit Function
inputerror:
    Set GetUserInputRange = Nothing
End Function

I did put this on SO http://stackoverflow.com/a/36630124/1161309

InputBoxes can be a pain. There is a function in butl called GetInputOrSelection that does something similar. It defaults the input to the currently selected range if there is one. Can't remember how I handle the errors though. (I may not)

I'll go over the commits tonight or tomorrow night. My work schedule has temporarily changed a bit and I am away from the computer most of the day.

On Apr 14, 2016, at 11:40, Ray Wise notifications@github.com wrote:

I was just struggling with something similar to the inputbox thing so I came back here looking for it. Apparently if you require Type 8 input (range) and have a range variable being set to the result, the inputbox will throw an error if the user hits cancel (and maybe when the range is blank). This makes it impossible to catch the error with an if this is nothing. I hate error handlers, so I broke the inputbox out into its own function. That way it handles its own errors and doesn't handle any other errors that pop up. Might be useful -

Private Function GetUserInputRange() As Range
'This is segregated because of how excel handles cancelling a range input
Dim userAnswer As Range
On Error GoTo inputerror
Set userAnswer = Application.InputBox("Please select a single column to parse", "Column Parser", Type:=8)
Set GetUserInputRange = userAnswer
Exit Function
inputerror:
Set GetUserInputRange = Nothing
End Function
I did put this on SO http://stackoverflow.com/a/36630124/1161309


You are receiving this because you modified the open/close state.
Reply to this email directly or view it on GitHub