The Value Property Is the Core of Cell I/O
In VBA, reading and writing cell data almost always flows through the Value property of a Range object. Writing Range("A1").Value = 42 pushes a number into a cell, while x = Range("A1").Value pulls the cell's contents into a variable. Value is the default property, so Range("A1") = 42 works too, but writing it explicitly makes intent clear and avoids surprises when the object is passed around.
Cricket analogy: Range.Value is the strike rate you actually record on the scoreboard: Range("A1").Value = 42 posts the run, and reading it back is like checking the scorecard for Kohli's exact total rather than guessing.
Range Versus Cells for Addressing
There are two main ways to point at a cell. Range("B3") uses the familiar A1-style address, which is readable for fixed locations. Cells(3, 2) uses row and column numbers, which is ideal inside loops because you can compute the indices. You can combine them: Range("A1").Cells(2, 1) is relative to A1, and Range(Cells(1, 1), Cells(10, 3)) builds a rectangular block from two corner references, perfect for selecting a whole table programmatically.
Cricket analogy: Range("B3") is naming a fielder by position like 'gully', while Cells(3, 2) is giving grid coordinates on the field; in a loop you want the coordinates, just as a captain sets fields by numbered zones during a Powerplay.
Sub WriteAndReadDemo()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Data")
' Write single values
ws.Range("A1").Value = "Product"
ws.Cells(1, 2).Value = "Qty"
' Loop-write using Cells
Dim i As Long
For i = 2 To 6
ws.Cells(i, 1).Value = "Item " & (i - 1)
ws.Cells(i, 2).Value = i * 10
Next i
' Read a value back
Dim total As Double
total = Application.WorksheetFunction.Sum(ws.Range("B2:B6"))
ws.Range("B7").Value = total
End SubBulk Transfer With Variant Arrays
Touching cells one at a time is slow because each read or write crosses the boundary between VBA and Excel's calculation engine. The fast pattern is to read an entire range into a Variant in a single statement — data = Range("A1:C1000").Value produces a 2-D array indexed from 1 — process it in memory, then write the whole array back with one assignment. For a thousand-row range this can be dozens of times faster than a cell-by-cell loop, and it is the single most important performance habit for cell I/O.
Cricket analogy: Writing cell by cell is taking a single every ball; loading a Variant array is farming the strike to smash a whole over of boundaries at once, the way a set batsman accelerates in the death overs.
When you read a multi-cell range into a Variant, the resulting array is 2-dimensional and 1-based: data(1, 1) is the top-left cell. Even a single-column range like A1:A10 comes back as data(1 To 10, 1 To 1), so remember the second index.
Value returns the coerced cell value, so a date shows as a Date and a formula returns its result. Use Value2 to avoid Currency/Date coercion when you want the raw underlying number, and use Text to get the displayed string exactly as formatted. Reading .Formula gives the formula string, not the computed result.
- The Value property is the primary way to read and write cell contents; it is the default property of Range.
- Range("A1") uses A1-style addresses; Cells(row, col) uses numeric indices ideal for loops.
- Range(Cells(r1,c1), Cells(r2,c2)) builds a rectangular block from two corners.
- Reading a range into a Variant array and writing it back in one statement is dramatically faster than cell-by-cell access.
- Variant arrays from ranges are 2-D and 1-based; index them as data(row, col).
- Value2 avoids Date/Currency coercion, Text returns the displayed string, and Formula returns the formula text.
Practice what you learned
1. Which statement reads an entire range into memory in one operation?
2. How is a Variant array obtained from Range("A1:A10").Value indexed?
3. Why is Cells(row, col) often preferred over Range("A1") inside a loop?
4. Which property returns a cell's displayed string exactly as it is formatted on screen?
5. What does Range(Cells(1, 1), Cells(10, 3)) refer to?
Was this page helpful?
You May Also Like
Dictionaries and Collections in VBA
Comparing VBA's built-in Collection with the Scripting.Dictionary for storing keyed data, and choosing the right one for lookups, de-duplication, and counting.
VBA and ADO Database Access
Using ActiveX Data Objects (ADO) from VBA to connect to databases, run parameterized queries, and read results into a worksheet or recordset.
Regular Expressions in VBA
Using the VBScript RegExp object to match, extract, and replace text patterns in VBA, including groups, global matching, and common gotchas.
Related Reading
Related Study Notes in Programming
Browse all study notesApache Spark Study Notes
Programming · 30 topics
ProgrammingApache Flink Study Notes
Programming · 30 topics
ProgrammingHadoop Study Notes
Programming · 30 topics
ProgrammingSnowflake Study Notes
Programming · 30 topics
ProgrammingApache Airflow Study Notes
Programming · 30 topics
Programmingdbt (Data Build Tool) Study Notes
Programming · 30 topics