Link to home
Start Free TrialLog in
Avatar of Svgmassive
Svgmassive

asked on

current region

I would like to get the address of the range the user clicks.
Thanks
Book101.xlsm
Avatar of nutsch
nutsch
Flag of United States of America image

Try this code, in the worksheet module


Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim rgSelect As Range, rgStart As Range, rgEnd As Range

If Len(Cells(Target.Row, 2)) > 0 Then
    Set rgStart = Cells(Target.Row, 2)
Else
    Set rgStart = Cells(Target.Row, 2).End(xlUp)
End If

If Len(Cells(Target.Row, 6)) = 0 Then
    Set rgEnd = Cells(Target.Row, 8)
Else
    If Len(Cells(rgStart.Row + 1, 6)) = 0 Then
        Set rgEnd = Cells(rgStart.Row + 1, 8)
    Else
        Set rgEnd = Cells(rgStart.Row, 6).End(xlDown).Offset(1, 2)
    End If
End If

Set rgSelect = Range(rgStart, rgEnd)

MsgBox rgSelect.Address

End Sub

Open in new window

Avatar of Agneau
Agneau

Hello Svgmassive,

Strictly following your tamplate this code should work (I've also attached a spreadsheet with the code already implemented).

Please note that the address of the "colored range" selected will appear in the status bar to avoid a annoying message box.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim nTop As Long
    Dim nLeft As Long
    Dim nBottom As Long
    Dim nRight As Long
    
    If Target.Interior.ColorIndex <> -4142 Then
        While Target.Offset(nTop, nLeft).Interior.ColorIndex = Target.Interior.ColorIndex And Target.Column - nLeft > 1
            nLeft = nLeft - 1
        Wend
        If Target.Column - nLeft > 1 Then
            nLeft = nLeft + 1
        End If
        
        While Target.Offset(nTop, nLeft).Interior.ColorIndex = Target.Interior.ColorIndex And Target.Row - nTop > 1
            nTop = nTop - 1
        Wend
        If Target.Row - nTop > 1 Then
            nTop = nTop + 1
        End If

        While Target.Offset(nBottom, nRight).Interior.ColorIndex = Target.Interior.ColorIndex
            nBottom = nBottom + 1
        Wend
        nBottom = nBottom - 1
        
        While Target.Offset(nBottom, nRight).Interior.ColorIndex = Target.Interior.ColorIndex
            nRight = nRight + 1
        Wend
        nRight = nRight - 1
        
        Application.StatusBar = "Colored range selected: " & Me.Range(Target.Offset(nTop, nLeft), Target.Offset(nBottom, nRight)).Address
        
    Else
        Application.StatusBar = False
    
    End If
End Sub

Open in new window

Book101.xlsm
Avatar of Svgmassive

ASKER

agneau your example uses the cell color but that only work if the cell has color,nutsch example looks at the last number in column f it should be actually be looking at the last date in column b and the and the last number in column f  if there is a missing date eg.last date entry.Thanks
Hi Svgmassive,

I'm not sure if I understood your requirements.
In order to get the current region, Excel implements a native property of the range object called CurrentRegion

msgbox Cells(4,6).CurrentRegion.Address

Open in new window


According to Excel documentation a "the current region is a range bounded by any combination of blank rows and blank columns."

Depending on the layout of your spreadhseet this would be the easiest way to code it. However your range examples contain blank columns (C, E, G and H) that prevent the CurrentRegion property to obtain the addresses you need.

I would suggest to redesign the spreadsheet layout to make use of CurrentRegion property, if this is not possible you need to clarify what is the logical organization of your spreadsheet:

Are columns C, E, G, H always empty?
How many "wekends"can exist in a single range?
How many "days" can exist in a single range?
Can more than one row of "emp id" column be empty? (or just one to limite the boundaries of the range)

Regards
ASKER CERTIFIED SOLUTION
Avatar of nutsch
nutsch
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial