Working With Cells and Ranges in Excel VBA (Select, Copy, Move, Edit)
Working With Cells and Ranges in Excel VBA (Select, Copy, Move, Edit)
Working With Cells and Ranges in Excel VBA (Select, Copy, Move, Edit)
About
Excel Basics
Excel Functions
Blog
o Excel Tips
o VBA Tips
o Charting
o Pivot Table
o Excel Dashboard Tips
Excel Resources
o Free Templates
o Free EBook
o Free Online Excel Training
Excel Training
o Excel (Basic to Advanced)
o Excel Dashboard Course
o Excel VBA Course
o Excel Power Query Course
When working with Excel, most of your time is spent in the worksheet
area – dealing with cells and ranges.
And if you want to automate your work in Excel using VBA, you need to
know how to work with cells and ranges using VBA.
There are a lot of different things you can do with ranges in VBA (such as
select, copy, move, edit, etc.).
So to cover this topic, I will break this tutorial into sections and show you
how to work with cells and ranges in Excel VBA using examples.
All the codes I mention in this tutorial need to be placed in the VB Editor.
Go to the ‘Where to Put the VBA Code‘ section to know how it works.
If you’re interested in learning VBA the easy way, check out my Online
Excel VBA Training.
In most of the cases, you are better off not selecting cells or ranges (as
we will see).
Despite that, it’s important you go through this section and understand
how it works. This will be crucial in your VBA learning and a lot of
concepts covered here will be used throughout this tutorial.
Sub SelectCell()
Range("A1").Select
End Sub
The above code has the mandatory ‘Sub’ and ‘End Sub’ part, and a line of
code that selects cell A1.
Range(“A1”) tells VBA the address of the cell that we want to refer to.
Select is a method of the Range object and selects the cells/range
specified in the Range object. The cell references need to be enclosed in
double quotes.
This code would show an error in case a chart sheet is the active sheet.
A chart sheet contains charts and is not widely used. Since it doesn’t have
cells/ranges in it, the above code can’t select it and would end up showing
an error.
Note that since you want to select the cell in the active sheet, you just
need to specify the cell address.
But if you want to select the cell in another sheet (let’s say Sheet2), you
need to first activate Sheet2 and then select the cell in it.
Sub SelectCell()
Worksheets("Sheet2").Activate
Range("A1").Select
End Sub
Sub SelectCell()
Workbooks("Book2.xlsx").Worksheets("Sheet2").Activate
Range("A1").Select
End Sub
Note that when you refer to workbooks, you need to use the full name
along with the file extension (.xlsx in the above code). In case the
workbook has never been saved, you don’t need to use the file extension.
Now, these examples are not very useful, but you will see later in this
tutorial how we can use the same concepts to copy and paste cells in
Excel (using VBA).
In a fixed size range, you would know how big the range is and you can
use the exact size in your VBA code. But with a variable sized range, you
have no idea how big the range is and you need to use a little bit of VBA
magic.
Sub SelectRange()
Range("A1:D20").Select
End Sub
Sub SelectRange()
Range("A1", "D20").Select
End Sub
The above code takes the top-left cell address (A1) and the bottom-right
cell address (D20) and selects the entire range. This technique becomes
useful when you’re working with variably sized ranges (as we will see
when the End property is covered later in this tutorial).
For example, the below code would select the range A1:D20 in Sheet2
worksheet in the Book2 workbook.
Sub SelectRange()
Workbooks("Book2.xlsx").Worksheets("Sheet1").Activate
Range("A1:D20").Select
End Sub
Now, what if you don’t know how many rows are there. What if you want
to select all the cells that have a value in it.
In these cases, you need to use the methods shown in the next section
(on selecting variably sized range).
In this section, I will cover some useful techniques that are really useful
when you work with ranges in VBA.
In cases where you don’t know how many rows/columns have the data,
you can use the CurrentRange property of the Range object.
The CurrentRange property covers all the contiguous filled cells in a data
range.
Below is the code that will select the current region that holds cell A1.
Sub SelectCurrentRegion()
Range("A1").CurrentRegion.Select
End Sub
The above method is good when you have all data as a table without any
blank rows/columns in it.
But in case you have blank rows/columns in your data, it will not select
the ones after the blank rows/columns. In the image below, the
CurrentRegion code selects data till row 10 as row 11 is blank.
In such cases, you may want to use the UsedRange property of the
Worksheet Object.
Select Using UsedRange Property
UsedRange allows you to refer to any cells that have been changed.
So the below code would select all the used cells in the active sheet.
Sub SelectUsedRegion()
ActiveSheet.UsedRange.Select
End Sub
Note that in case you have a far-off cell that has been used, it would be
considered by the above code and all the cells till that used cell would be
selected.
The End property allows you to select the last filled cell. This allows you to
mimic the effect of Control Down/Up arrow key or Control Right/Left keys.
Suppose you have a dataset as shown below and you want to quickly
select the last filled cells in column A.
The problem here is that data can change and you don’t know how many
cells are filled. If you have to do this using keyboard, you can select cell
A1, and then use Control + Down arrow key, and it will select the last
filled cell in the column.
Now let’s see how to do this using VBA. This technique comes in handy
when you want to quickly jump to the last filled cell in a variably-sized
column
Sub GoToLastFilledCell()
Range("A1").End(xlDown).Select
End Sub
The above code would jump to the last filled cell in column A.
Similarly, you can use the End(xlToRight) to jump to the last filled cell in a
row.
Sub GoToLastFilledCell()
Range("A1").End(xlToRight).Select
End Sub
Now, what if you want to select the entire column instead of jumping to
the last filled cell.
Sub SelectFilledCells()
Range("A1", Range("A1").End(xlDown)).Select
End Sub
In the above code, we have used the first and the last reference of the cell
that we need to select. No matter how many filled cells are there, the
above code will select all.
Range(“A1″,”D20”)
Here A1 was the top-left cell and D20 was the bottom right cell in the
range. We can use the same logic in selecting variably sized ranges. But
since we don’t know the exact address of the bottom-right cell, we used
the End property to get it.
Similarly, you can also select an entire data set that has multiple rows and
columns.
The below code would select all the filled rows/columns starting from cell
A1.
Sub SelectFilledCells()
Range("A1", Range("A1").End(xlDown).End(xlToRight)).Select
End Sub
If you’re wondering why use the End property to select the filled range
when we have the CurrentRegion property, let me tell you the difference.
With End property, you can specify the start cell. For example, if you have
your data in A1:D20, but the first row are headers, you can use the End
property to select the data without the headers (using the code below).
Sub SelectFilledCells()
Range("A2", Range("A2").End(xlDown).End(xlToRight)).Select
End Sub
So far in this tutorial, we have seen how to refer to a range of cells using
different ways.
Now let’s see some ways where we can actually use these techniques to
get some work done.
Sub CopyCell()
Range("A1").Copy Range("D1")
End Sub
Note that the copy method of the range object copies the cell (just like
Control +C) and pastes it in the specified destination.
In the above example code, the destination is specified in the same line
where you use the Copy method. If you want to make your code even
more readable, you can use the below code:
Sub CopyCell()
Range("A1").Copy Destination:=Range("D1")
End Sub
The above codes will copy and paste the value as well as
formatting/formulas in it.
As you might have already noticed, the above code copies the cell without
selecting it. No matter where you’re on the worksheet, the code will copy
cell A1 and paste it on D1.
Also, note that the above code would overwrite any existing code in cell
D2. If you want Excel to let you know if there is already something in cell
D1 without overwriting it, you can use the code below.
Sub CopyCell()
If Range("D1") <> "" Then
Response = MsgBox("Do you want to overwrite the existing data", vbYesNo)
End If
If Response = vbYes Then
Range("A1").Copy Range("D1")
End If
End Sub
Sub CopyRange()
Range("A1:D20").Copy Range("J1")
End Sub
In the destination cell, you just need to specify the address of the top-left
cell. The code would automatically copy the exact copied range into the
destination.
You can use the same construct to copy data from one sheet to the other.
The below code would copy A1:D20 from the active sheet to Sheet2.
Sub CopyRange()
Range("A1:D20").Copy Worksheets("Sheet2").Range("A1")
End Sub
The above copies the data from the active sheet. So make sure the sheet
that has the data is the active sheet before running the code. To be safe,
you can also specify the worksheet name while copying the data.
Sub CopyRange()
Worksheets("Sheet1").Range("A1:D20").Copy Worksheets("Sheet2").Range("A1")
End Sub
The good thing about the above code is that no matter which sheet is
active, it will always copy the data from Sheet1 and paste it in Sheet2.
You can also copy a named range by using its name instead of the
reference.
For example, if you have a named range called ‘SalesData’, you can use
the below code to copy this data to Sheet2.
Sub CopyRange()
Range("SalesData").Copy Worksheets("Sheet2").Range("A1")
End Sub
If the scope of the named range is the entire workbook, you don’t need to
be on the sheet that has the named range to run this code. Since the
named range is scoped for the workbook, you can access it from any
sheet using this code.
If you have a table with the name Table1, you can use the below code to
copy it to Sheet2.
Sub CopyTable()
Range("Table1[#All]").Copy Worksheets("Sheet2").Range("A1")
End Sub
In the following example, I copy the Excel table (Table1), into the Book2
workbook.
Sub CopyCurrentRegion()
Range("Table1[#All]").Copy Workbooks("Book2.xlsx").Worksheets("Sheet1").Range("A1")
End Sub
But if you can’t do that, you can use the CurrentRegion or the End
property of the range object.
The below code would copy the current region in the active sheet and
paste it in Sheet2.
Sub CopyCurrentRegion()
Range("A1").CurrentRegion.Copy Worksheets("Sheet2").Range("A1")
End Sub
If you want to copy the first column of your data set till the last filled cell
and paste it in Sheet2, you can use the below code:
Sub CopyCurrentRegion()
Range("A1", Range("A1").End(xlDown)).Copy Worksheets("Sheet2").Range("A1")
End Sub
If you want to copy the rows as well as columns, you can use the below
code:
Sub CopyCurrentRegion()
Range("A1", Range("A1").End(xlDown).End(xlToRight)).Copy Worksheets("Sheet2").Range("A1")
End Sub
Note that all these codes don’t select the cells while getting executed. In
general, you will find only a handful of cases where you actually need to
select a cell/range before working on it.
To make your code more manageable, you can assign these ranges to
object variables and then use those variables.
For example, in the below code, I have assigned the source and
destination range to object variables and then used these variables to
copy data from one range to the other.
Sub CopyRange()
Dim SourceRange As Range
Dim DestinationRange As Range
Set SourceRange = Worksheets("Sheet1").Range("A1:D20")
Set DestinationRange = Worksheets("Sheet2").Range("A1")
SourceRange.Copy DestinationRange
End Sub
For example, suppose you have the data set below and you want to enter
the sales record, you can use the input box in VBA. Using a code, we can
make sure that it fills the data in the next blank row.
Sub EnterData()
Dim RefRange As Range
Set RefRange = Range("A1").End(xlDown).Offset(1, 0)
Set ProductCategory = RefRange.Offset(0, 1)
Set Quantity = RefRange.Offset(0, 2)
Set Amount = RefRange.Offset(0, 3)
RefRange.Value = RefRange.Offset(-1, 0).Value + 1
ProductCategory.Value = InputBox("Product Category")
Quantity.Value = InputBox("Quantity")
Amount.Value = InputBox("Amount")
End Sub
The above code uses the VBA Input box to get the inputs from the user,
and then enters the inputs into the specified cells.
Note that we didn’t use exact cell references. Instead, we have used the
End and Offset property to find the last empty cell and fill the data in it.
This code is far from usable. For example, if you enter a text string when
the input box asks for quantity or amount, you will notice that Excel
allows it. You can use an If condition to check whether the value is
numeric or not and then allow it accordingly.
For example, if you want to highlight every third row in the selection, then
you need to loop through and check for the row number. Similarly, if you
want to highlight all the negative cells by changing the font color to red,
you need to loop through and analyze each cell’s value.
Here is the code that will loop through the rows in the selected cells and
highlight alternate rows.
Sub HighlightAlternateRows()
Dim Myrange As Range
Dim Myrow As Range
Set Myrange = Selection
For Each Myrow In Myrange.Rows
If Myrow.Row Mod 2 = 0 Then
Myrow.Interior.Color = vbCyan
End If
Next Myrow
End Sub
The above code uses the MOD function to check the row number in the
selection. If the row number is even, it gets highlighted in cyan color.
Here is another example where the code goes through each cell and
highlights the cells that have a negative value in it.
Sub HighlightAlternateRows()
Dim Myrange As Range
Dim Mycell As Range
Set Myrange = Selection
For Each Mycell In Myrange
If Mycell < 0 Then
Mycell.Interior.Color = vbRed
End If
Next Mycell
End Sub
Note that you can do the same thing using Conditional Formatting (which
is dynamic and a better way to do this). This example is only for the
purpose of showing you how looping works with cells and ranges in VBA.
Excel has a VBA backend called the VBA editor. You need to copy and
paste the code in the VB Editor module code window.
2. Click on Visual Basic option. This will open the VB editor in the
backend.
March 2018
© Trump Excel - Free Online Excel Training (2019)
Close dialog
Session expired
Please log in again. The login page will open in a new window. After logging in
you can close it and return to this page.