Set excel from a cells value

In this Article

  • Set Cell Value
    • Range.Value & Cells.Value
    • Set Multiple Cells’ Values at Once
    • Set Cell Value – Text
    • Set Cell Value – Variable
  • Get Cell Value
    • Get ActiveCell Value
    • Assign Cell Value to Variable
  • Other Cell Value Examples
    • Copy Cell Value
    • Compare Cell Values

This tutorial will teach you how to interact with Cell Values using VBA.

Set Cell Value

To set a Cell Value, use the Value property of the Range or Cells object.

Range.Value & Cells.Value

There are two ways to reference cell(s) in VBA:

  • Range Object – Range(“A2”).Value
  • Cells Object – Cells(2,1).Value

The Range object allows you to reference a cell using the standard “A1” notation.

This will set the range A2’s value = 1:

Range("A2").Value = 1

The Cells object allows you to reference a cell by it’s row number and column number.

This will set range A2’s value = 1:

Cells(2,1).Value = 1

Notice that you enter the row number first:

Cells(Row_num, Col_num)

Set Multiple Cells’ Values at Once

Instead of referencing a single cell, you can reference a range of cells and change all of the cell values at once:

Range("A2:A5").Value = 1

Set Cell Value – Text

In the above examples, we set the cell value equal to a number (1).  Instead, you can set the cell value equal to a string of text.  In VBA, all text must be surrounded by quotations:

Range("A2").Value = "Text"

If you don’t surround the text with quotations, VBA will think you referencing a variable…

Set Cell Value – Variable

You can also set a cell value equal to a variable

Dim strText as String
strText = "String of Text"

Range("A2").Value = strText

Get Cell Value

You can get cell values using the same Value property that we used above.

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

automacro

Learn More

Get ActiveCell Value

To get the ActiveCell value and display it in a message box:

MsgBox ActiveCell.Value

Assign Cell Value to Variable

To get a cell value and assign it to a variable:

Dim var as Variant

var = Range("A1").Value

Here we used a variable of type Variant. Variant variables can accept any type of values.  Instead, you could use a String variable type:

Dim var as String

var = Range("A1").Value

A String variable type will accept numerical values, but it will store the numbers as text.

If you know your cell value will be numerical, you could use a Double variable type (Double variables can store decimal values):

Dim var as Double

var = Range("A1").Value

However, if you attempt to store a cell value containing text in a double variable, you will receive an type mismatch error:

get cell value assign variable

Other Cell Value Examples

VBA Programming | Code Generator does work for you!

Copy Cell Value

It’s easy to set a cell value equal to another cell value (or “Copy” a cell value):

Range("A1").Value = Range("B1").Value

You can even do this with ranges of cells (the ranges must be the same size):

Range("A1:A5").Value = Range("B1:B5").Value

Compare Cell Values

You can compare cell values using the standard comparison operators.

Test if cell values are equal:

MsgBox Range("A1").Value = Range("B1").Value

Will return TRUE if cell values are equal. Otherwise FALSE.

You can also create an If Statement to compare cell values:

If Range("A1").Value > Range("B1").Value Then

  Range("C1").Value = "Greater Than"

Elseif Range("A1").Value = Range("B1").Value Then

  Range("C1").Value = "Equal"

Else

  Range("C1").Value = "Less Than"

End If

You can compare text in the same way (Remember that VBA is Case Sensitive)

Key Notes

  • The value property can be used in both ways (you can read and write a value from a cell).
  • You can refer to a cell using Cells and Range Object to set a cell value (to Get and Change also).

To set a cell value, you need to use the “Value” property, and then you need to define the value that you want to set. Here I have used some examples to help you understand this.

1. Enter a Value in a Cell

Let’s say you need to enter the value “Done” in cell A1. In that case, the code would be something like the below:

Range("A1").Value = "Done"

As you can see, I have first defined the cell address where I want to add the value, and then the value property. In the end, I have assigned the value “Done” using an equal “=” sign enclosed in double quotation marks.

You can also use the “Cells” property, just like the following code.

Cells(1, 1).Value = "Done"

The above code also refers to cell A1.

Apart from this, there is one more way that you can use and that’s by not using the value property directly assigning the value to the cell.

Cells(1, 1) = "Done"

But this is recommended to use the value property to enter a value in a cell.

Now let’s say you want to enter a number in a cell. In that case, you don’t need to use double quotation marks. You can write the code like the following.

Range("A1") = 99

You can also DATE and NOW (VBA Functions) to enter a date or a timestamp in a cell using a VBA code.

Range("A1").Value = Date
Range("A2").Value = Now

And if you want to enter a value in the active cell then the code you need would be like:

ActiveCell.Value = Date

2. Using an Input Box

If you want a user to specify a value to enter in a cell you can use an input box. Let’s say you want to enter the value in cell A1, the code would be like this:

Range("A1").Value = _
InputBox(Prompt:="Type the value you want enter in A1.")

In the above code, the value from cell A1 assigns to the value returned by the input box that returns the value entered by the user.

3. From Another Cell

You can also set cell value using the value from another cell. Let’s say if you want to add value to cell A1 from the cell B1, the code would be:

Range("A1") = Range("B1").Value

You can also refer to cell B1 without using the value property.

Range("A1") = Range("B1")

4. Set Value in an Entire Range

Imagine you want to enter values in multiple cells or a range of cells instead of a single cell, in that case, you need to write code like the below:

Range("A1:A10").Value = Date
Range("B1, B10").Value = Now

In the first line of code, you have an entire range from cell A1 to A10, and in the second line, there are two cells B1 and B10.

Get Cell Value

As I said, you can use the same value property to get value from a cell.

