Solved

current region

Posted on 2013-06-24
5
167 Views
Last Modified: 2013-06-27
I would like to get the address of the range the user clicks.
Thanks
Book101.xlsm
0
Comment
Question by:Svgmassive
  • 2
  • 2
5 Comments
 
LVL 39

Expert Comment

by:nutsch
Comment Utility
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

0
 
LVL 2

Expert Comment

by:Agneau
Comment Utility
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
0
 

Author Comment

by:Svgmassive
Comment Utility
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
0
 
LVL 2

Expert Comment

by:Agneau
Comment Utility
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
0
 
LVL 39

Accepted Solution

by:
nutsch earned 500 total points
Comment Utility
Here's a quick adjust to my original code:

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 rgstart.end(xldown).row=rows.count then
    set rgEnd=cells(rows.count,6).end(xlup).offset(1,2)
else
   set rgEnd=cells(rgstart.end(xldown).row-1,8)
end if

Set rgSelect = Range(rgStart, rgEnd)

MsgBox rgSelect.Address

End Sub

Open in new window


Thomas
0

Featured Post

6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

Join & Write a Comment

Dealing with unintended Excel Active-X resizing quirks (VBA code simulates "self correction") David Miller (dlmille) Intro Not everyone is a fan of Active-X controls in spreadsheets (as opposed to the UserForm approach, the older Form controls …
This article descibes how to create a connection between Excel and SAP and how to move data from Excel to SAP or the other way around.
Viewers will learn the basics of slicers and timelines for both PivotTables and standard Excel tables in Excel 2013.
This Micro Tutorial will demonstrate the scrolling table in Microsoft Excel using the INDEX function.

771 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now