Link to home
Start Free TrialLog in
Avatar of WeThotUWasAToad
WeThotUWasAToad

asked on

Move VBA code to a new Excel workbook and modify cell references

Hello,

Quite some time ago, I obtained the following two-part VBA code for Excel which I now want to include in a new workbook:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
	
End Sub

Open in new window

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
	
    If Not Intersect(Target, Range("AA:AE")) Is Nothing Then
        rowsel = Target.Row
        Range("AC1").Value = Range("P" & rowsel).Value
    End If
End Sub

Open in new window


The function of the code is as follows:

When a cell in a particular column is selected, the cell at the top of that column displays the content from a different column which resides in the same row as the selected cell.

For example, in the following screenshot, cell D7 is selected so cell D1 displays the content from cell B7 (ie from the same row as the active cell):

User generated image
And then when a different cell in column D is selected — whether by use of the Up/Down arrows or by a mouse-click — the heading in cell D1 automatically changes to display the content in column B of the new active row. In other words, the spreadsheet does not have to recalculate for the heading to change. It simply occurs by changing which cell is active (eg D11 in this screenshot):

User generated image
Here is a screenshot of how the code appears in the older workbook:

User generated image
I know I need to save the workbook as a macro-enabled (.xlsm) file but which Insert option should be used and where should each part of the code be pasted?

User generated image
Also, which parts of the code needs to be modified if I want to change the selected cell, heading, and/or content column(s)?

Thanks
ASKER CERTIFIED SOLUTION
Avatar of Subodh Tiwari (Neeraj)
Subodh Tiwari (Neeraj)
Flag of India 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
Avatar of WeThotUWasAToad
WeThotUWasAToad

ASKER

Thanks for the response.

I noticed two lines in your code which I don't see in the original:

If Target.CountLarge > 1 Then Exit Sub
Dim rowsel As Long

Open in new window


Can you explain their purpose? Oh, I just saw your comment. What does, "the code will exit" mean? If I select multiple cells, I'd like to still have the row one display show the top of the range I have selected.
The code will Exit means, it won't perform any action defined in the code because not one cell is selected only but more than one cells so in that case you won't like the code to perform any predefined actions after making the selection on the sheet.

You used the variable rowsel to hold the selected cell's row but didn't declare that variable. It's always a good practice to declare all the variables along with their data types used in the code. So it's always better to have "Option Explicit" on top of the Module so that the compiler will let you know if you are using a variable in the code and didn't declare it or misspelled it.
Your code seems to work great Subodh* and thanks for the explanation.
The code will Exit means, it won't perform any action defined in the code because not one cell is selected only but more than one cells so in that case you won't like the code to perform any predefined actions after making the selection on the sheet.
Could I rewrite your first paragraph as follows?

        "The code will exit" means it won't perform any of its defined actions if you happen to select more than a single cell.

That's how I understand it but please let me know if I'm wrong.

Incidentally, out of curiosity and with your earlier explanation and the screenshot included in my OP, I was able to obtain the desired functionality from the previous form of the code by:

Right-click > ThisWorkbook > View Code > paste:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    
    If Not Intersect(Target, Range("C:E")) Is Nothing Then
        rowsel = Target.Row
        Range("D1").Value = Range("B" & rowsel).Value
    End If
End Sub

Open in new window

...and:

Right-click > Sheet1 > View Code > paste:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
End Sub

Open in new window

After doing that, the only difference I noticed is that your code becomes functional as soon as it is inserted (ie even before saving the workbook, let alone saving it as an .xlsm file).

Also, I did not notice a problem with either code when extending the selection beyond a single cell.

Thanks again,

Steve

*Sorry I don't know this but should I refer to you as Subodh or Neeraj?