1. Get Value from the ActiveCell

Let’s say you want to get the value from the active cell, in that case, you need to use the following code.

ActiveCell.Value = Range("A1")

In the above code, you have used the value property with the active cell and then assigned that value to cell A1.

2. Assign to a Variable

You can also get a value from a cell and further assign it to a variable.

Now in the above code, you have the variable “i” Which has the date as its data type. In the second line of the code, the value from cell A1 is assigned to the variable.

3.  Show in a MsgBox

Now imagine, you want to show the value from cell A1 using a message box. In this case, the code would be like the below.

MsgBox Range("A1").Value

In the above code, the message box will take value from cell A1 and show it to the user.

Change Cell Value

You can also make changes to a cell value, and here I have shared a few examples that can help you to understand this.

1. Add a Number to an Existing Number

Let’s say if you want to add one to the number that you have in cell A1, you can use the following code.

Range("A1").Value = Range("A1").Value + 1

The above code assigns value to cell A1 by taking value from cell A1 itself and adding one to it. But you can also use VBA IF THEN ELSE to write a condition to change only when there is a number in the cell.

If IsNumeric(Range("A1").Value) Then
  Range("A1").Value = Range("A1").Value + 1
End If

2. Remove First Character from Cell

Now, the following code removes the first character from the cell value and assigns the rest of the value back to the cell.

Range("A1").Value = Right(Range("A1").Value, Len(Range("A1").Value) - 1)

More Tutorials

    • Count Rows using VBA in Excel
    • Excel VBA Font (Color, Size, Type, and Bold)
    • Excel VBA Hide and Unhide a Column or a Row
    • Excel VBA Range – Working with Range and Cells in VBA
    • Apply Borders on a Cell using VBA in Excel
    • Find Last Row, Column, and Cell using VBA in Excel
    • Insert a Row using VBA in Excel
    • Merge Cells in Excel using a VBA Code
    • Select a Range/Cell using VBA in Excel
    • SELECT ALL the Cells in a Worksheet using a VBA Code
    • ActiveCell in VBA in Excel
    • Special Cells Method in VBA in Excel
    • UsedRange Property in VBA in Excel
    • VBA AutoFit (Rows, Column, or the Entire Worksheet)
    • VBA ClearContents (from a Cell, Range, or Entire Worksheet)
    • VBA Copy Range to Another Sheet + Workbook
    • VBA Enter Value in a Cell (Set, Get and Change)
    • VBA Insert Column (Single and Multiple)
    • VBA Named Range | (Static + from Selection + Dynamic)
    • VBA Range Offset
    • VBA Sort Range | (Descending, Multiple Columns, Sort Orientation
    • VBA Wrap Text (Cell, Range, and Entire Worksheet)
    • VBA Check IF a Cell is Empty + Multiple Cells

    ⇠ Back to What is VBA in Excel

    Helpful Links – Developer Tab – Visual Basic Editor – Run a Macro – Personal Macro Workbook – Excel Macro Recorder – VBA Interview Questions – VBA Codes

    We use VBA to automate our tasks in excel. The idea of using VBA is to connect the interface of excel with the programming. One of the very most connections between them is by changing the cell values. The change in cell value by programming shows the power of VBA. In this article, we will see how to set, get and change the cell value. 

    Set Cell Value

    Assigning a cell with a value can be achieved by very two famous functions in VBA i.e. Range and Cells function. 

    Range Function in VBA

    The range function helps access the cells in the worksheet. To set the cell value using the range function, we use the .Value

    Syntax: Range(cell_name).Value = value_to_be_assinged. 

    Set the value to a single cell

    If you want to assign ’11’ to cell A1, then the following are the steps: 

    Step 1: Use the Range function, in the double quotes type the cell name. Use .Value object function. For example, Range(“A1”).Value = 11

    Applying-range-function

    Step 2: Run your macro. The number 11 appears in cell A1

    Running-macro

    Set the value to multiple cells at the same time

    Remember the days, when your teacher gives you punishment, by making you write the homework 10 times, those were the hard days, but now the effort has exponentially reduced. You can set a value to a range of cells with just one line of code. If you want to write your name, for example, “Arushi” 10 times, in the range A2 to A11. Use range function. Following are the steps: 

    Step 1: Use the Range function, in the double quotes, write “Start_of_cell: End_of_cell”. Use .Value object function. For example, Range(“A2:A11”).Value = “Arushi”

    Applying-range-function

    Step 2: Run your macro. The text “Arushi” appears from cell A2 to A11 inclusive. 

    Running-macro

    Cells Function in VBA

    The Cells function is similar to the range function and is also used to set the cell value in a worksheet by VBA. The difference lies in the fact that the Cells function can only set a single cell value at a time while the Range function can set multiple values at a time. Cells function use matrix coordinate system to access cell elements. For example, A1 can be written as (1, 1), B1 can be written as (1, 2), etc. 

    Syntax: Cells(row_number, column_number).Value = value_to_be_assign

    For example, you want to set the cell value to “Arushi cleared CA with Rank “, in cell B1. Also, set cell C1, to ‘1’. Following are the steps:

    Step 1: Open your VBA editor. Use cells function, as we want to access cell B1, the matrix coordinates will be (1, 2). Type, Cells(1, 2).Value = “Arushi cleared CA with Rank” in the VBA code. 

    Using-cell-functions

    Step 2: To access cell C1, the matrix coordinates are (1, 3). Type, Cells(1, 3).Value = 1 in the VBA code. 

    Accessing-cell-C1

    Step 3: Run your macro. The required text appears in cell B1, and a number appears in C1. 

    Running-macro

    Setting Cell values by Active cell and the input box

    There are other ways by which you can input your value in the cell in a worksheet. 

    Active Cell 

    You can set the cell value of a cell that is currently active. An active cell is the selected cell in which data is entered if you start typing. Use ActiveCell.Value object function to set the value either to text or to a number. 

    Syntax: ActiveCell.Value = value_to_be_assigned

    For example, you want to assign the active cell with a text i.e. “Arushi is practicing CA”, also want to change the color of the cell to yellow. Following are the steps: 

    Step 1: Use the ActiveCell object to access the currently selected cell in the worksheet. Use ActiveCell.Value function object to write the required text. 

    Using-active-cell-function

    Step 2: Color the cell by using ActiveCell.Interior.Color function. For example, use vbYellow to set your cell color to yellow. 

    Using-active.cell.interior.color-function

    Step 3: Run your macro. The currently selected cell i.e. B1 has attained the requirements. 

    Running-macro

    Input Box

    You can use the input box to set the cell value in a worksheet. The input box takes the custom value and stores the result. This result could further be used to set the value of the cell. For example, set the cell value of A1, dynamically by taking input, from the input box.

    Following are the steps

    Step 1: Open your VBA editor. A sub-procedure name geeks() is created. Use the Range function to store the value given by the input box. 

    Using-range-function

    Step 2: Run your Macro. A dialogue-box name Microsoft Excel appears. Enter the value to be stored. For example, “geeks for geeks”. Click Ok

    Entering-value-to-be-stored

    Step 3: Open your worksheet. In cell A1, you will find the required text is written. 

    Text-written-in-A1

    Get Cell Value

    After setting the cell value, it’s very important to have a handsome knowledge of how to display the cell value. There can be two ways two get the cell value either print the value in the console or create a message box. 

    Print Cell Value in Console

    The console of the VBA editor is the immediate window. The immediate window prints the desired result in the VBA editor itself. The cell value can be stored in a variable and then printed in the immediate window. For example, you are given a cell A1 with the value ’11’, and you need to print this value in the immediate window. 

    Following are the steps

    Step 1: Press Ctrl + G to open the immediate window. 

    Opening-immediate-window

    Step 2: The cell value in A1 is 1

    Value-in-A1

    Step 3: Open your VBA editor. Declare a variable that could store the cell value. For example, Val is the variable that stores the cell value in A1. Use the Range function to access the cell value. After storing the cell value in the val, print the variable in the immediate window with the help of Debug.Print(val) function.

    Printing-variable-in-immediate-window

    Step 4: Run your macro. The cell value in A1 is printed in the immediate window. 

    Running-macro

    Print Cell Value in a Message Box 

    A message box can also be used to show the cell value in VBA. For example, a random string is given in cell A1 of your string i.e. “Arushi studies in Hansraj”. Now, if you want to display the cell value in A1, we can use Message Box to achieve this. 

    Text-present-in-A1

    Following are the steps

    Step 1: Open your VBA macro. Create a message box by using MsgBox. Use the Range(cell).Value function to access the cell value. 

    Creating-a-message-box

    Step 2: Run your macro. A message box appears, which contains the cell value of A1

    Running-macro

    Change Cell Values 

    The value, once assigned to the cell value, can be changed. Cell values are like variables whose values can be changed any number of times. Either you can simply reassign the cell value or you can use different comparators to change the cell value according to a condition. 

    By reassigning the Cell Value

    You can change the cell value by reassigning it. In the below example, the value of cell A1 is initially set to 1, but later it is reassigned to 2

    Following are the steps

    Step 1: Open your VBA code editor. Initially, the value of cell A1 is assigned to 1. This initial value is printed in the immediate window. After that, we changed the value of cell A1 to 2. Now, if we print the A1 value in the immediate window, it comes out to be 2

    Changing-value-in-cell

    Step 2: The immediate window shows the output as 1 and 2. 

    Immediate-window-shows-output

    Changing cell value with some condition

    We can use if-else or switch-case statements to change the cell value with some condition. For example, if your age is greater than 18 then you can drive else you cannot drive. You can output your message according to this condition. 

    Following are the steps

    Step 1: A code is written in the image below, which tells whether you are eligible for a driving license or not. If your age is greater than 18 then cell A1 will be assigned with the value, “You are eligible for the driving license”, else A1 will be assigned with “You are not eligible for driving license”. 

    Text-assigned-to-A1

    Step 2: Run your macro. An input box appears. Enter your age. For example, 19. 

    Running-macro

    Step 3: According to the age added the cell value will be assigned. 

    Cell-value-assigned

    • #2

    Your syntax is OK. I’ve tried all of your methods and can’t reproduce the error you are having. Try running through your macro using the F8 key and see where the disconnection occurs.

    • #3

    Sub SetVarFromCell()
    Dim FTW As Long

    FTW = Worksheets(«Sheet1»).Cells(12, «F»).Value
    MsgBox (FTW)
    End Sub

    • #4

    Your code work for me as well. I’m thinking you may not be accessing where you think you are. For example maybe you have several workbooks open.

    Any way try this:
    Select cell «F12» and run the following code : it might tell you something

    Sub SetVarFromCell()
    Dim FTW As Long

    MsgBox (ThisWorkbook.Name & » » & ActiveSheet.Name & » » & actviecell.Address)
    MsgBox (ActiveCell.Value)
    FTW = Worksheets(«Sheet1»).Cells(12, «F»).Value
    MsgBox (FTW)
    End Sub

    • #5

    Thanks for your help! Nimrod, your second post identified my problem — I had not been looking at the right worksheet. When I was testing I had multiple workbooks open and apparently at the time I was trying to run the simple macro, the active sheet was not the one with the 1234 in F12. As you who responded said, my code was working fine, but it was not pointing to the expected worksheet. Those are always sticky problems when the macro code is correct but some other factor is causing unexpected results. I will be more alert to that possibility in the future.
    Thanks again, Hector

    • #6

    Thanks for your help! Nimrod, your second post identified my problem — I had not been looking at the right worksheet. When I was testing I had multiple workbooks open and apparently at the time I was trying to run the simple macro, the active sheet was not the one with the 1234 in F12. As you who responded said, my code was working fine, but it was not pointing to the expected worksheet. Those are always sticky problems when the macro code is correct but some other factor is causing unexpected results. I will be more alert to that possibility in the future.
    Thanks again, Hector

    • #7

    I just came across this thread. Is it possible to do this same process but instead of returning a numeric answer to return the contents of a cell with letters (AA, fort example)?

    • #8

    lolol, I want to do the exact opposite of what is here. That is to store the value returned to a var from an inputbox(yadda, yadda, yadda) to the variable ASH. Then I want to dump the contents of ASH to a cell that will be part of a criteria range for a Filter..

    Is there a function of some sort that will do this or do I have to play a bit?

    • #9

    lolol, I want to do the exact opposite of what is here. That is to store the value returned to a var from an inputbox(yadda, yadda, yadda) to the variable ASH. Then I want to dump the contents of ASH to a cell that will be part of a criteria range for a Filter..

    Is there a function of some sort that will do this or do I have to play a bit?

    OK, got to play for a minute and it works. Thanks for the original idea!

    • #10

    Hello :)

    I found this topic and tried to apply it to the following piece of code, that automates e-mail sending:

    With Destwb
    .SaveAs TempFilePath & TempFileName & FileExtStr, FileFormat:=FileFormatNum
    On Error Resume Next
    With OutMail
    .to = Worksheets(«SETUP»).Cells(4, «C»).Value
    .CC = Worksheets(«SETUP»).Cells(5, «C»).Value
    .BCC = «»
    .Subject = Worksheets(«SETUP»).Cells(6, «C»).Value
    .Body = «My text to receipients»
    .Attachments.Add Destwb.FullName
    ‘.Send
    .Display
    End With
    On Error GoTo 0
    .Close savechanges:=False
    End With

    Simply speaking I have a worksheet called SETUP in which I want to configure e-mail addresses of all receipients without allowing user to touch VBA.
    For some reason I get no values assigned to OutMail.to , .cc & .Subject.

    .Send doesn’t work (since .to has no value, so I used .display for tests).
    When I do .display it shows no value.

    Would anyone have any idea what could have I missed here?

    I ran out of ideas…

    Thank you for your help,
    mesje

    Всё о работе с ячейками в Excel-VBA: обращение, перебор, удаление, вставка, скрытие, смена имени.

    Содержание:

    Table of Contents:

    • Что такое ячейка Excel?
    • Способы обращения к ячейкам
      • Выбор и активация
      • Получение и изменение значений ячеек
        • Ячейки открытой книги
        • Ячейки закрытой книги 
      • Перебор ячеек
      • Перебор в произвольном диапазоне
    • Свойства и методы ячеек
      • Имя ячейки
      • Адрес ячейки
      • Размеры ячейки
    • Запуск макроса активацией ячейки

    2 нюанса:

    1. Я почти везде стараюсь использовать ThisWorkbook (а не, например, ActiveWorkbook) для обращения к текущей книге, в которой написан этот код (считаю это наиболее безопасным для новичков способом обращения к книгам, чтобы случайно не внести изменения в другие книги). Для экспериментов можете вставлять этот код в модули, коды книги, либо листа, и он будет работать только в пределах этой книги. 
    2. Я использую английский эксель и у меня по стандарту листы называются Sheet1, Sheet2 и т.д. Если вы работаете в русском экселе, то замените Thisworkbook.Sheets(«Sheet1») на Thisworkbook.Sheets(«Лист1»). Если этого не сделать, то вы получите ошибку в связи с тем, что пытаетесь обратиться к несуществующему объекту. Можно также заменить на Thisworkbook.Sheets(1), но это менее безопасно.

    Что такое ячейка Excel?

    В большинстве мест пишут: «элемент, образованный пересечением столбца и строки». Это определение полезно для людей, которые не знакомы с понятием «таблица». Для того, чтобы понять чем на самом деле является ячейка Excel, необходимо заглянуть в объектную модель Excel. При этом определения объектов «ряд», «столбец» и «ячейка» будут отличаться в зависимости от того, как мы работаем с файлом.

    Объекты в Excel-VBA. Пока мы работаем в Excel без углубления в VBA определение ячейки как «пересечения» строк и столбцов нам вполне хватает, но если мы решаем как-то автоматизировать процесс в VBA, то о нём лучше забыть и просто воспринимать лист как «мешок» ячеек, с каждой из которых VBA позволяет работать как минимум тремя способами:

    1. по цифровым координатам (ряд, столбец),
    2. по адресам формата А1, B2 и т.д. (сценарий целесообразности данного способа обращения в VBA мне сложно представить)
    3. по уникальному имени (во втором и третьем вариантах мы будем иметь дело не совсем с ячейкой, а с объектом VBA range, который может состоять из одной или нескольких ячеек). Функции и методы объектов Cells и Range отличаются. Новичкам я бы порекомендовал работать с ячейками VBA только с помощью Cells и по их цифровым координатам и использовать Range только по необходимости.

    Все три способа обращения описаны далее

    Как это хранится на диске и как с этим работать вне Excel? С точки зрения хранения и обработки вне Excel и VBA. Сделать это можно, например, сменив расширение файла с .xls(x) на .zip и открыв этот архив.

    Пример содержимого файла Excel:

    Далее xl -> worksheets и мы видим файл листа

    Содержимое файла:

     То же, но более наглядно:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac xr xr2 xr3" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" xmlns:xr2="http://schemas.microsoft.com/office/spreadsheetml/2015/revision2" xmlns:xr3="http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" xr:uid="{00000000-0001-0000-0000-000000000000}">
    	<dimension ref="B2:F6"/>
    	<sheetViews>
    		<sheetView tabSelected="1" workbookViewId="0">
    			<selection activeCell="D12" sqref="D12"/>
    		</sheetView>
    	</sheetViews>
    	<sheetFormatPr defaultRowHeight="14.4" x14ac:dyDescent="0.3"/>
    	<sheetData>
    		<row r="2" spans="2:6" x14ac:dyDescent="0.3">
    			<c r="B2" t="s">
    				<v>0</v>
    			</c>
    		</row>
    		<row r="3" spans="2:6" x14ac:dyDescent="0.3">
    			<c r="C3" t="s">
    				<v>1</v>
    			</c>
    		</row>
    		<row r="4" spans="2:6" x14ac:dyDescent="0.3">
    			<c r="D4" t="s">
    				<v>2</v>
    			</c>
    		</row>
    		<row r="5" spans="2:6" x14ac:dyDescent="0.3">
    			<c r="E5" t="s">
    				<v>0</v></c>
    		</row>
    		<row r="6" spans="2:6" x14ac:dyDescent="0.3">
    			<c r="F6" t="s"><v>3</v>
    		</c></row>
    	</sheetData>
    	<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
    </worksheet>

    Как мы видим, в структуре объектной модели нет никаких «пересечений». Строго говоря рабочая книга — это архив структурированных данных в формате XML. При этом в каждую «строку» входит «столбец», и в нём в свою очередь прописан номер значения данного столбца, по которому оно подтягивается из другого XML файла при открытии книги для экономии места за счёт отсутствия повторяющихся значений. Почему это важно. Если мы захотим написать какой-то обработчик таких файлов, который будет напрямую редактировать данные в этих XML, то ориентироваться надо на такую модель и структуру данных. И правильное определение будет примерно таким: ячейка — это объект внутри столбца, который в свою очередь находится внутри строки в файле xml, в котором хранятся данные о содержимом листа.

    Способы обращения к ячейкам

    Выбор и активация

    Почти во всех случаях можно и стоит избегать использования методов Select и Activate. На это есть две причины:

    1. Это лишь имитация действий пользователя, которая замедляет выполнение программы. Работать с объектами книги можно напрямую без использования методов Select и Activate.
    2. Это усложняет код и может приводить к неожиданным последствиям. Каждый раз перед использованием Select необходимо помнить, какие ещё объекты были выбраны до этого и не забывать при необходимости снимать выбор. Либо, например, в случае использования метода Select в самом начале программы может быть выбрано два листа вместо одного потому что пользователь запустил программу, выбрав другой лист.

    Можно выбирать и активировать книги, листы, ячейки, фигуры, диаграммы, срезы, таблицы и т.д.

    Отменить выбор  ячеек можно методом Unselect:

    Selection.Unselect

    Отличие выбора от активации — активировать можно только один объект из раннее выбранных. Выбрать можно несколько объектов.

    Если вы записали и редактируете код макроса, то лучше всего заменить Select и Activate на конструкцию With … End With. Например, предположим, что мы записали вот такой макрос:

    Sub Macro1()
    ' Macro1 Macro
        Range("F4:F10,H6:H10").Select 'выбрали два несмежных диапазона зажав ctrl
        Range("H6").Activate          'показывает только то, что я начал выбирать второй диапазон с этой ячейки (она осталась белой). Это действие ни на что не влияет
        With Selection.Interior       
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .Color = 65535            'залили желтым цветом, нажав на кнопку заливки на верхней панели
            .TintAndShade = 0
            .PatternTintAndShade = 0
        End With
    End Sub

    Почему макрос записался таким неэффективным образом? Потому что в каждый момент времени (в каждой строке) программа не знает, что вы будете делать дальше. Поэтому в записи выбор ячеек и действия с ними — это два отдельных действия. Этот код лучше всего оптимизировать (особенно если вы хотите скопировать его внутрь какого-нибудь цикла, который должен будет исполняться много раз и перебирать много объектов). Например, так:

    Sub Macro11()
    '
    ' Macro1 Macro
        Range("F4:F10,H6:H10").Select '1. смотрим, что за объект выбран (что идёт до .Select)
        Range("H6").Activate
        With Selection.Interior       '2. понимаем, что у выбранного объекта есть свойство interior, с которым далее идёт работа
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .Color = 65535
            .TintAndShade = 0
            .PatternTintAndShade = 0
        End With
    End Sub
    
    
    
    Sub Optimized_Macro()
        With Range("F4:F10,H6:H10").Interior '3. переносим объект напрямую в конструкцию With вместо Selection
    ' ////// Здесь я для надёжности прописал бы ещё Thisworkbook.Sheet("ИмяЛиста") перед Range,
    ' ////// чтобы минимизировать риск любых случайных изменений других листов и книг
    ' ////// With Thisworkbook.Sheet("ИмяЛиста").Range("F4:F10,H6:H10").Interior
            .Pattern = xlSolid               '4. полностью копируем всё, что было записано рекордером внутрь блока with
            .PatternColorIndex = xlAutomatic
            .Color = 55555                   '5. здесь я поменял цвет на зеленый, чтобы было видно, работает ли код при поочерёдном запуске двух макросов
            .TintAndShade = 0
            .PatternTintAndShade = 0
        End With
    End Sub

    Пример сценария, когда использование Select и Activate оправдано:

    Допустим, мы хотим, чтобы во время исполнения программы мы одновременно изменяли несколько листов одним действием и пользователь видел какой-то определённый лист. Это можно сделать примерно так:

    Sub Select_Activate_is_OK()
    Thisworkbook.Worksheets(Array("Sheet1", "Sheet3")).Select 'Выбираем несколько листов по именам
    Thisworkbook.Worksheets("Sheet3").Activate 'Показываем пользователю третий лист
    'Далее все действия с выбранными ячейками через Select будут одновременно вносить изменения в оба выбранных листа
    
    'Допустим, что тут мы решили покрасить те же два диапазона:
    Range("F4:F10,H6:H10").Select
        Range("H6").Activate
        With Selection.Interior       
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .Color = 65535
            .TintAndShade = 0
            .PatternTintAndShade = 0
        End With
    
    End Sub

    Единственной причиной использовать этот код по моему мнению может быть желание зачем-то показать пользователю определённую страницу книги в какой-то момент исполнения программы. С точки зрения обработки объектов, опять же, эти действия лишние.

    Получение и изменение значений ячеек

    Значение ячеек можно получать/изменять с помощью свойства value. 

    'Если нужно прочитать / записать значение ячейки, то используется свойство Value
    a = ThisWorkbook.Sheets("Sheet1").Cells (1,1).Value 'записать значение ячейки А1 листа "Sheet1" в переменную "a"
    ThisWorkbook.Sheets("Sheet1").Cells (1,1).Value = 1  'задать значение ячейки А1 (первый ряд, первый столбец) листа "Sheet1"
    
    'Если нужно прочитать текст как есть (с форматированием), то можно использовать свойство .text:
    ThisWorkbook.Sheets("Sheet1").Cells (1,1).Text = "1" 
    a = ThisWorkbook.Sheets("Sheet1").Cells (1,1).Text
    
    'Когда проявится разница:
    'Например, если мы считываем дату в формате "31 декабря 2021 г.", хранящуюся как дата
    a = ThisWorkbook.Sheets("Sheet1").Cells (1,1).Value 'эапишет как "31.12.2021"
    a = ThisWorkbook.Sheets("Sheet1").Cells (1,1).Text  'запишет как "31 декабря 2021 г."

    Ячейки открытой книги

    К ячейкам можно обращаться:

    'В книге, в которой хранится макрос (на каком-то из листов, либо в отдельном модуле или форме)
    ThisWorkbook.Sheets("Sheet1").Cells(1,1).Value        'По номерам строки и столбца
    ThisWorkbook.Sheets("Sheet1").Cells(1,"A").Value      'По номерам строки и букве столбца
    ThisWorkbook.Sheets("Sheet1").Range("A1").Value       'По адресу - вариант 1
    ThisWorkbook.Sheets("Sheet1").[A1].Value              'По адресу - вариант 2
    ThisWorkbook.Sheets("Sheet1").Range("CellName").Value 'По имени ячейки (для этого ей предварительно нужно его присвоить)
    
    'Те же действия, но с использованием полного названия рабочей книги (книга должна быть открыта)
    Workbooks("workbook.xlsm").Sheets("Sheet1").Cells(1,1).Value 'По номерам строки и столбца
    Workbooks("workbook.xlsm").Sheets("Sheet1").Cells(1,"A").Value                'По номерам строки и букве столбца
    Workbooks("workbook.xlsm").Sheets("Sheet1").Range("A1").Value                 'По адресу - вариант 1
    Workbooks("workbook.xlsm").Sheets("Sheet1").[A1].Value                        'По адресу - вариант 2
    Workbooks("workbook.xlsm").Sheets("Sheet1").Range("CellName").Value           'По имени ячейки (для этого ей предварительно нужно его присвоить)
    

    Ячейки закрытой книги

    Если нужно достать или изменить данные в другой закрытой книге, то необходимо прописать открытие и закрытие книги. Непосредственно работать с закрытой книгой не получится, потому что данные в ней хранятся отдельно от структуры и при открытии Excel каждый раз производит расстановку значений по соответствующим «слотам» в структуре. Подробнее о том, как хранятся данные в xlsx см выше.

    Workbooks.Open Filename:="С:closed_workbook.xlsx"    'открыть книгу (она становится активной)
    a = ActiveWorkbook.Sheets("Sheet1").Cells(1,1).Value  'достать значение ячейки 1,1
    ActiveWorkbook.Close False                            'закрыть книгу (False => без сохранения)

    Скачать пример, в котором можно посмотреть, как доставать и как записывать значения в закрытую книгу. 

    Код из файла:

    Option Explicit
    Sub get_value_from_closed_wb() 'достать значение из закрытой книги
    Dim a, wb_path, wsh As String
    wb_path = ThisWorkbook.Sheets("Sheet1").Cells(2, 3).Value 'get path to workbook from sheet1
    wsh = ThisWorkbook.Sheets("Sheet1").Cells(3, 3).Value
    Workbooks.Open Filename:=wb_path
    a = ActiveWorkbook.Sheets(wsh).Cells(3, 3).Value
    ActiveWorkbook.Close False
    ThisWorkbook.Sheets("Sheet1").Cells(4, 3).Value = a
    End Sub
    
    Sub record_value_to_closed_wb() 'записать значение в закрытую книгу
    Dim wb_path, b, wsh As String
    wsh = ThisWorkbook.Sheets("Sheet1").Cells(3, 3).Value
    wb_path = ThisWorkbook.Sheets("Sheet1").Cells(2, 3).Value 'get path to workbook from sheet1
    b = ThisWorkbook.Sheets("Sheet1").Cells(5, 3).Value 'get value to record in the target workbook
    Workbooks.Open Filename:=wb_path
    ActiveWorkbook.Sheets(wsh).Cells(4, 4).Value = b 'add new value to cell D4 of the target workbook
    ActiveWorkbook.Close True
    End Sub

    Перебор ячеек

    Перебор в произвольном диапазоне

    Скачать файл со всеми примерами

    Пройтись по всем ячейкам в нужном диапазоне можно разными способами. Основные:

    1. Цикл For Each. Пример:
      Sub iterate_over_cells()
      
      For Each c In ThisWorkbook.Sheets("Sheet1").Range("B2:D4").Cells
      MsgBox (c)
      Next c
      
      End Sub​

      Этот цикл выведет в виде сообщений значения ячеек в диапазоне B2:D4 по порядку по строкам слева направо и по столбцам — сверху вниз. Данный способ можно использовать для действий, в который вам не важны номера ячеек (закрашивание, изменение форматирования, пересчёт чего-то и т.д.).

    2. Ту же задачу можно решить с помощью двух вложенных циклов — внешний будет перебирать ряды, а вложенный — ячейки в рядах. Этот способ я использую чаще всего, потому что он позволяет получить больше контроля над исполнением: на каждой итерации цикла нам доступны координаты ячеек. Для перебора всех ячеек на листе этим методом потребуется найти последнюю заполненную ячейку. Пример кода:
      Sub iterate_over_cells()
      
      Dim cl, rw As Integer
      Dim x As Variant
      
      'перебор области 3x3
      For rw = 1 To 3 ' цикл для перебора рядов 1-3
      
          For cl = 1 To 3 'цикл для перебора столбцов 1-3
              x = ThisWorkbook.Sheets("Sheet1").Cells(rw + 1, cl + 1).Value
              MsgBox (x)
          Next cl
      Next rw
      
      
      
      'перебор всех ячеек на листе. Последняя ячейка определена с помощью UsedRange
      'LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
      'LastCol = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1
      'For rw = 1 To LastRow 'цикл перебора всех рядов
      '    For cl = 1 To LastCol 'цикл для перебора всех столбцов
      '        Действия 
      '    Next cl
      'Next rw
      
      
      End Sub​
    3. Если нужно перебрать все ячейки в выделенном диапазоне на активном листе, то код будет выглядеть так:
      Sub iterate_cell_by_cell_over_selection()
          Dim ActSheet As Worksheet
          Dim SelRange As Range
          Dim cell As Range
          
       
          Set ActSheet = ActiveSheet
          Set SelRange = Selection
          
          'if we want to do it in every cell of the selected range
          For Each cell In Selection
          MsgBox (cell.Value)
          
          Next cell
      
      End Sub​

      Данный метод подходит для интерактивных макросов, которые выполняют действия над выбранными пользователем областями.

    4. Перебор ячеек в ряду
      Sub iterate_cells_in_row()
          Dim i, RowNum, StartCell As Long
          
          RowNum = 3 'какой ряд
          StartCell = 0 ' номер начальной ячейки (минус 1, т.к. в цикле мы прибавляем i)
          
          For i = 1 To 10 ' 10 ячеек в выбранном ряду
          ThisWorkbook.Sheets("Sheet1").Cells(RowNum, i + StartCell).Value = i '(i + StartCell) добавляет 1 к номеру столбца при каждом повторении
          Next i
      
      End Sub
    5. Перебор ячеек в столбце
      Sub iterate_cells_in_column()
          Dim i, ColNum, StartCell As Long
          
          ColNum = 3 'какой столбец
          StartCell = 0 ' номер начальной ячейки (минус 1, т.к. в цикле мы прибавляем i)
          
          For i = 1 To 10 ' 10 ячеек
          ThisWorkbook.Sheets("Sheet1").Cells(i + StartCell, ColNum).Value = i ' (i + StartCell) добавляет 1 к номеру ряда при каждом повторении
          Next i
      
      End Sub​

    Свойства и методы ячеек

    Имя ячейки

    Присвоить новое имя можно так:

    Thisworkbook.Sheets(1).Cells(1,1).name = "Новое_Имя"

    Для того, чтобы сменить имя ячейки нужно сначала удалить существующее имя, а затем присвоить новое. Удалить имя можно так:

    ActiveWorkbook.Names("Старое_Имя").Delete

    Пример кода для переименования ячеек:

    Sub rename_cell()
    
    old_name = "Cell_Old_Name"
    new_name = "Cell_New_Name"
    
    ActiveWorkbook.Names(old_name).Delete
    ThisWorkbook.Sheets(1).Cells(2, 1).Name = new_name
    End Sub
    
    Sub rename_cell_reverse()
    
    old_name = "Cell_New_Name"
    new_name = "Cell_Old_Name"
    
    ActiveWorkbook.Names(old_name).Delete
    ThisWorkbook.Sheets(1).Cells(2, 1).Name = new_name
    End Sub

    Адрес ячейки

    Sub get_cell_address() ' вывести адрес ячейки в формате буква столбца, номер ряда
      '$A$1 style
      txt_address = ThisWorkbook.Sheets(1).Cells(3, 2).Address
      MsgBox (txt_address)
    End Sub
    
    Sub get_cell_address_R1C1()' получить адрес столбца в формате номер ряда, номер столбца
      'R1C1 style
      txt_address = ThisWorkbook.Sheets(1).Cells(3, 2).Address(ReferenceStyle:=xlR1C1)
      MsgBox (txt_address)
    End Sub
    
      'пример функции, которая принимает 2 аргумента: название именованного диапазона и тип желаемого адреса 
      '(1- тип $A$1 2- R1C1 - номер ряда, столбца)
    Function get_cell_address_by_name(str As String, address_type As Integer)
      '$A$1 style
      Select Case address_type
        Case 1
          txt_address = Range(str).Address
        Case 2
          txt_address = Range(str).Address(ReferenceStyle:=xlR1C1)
        Case Else
          txt_address = "Wrong address type selected. 1,2 available"
        End Select
      get_cell_address_by_name = txt_address
    End Function
    
    'перед запуском нужно убедиться, что в книге есть диапазон с названием, 
    'адрес которого мы хотим получить, иначе будет ошибка
    Sub test_function() 'запустите эту программу, чтобы увидеть, как работает функция
      x = get_cell_address_by_name("MyValue", 2)
      MsgBox (x)
    End Sub

    Размеры ячейки

    Ширина и длина ячейки в VBA меняется, например, так:

    Sub change_size()
    Dim x, y As Integer
    Dim w, h As Double
    
    'получить координаты целевой ячейки
    x = ThisWorkbook.Sheets("Sheet1").Cells(2, 2).Value
    y = ThisWorkbook.Sheets("Sheet1").Cells(3, 2).Value
    
    'получить желаемую ширину и высоту ячейки
    w = ThisWorkbook.Sheets("Sheet1").Cells(6, 2).Value
    h = ThisWorkbook.Sheets("Sheet1").Cells(7, 2).Value
    
    'сменить высоту и ширину ячейки с координатами x,y
    ThisWorkbook.Sheets("Sheet1").Cells(x, y).RowHeight = h
    ThisWorkbook.Sheets("Sheet1").Cells(x, y).ColumnWidth = w
    
    
    End Sub

    Прочитать значения ширины и высоты ячеек можно двумя способами (однако результаты будут в разных единицах измерения). Если написать просто Cells(x,y).Width или Cells(x,y).Height, то будет получен результат в pt (привязка к размеру шрифта). 

    Sub get_size()
    Dim x, y As Integer
    'получить координаты ячейки, с которой мы будем работать
    x = ThisWorkbook.Sheets("Sheet1").Cells(2, 2).Value
    y = ThisWorkbook.Sheets("Sheet1").Cells(3, 2).Value
    
    'получить длину и ширину выбранной ячейки в тех же единицах измерения, в которых мы их задавали
    ThisWorkbook.Sheets("Sheet1").Cells(2, 6).Value = ThisWorkbook.Sheets("Sheet1").Cells(x, y).ColumnWidth
    ThisWorkbook.Sheets("Sheet1").Cells(3, 6).Value = ThisWorkbook.Sheets("Sheet1").Cells(x, y).RowHeight
    
    'получить длину и ширину с помощью свойств ячейки (только для чтения) в поинтах (pt)
    ThisWorkbook.Sheets("Sheet1").Cells(7, 9).Value = ThisWorkbook.Sheets("Sheet1").Cells(x, y).Width
    ThisWorkbook.Sheets("Sheet1").Cells(8, 9).Value = ThisWorkbook.Sheets("Sheet1").Cells(x, y).Height
    
    End Sub

    Скачать файл с примерами изменения и чтения размера ячеек

    Запуск макроса активацией ячейки

    Для запуска кода VBA при активации ячейки необходимо вставить в код листа нечто подобное:

    3 важных момента, чтобы это работало:

    1. Этот код должен быть вставлен в код листа (здесь контролируется диапазон D4)

    2-3. Программа, ответственная за запуск кода при выборе ячейки, должна называться Worksheet_SelectionChange и должна принимать значение переменной Target, относящейся к триггеру SelectionChange. Другие доступные триггеры можно посмотреть в правом верхнем углу (2).

    Скачать файл с базовым примером (как на картинке)

    Скачать файл с расширенным примером (код ниже)

    Option Explicit
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
            ' имеем в виду, что триггер SelectionChange будет запускать эту Sub после каждого клика мышью (после каждого клика будет проверяться:
              '1. количество выделенных ячеек и 
              '2. не пересекается ли выбранный диапазон с заданным в этой программе диапазоном.
            ' поэтому в эту программу не стоит без необходимости писать никаких других тяжелых операций
    
        If Selection.Count = 1 Then 'запускаем программу только если выбрано не более 1 ячейки
    
    
        'вариант модификации - брать адрес ячейки из другой ячейки:
        'Dim CellName as String
        'CellName = Activesheet.Cells(1,1).value 'брать текстовое имя контролируемой ячейки из A1 (должно быть в формате Буква столбца + номер строки)
        'If Not Intersect(Range(CellName), Target) Is Nothing Then
        'для работы этой модификации следующую строку надо закомментировать/удалить
    
    
    
            If Not Intersect(Range("D4"), Target) Is Nothing Then 
            'если заданный (D4) и выбранный диапазон пересекаются 
            '(пересечение диапазонов НЕ равно Nothing)
    
            'можно прописать диапазон из нескольких ячеек:
            'If Not Intersect(Range("D4:E10"), Target) Is Nothing Then
            'можно прописать несколько диапазонов:
            'If Not Intersect(Range("D4:E10"), Target) Is Nothing or Not Intersect(Range("A4:A10"), Target) Is Nothing Then
    
                Call program 'выполняем программу
            End If
        End If
    End Sub
    
    Sub program()
    
    MsgBox ("Program Is running") 'здесь пишем код того, что произойдёт при выборе нужной ячейки
    
    
    End Sub
    

    Понравилась статья? Поделить с друзьями:
  • Set excel createobject excel application
  • Sequential numbering in word
  • Set dictionary on word
  • Sequence numbers in word
  • Set defaults in excel