When build expressions for If Statements, you can also use any function that generates TRUE or False. VBA has a few of these functions:
Function | Description |
---|---|
IsDate | Returns TRUE if expression is a valid date |
IsEmpty | Check for blank cells or undefined variables |
IsError | Check for error values |
IsNull | Check for NULL Value |
IsNumeric | Check for numeric value |
They can be called like this:
Excel also has many additional functions that can be called using WorksheetFunction. Here’s an example of the Excel IsText Function:
You can also create your own User Defined Functions (UDFs). Below we will create a simple Boolean function that returns TRUE. Then we will call that function in our If statement:
Comparing Text
You can also compare text similar to comparing numbers:
When comparing text, you must be mindful of the “Case” (upper or lower). By default, VBA considers letters with different cases as non-matching. In other words, “A” <> “a”.
If you’d like VBA to ignore case, you must add the Option Compare Text declaration to the top of your module:
After making that declaration “A” = “a”:
VBA If Like
The VBA Like Operator allows you to make inexact comparisons of text. Click the “Like Operator” link to learn more, but we will show a basic example below:
Here we’re using an asterisk “*” wildcard. The * stands for any number of any characters. So the above If statement will return TRUE. The Like operator is an extremely powerful, but often under-used tool for dealing with text.
If Loops
VBA Loops allow you to repeat actions. Combining IF-ELSEs with Loops is a great way to quickly process many calculations.
Continuing with our Positive / Negative example, we will add a For Each Loop to loop through a range of cells:
If Else Examples
Now we will go over some more specific examples.
Check if Cell is Empty
This code will check if a cell is empty. If it’s empty it will ignore the cell. If it’s not empty it will output the cell value to the cell to the right:
Check if Cell Contains Specific Text
The Instr Function tests if a string of text is found in another string. Use it with an If statement to check if a cell contains specific text:
Check if cell contains text
This code will test if a cell is text:
If Goto
You can use the result of an If statement to “Go to” another section of code.
Delete Row if Cell is Blank
If MessageBox Yes / No
With VBA Message Boxes you’re able to ask the user to select from several options. The Yes/No Message Box asks the user to select Yes or No. You can add a Yes / No Message Box to a procedure to ask the user if they would like to continue running the procedure or not. You handle the user’s input using an If statement.
Here is the Yes/No Message Box in practice:
VBA If, ElseIf, Else in Access VBA
The If, ElseIf and Else functions work exactly the same in Access VBA as in Excel VBA.
You can use an If statement to check if there are records in a Recordset.
VBA Code Examples Add-in
Easily access all of the code examples found on our site.
Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.
Источник
Cell ends with
Summary
To test if a cell ends with specific text, you can use a formula based on the RIGHT function. In the example shown, the formula in cell D5, copied down, is:
This formula returns TRUE when the value in column B ends with «jwb» and FALSE if not. Note that this formula is not case-sensitive. See below for a case-sensitive alternative.
Generic formula
Explanation
In this example, the goal is to test values in column B to see if they end with a specific text string, which is «jwb» in the worksheet shown. This problem can be solved with the RIGHT function, as explained below.
RIGHT function
The RIGHT function extracts a given number of characters from the right side of a text string. For example, the formula below returns the last three letters of «apple», which is «ple»:
This means we can use the RIGHT function to test if cell B5 e nds with «jwb» like this:
The RIGHT function extracts the last 3 characters in cell B5 and the result is compared to the string «jwb», forcing a TRUE or FALSE result. The formula is solved like this:
For cell B5 the result is FALSE, since «ABC-1224-HNN» does not end with «jwb». In cell B6, however, the result is TRUE, since «XYZ-6543-JWB» does end with «jwb».
Note that Excel is not case-sensitive by default, so «JWB»=»jwb» will return TRUE in a formula. Also note the num_chars argument is set to 3 above because we want to work with the last 3 letters in the cell only. However, this value needs to be modified to suit the situation. For example, to test for a value that ends with «apple», num_chars should be set to 5:
Case-sensitive option
Excel is not case-sensitive by default, but you can easily adapt the formula to use the EXACT function to make the formula case-sensitive like this:
EXACT takes two arguments, text1 and text2. EXACT will only return TRUE when text1 and text2 are exactly the same, taking into account case. For example:
Turning back to cell B6 in the worksheet shown, the two formulas below return different results:
The first formula returns FALSE because the EXACT function is case-sensitive, so «JWB» does not equal «jwb». The second formula returns TRUE because «JWB» does equal «JWB» taking into account case. Note that we don’t need the equal to operator (=) in this formula because EXACT performs a comparison automatically.
If cell ends with
To adapt the formulas above to «If cell ends with», simply drop the formulas into the IF function as the logical test. For example, to return «Yes» when a cell ends with «jwb» and «No» when not, you can use a formula like this
The case-sensitive version of the formula works the same way:
Other functions
It is worth noting that Excel contains two other functions, the SEARCH function and the FIND function that are meant to look for a substring in a text value. They could be used to solve this problem, but they are more work to configure, so I don’t see any advantage to using them. You could however use the COUNTIF function with a wildcard to solve this problem like this:
This works fine, but keep in mind that COUNTIF is in a group of eight *IFS functions that won’t accept an array for the range argument. This means you can’t use COUNTIF to test values in an array returned by another operation. I don’t like this limitation, so I avoid the *IFS functions when there is a good alternative.
Источник
Adblock
detector
In this example, the goal is to test values in column B to see if they end with a specific text string, which is «jwb» in the worksheet shown. This problem can be solved with the RIGHT function, as explained below.
RIGHT function
The RIGHT function extracts a given number of characters from the right side of a text string. For example, the formula below returns the last three letters of «apple», which is «ple»:
=RIGHT("apple",3) // returns "ple"
This means we can use the RIGHT function to test if cell B5 ends with «jwb» like this:
=RIGHT(B5,3)="jwb"
The RIGHT function extracts the last 3 characters in cell B5 and the result is compared to the string «jwb», forcing a TRUE or FALSE result. The formula is solved like this:
=RIGHT(B5,3)="jwb"
=RIGHT("ABC-1224-HNN",3)="jwb"
="HNN"="jwb"
=FALSE
For cell B5 the result is FALSE, since «ABC-1224-HNN» does not end with «jwb». In cell B6, however, the result is TRUE, since «XYZ-6543-JWB» does end with «jwb».
=RIGHT(B6,3)="jwb"
=RIGHT("XYZ-6543-JWB",3)="jwb"
="XYZ"="jwb"
=TRUE
Note that Excel is not case-sensitive by default, so «JWB»=»jwb» will return TRUE in a formula. Also note the num_chars argument is set to 3 above because we want to work with the last 3 letters in the cell only. However, this value needs to be modified to suit the situation. For example, to test for a value that ends with «apple», num_chars should be set to 5:
=RIGHT(B5,5)="apple"
Case-sensitive option
Excel is not case-sensitive by default, but you can easily adapt the formula to use the EXACT function to make the formula case-sensitive like this:
=EXACT(RIGHT(B5,3),"JWB")
EXACT takes two arguments, text1 and text2. EXACT will only return TRUE when text1 and text2 are exactly the same, taking into account case. For example:
=EXACT("abc","ABC") // returns FALSE
=EXACT("abc","Abc") // returns FALSE
=EXACT("abc","abc") // returns TRUE
Turning back to cell B6 in the worksheet shown, the two formulas below return different results:
=EXACT(RIGHT(B6,3),"jwb")// returns FALSE
=EXACT(RIGHT(B6,3),"JWB") // returns TRUE
The first formula returns FALSE because the EXACT function is case-sensitive, so «JWB» does not equal «jwb». The second formula returns TRUE because «JWB» does equal «JWB» taking into account case. Note that we don’t need the equal to operator (=) in this formula because EXACT performs a comparison automatically.
If cell ends with
To adapt the formulas above to «If cell ends with», simply drop the formulas into the IF function as the logical test. For example, to return «Yes» when a cell ends with «jwb» and «No» when not, you can use a formula like this
=IF(RIGHT(B5,3)="jwb", "Yes", "No")
The case-sensitive version of the formula works the same way:
=IF(EXACT(RIGHT(B5,3),"JWB"), "Yes", "No")
Other functions
It is worth noting that Excel contains two other functions, the SEARCH function and the FIND function that are meant to look for a substring in a text value. They could be used to solve this problem, but they are more work to configure, so I don’t see any advantage to using them. You could however use the COUNTIF function with a wildcard to solve this problem like this:
=COUNTIF(B5,"*jwb")<>0
This works fine, but keep in mind that COUNTIF is in a group of eight *IFS functions that won’t accept an array for the range argument. This means you can’t use COUNTIF to test values in an array returned by another operation. I don’t like this limitation, so I avoid the *IFS functions when there is a good alternative.
This tutorial will demonstrate how to highlight cells that begin or end with certain text using Conditional Formatting in Excel and Google Sheets.
Highlight Cells that Begin With or End With
You can highlight cells where the value in the cell either begins or ends with certain text by creating a Conditional Formatting rule.
- Select the range you want to apply formatting to.
- In the Ribbon, select Home > Conditional Formatting > New Rule.
- Select Use a formula to determine which cells to format, and enter the following COUNTIF formula:
=COUNTIF(B4, "La*")
This will find out if the text starts with La—.
- Alternatively, to find out if the text in a cell ends with certain text, type in the formula:
=COUNTIF(B4, "*ke")
- Click on the Format button and select your desired formatting.
- Click OK, then OK again to return to the Conditional Formatting Rules Manager.
- Click Apply to apply the formatting to your selected range and then click Close.
Highlight Cells That Begin or End With – Google Sheets
The process to highlight cells where the value in the cell either begins or ends with certain text in Google sheets is like the process in Excel.
- Highlight the cells you wish to format, and then click on Format > Conditional Formatting.
- The Apply to Range section will already be filled in.
- From the Format Rules section, select Custom Formula from the drop-down list and type in the following formula to look for text at the beginning of your cell.
=COUNTIF(B4, "La*")
- Alternatively type in this formula to look for text at the end of your cell.
=COUNTIF(B4, "*ke")
- Select the fill style for the cells that meet the criteria.
- Click Done to apply the rule.
На чтение 18 мин. Просмотров 74.7k.
сэр Артур Конан Дойл
Это большая ошибка — теоретизировать, прежде чем кто-то получит данные
Эта статья охватывает все, что вам нужно знать об использовании ячеек и диапазонов в VBA. Вы можете прочитать его от начала до конца, так как он сложен в логическом порядке. Или использовать оглавление ниже, чтобы перейти к разделу по вашему выбору.
Рассматриваемые темы включают свойство смещения, чтение
значений между ячейками, чтение значений в массивы и форматирование ячеек.
Содержание
- Краткое руководство по диапазонам и клеткам
- Введение
- Важное замечание
- Свойство Range
- Свойство Cells рабочего листа
- Использование Cells и Range вместе
- Свойство Offset диапазона
- Использование диапазона CurrentRegion
- Использование Rows и Columns в качестве Ranges
- Использование Range вместо Worksheet
- Чтение значений из одной ячейки в другую
- Использование метода Range.Resize
- Чтение Value в переменные
- Как копировать и вставлять ячейки
- Чтение диапазона ячеек в массив
- Пройти через все клетки в диапазоне
- Форматирование ячеек
- Основные моменты
Краткое руководство по диапазонам и клеткам
Функция | Принимает | Возвращает | Пример | Вид |
Range | адреса ячеек |
диапазон ячеек |
.Range(«A1:A4») | $A$1:$A$4 |
Cells | строка, столбец |
одна ячейка |
.Cells(1,5) | $E$1 |
Offset | строка, столбец |
диапазон | .Range(«A1:A2») .Offset(1,2) |
$C$2:$C$3 |
Rows | строка (-и) | одна или несколько строк |
.Rows(4) .Rows(«2:4») |
$4:$4 $2:$4 |
Columns | столбец (-цы) |
один или несколько столбцов |
.Columns(4) .Columns(«B:D») |
$D:$D $B:$D |
Введение
Это третья статья, посвященная трем основным элементам VBA. Этими тремя элементами являются Workbooks, Worksheets и Ranges/Cells. Cells, безусловно, самая важная часть Excel. Почти все, что вы делаете в Excel, начинается и заканчивается ячейками.
Вы делаете три основных вещи с помощью ячеек:
- Читаете из ячейки.
- Пишите в ячейку.
- Изменяете формат ячейки.
В Excel есть несколько методов для доступа к ячейкам, таких как Range, Cells и Offset. Можно запутаться, так как эти функции делают похожие операции.
В этой статье я расскажу о каждом из них, объясню, почему они вам нужны, и когда вам следует их использовать.
Давайте начнем с самого простого метода доступа к ячейкам — с помощью свойства Range рабочего листа.
Важное замечание
Я недавно обновил эту статью, сейчас использую Value2.
Вам может быть интересно, в чем разница между Value, Value2 и значением по умолчанию:
' Value2 Range("A1").Value2 = 56 ' Value Range("A1").Value = 56 ' По умолчанию используется значение Range("A1") = 56
Использование Value может усечь число, если ячейка отформатирована, как валюта. Если вы не используете какое-либо свойство, по умолчанию используется Value.
Лучше использовать Value2, поскольку он всегда будет возвращать фактическое значение ячейки.
Свойство Range
Рабочий лист имеет свойство Range, которое можно использовать для доступа к ячейкам в VBA. Свойство Range принимает тот же аргумент, что и большинство функций Excel Worksheet, например: «А1», «А3: С6» и т.д.
В следующем примере показано, как поместить значение в ячейку с помощью свойства Range.
Sub ZapisVYacheiku() ' Запишите число в ячейку A1 на листе 1 этой книги ThisWorkbook.Worksheets("Лист1").Range("A1").Value2 = 67 ' Напишите текст в ячейку A2 на листе 1 этой рабочей книги ThisWorkbook.Worksheets("Лист1").Range("A2").Value2 = "Иван Петров" ' Запишите дату в ячейку A3 на листе 1 этой книги ThisWorkbook.Worksheets("Лист1").Range("A3").Value2 = #11/21/2019# End Sub
Как видно из кода, Range является членом Worksheets, которая, в свою очередь, является членом Workbook. Иерархия такая же, как и в Excel, поэтому должно быть легко понять. Чтобы сделать что-то с Range, вы должны сначала указать рабочую книгу и рабочий лист, которому она принадлежит.
В оставшейся части этой статьи я буду использовать кодовое имя для ссылки на лист.
Следующий код показывает приведенный выше пример с использованием кодового имени рабочего листа, т.е. Лист1 вместо ThisWorkbook.Worksheets («Лист1»).
Sub IspKodImya () ' Запишите число в ячейку A1 на листе 1 этой книги Sheet1.Range("A1").Value2 = 67 ' Напишите текст в ячейку A2 на листе 1 этой рабочей книги Sheet1.Range("A2").Value2 = "Иван Петров" ' Запишите дату в ячейку A3 на листе 1 этой книги Sheet1.Range("A3").Value2 = #11/21/2019# End Sub
Вы также можете писать в несколько ячеек, используя свойство
Range
Sub ZapisNeskol() ' Запишите число в диапазон ячеек Sheet1.Range("A1:A10").Value2 = 67 ' Написать текст в несколько диапазонов ячеек Sheet1.Range("B2:B5,B7:B9").Value2 = "Иван Петров" End Sub
Свойство Cells рабочего листа
У Объекта листа есть другое свойство, называемое Cells, которое очень похоже на Range . Есть два отличия:
- Cells возвращают диапазон только одной ячейки.
- Cells принимает строку и столбец в качестве аргументов.
В приведенном ниже примере показано, как записывать значения
в ячейки, используя свойства Range и Cells.
Sub IspCells() ' Написать в А1 Sheet1.Range("A1").Value2 = 10 Sheet1.Cells(1, 1).Value2 = 10 ' Написать в А10 Sheet1.Range("A10").Value2 = 10 Sheet1.Cells(10, 1).Value2 = 10 ' Написать в E1 Sheet1.Range("E1").Value2 = 10 Sheet1.Cells(1, 5).Value2 = 10 End Sub
Вам должно быть интересно, когда использовать Cells, а когда Range. Использование Range полезно для доступа к одним и тем же ячейкам при каждом запуске макроса.
Например, если вы использовали макрос для вычисления суммы и
каждый раз записывали ее в ячейку A10, тогда Range подойдет для этой задачи.
Использование свойства Cells полезно, если вы обращаетесь к
ячейке по номеру, который может отличаться. Проще объяснить это на примере.
В следующем коде мы просим пользователя указать номер столбца. Использование Cells дает нам возможность использовать переменное число для столбца.
Sub ZapisVPervuyuPustuyuYacheiku() Dim UserCol As Integer ' Получить номер столбца от пользователя UserCol = Application.InputBox("Пожалуйста, введите номер столбца...", Type:=1) ' Написать текст в выбранный пользователем столбец Sheet1.Cells(1, UserCol).Value2 = "Иван Петров" End Sub
В приведенном выше примере мы используем номер для столбца,
а не букву.
Чтобы использовать Range здесь, потребуется преобразовать эти значения в ссылку на
буквенно-цифровую ячейку, например, «С1». Использование свойства Cells позволяет нам
предоставить строку и номер столбца для доступа к ячейке.
Иногда вам может понадобиться вернуть более одной ячейки, используя номера строк и столбцов. В следующем разделе показано, как это сделать.
Использование Cells и Range вместе
Как вы уже видели, вы можете получить доступ только к одной ячейке, используя свойство Cells. Если вы хотите вернуть диапазон ячеек, вы можете использовать Cells с Range следующим образом:
Sub IspCellsSRange() With Sheet1 ' Запишите 5 в диапазон A1: A10, используя свойство Cells .Range(.Cells(1, 1), .Cells(10, 1)).Value2 = 5 ' Диапазон B1: Z1 будет выделен жирным шрифтом .Range(.Cells(1, 2), .Cells(1, 26)).Font.Bold = True End With End Sub
Как видите, вы предоставляете начальную и конечную ячейку
диапазона. Иногда бывает сложно увидеть, с каким диапазоном вы имеете дело,
когда значением являются все числа. Range имеет свойство Address, которое
отображает буквенно-цифровую ячейку для любого диапазона. Это может
пригодиться, когда вы впервые отлаживаете или пишете код.
В следующем примере мы распечатываем адрес используемых нами
диапазонов.
Sub PokazatAdresDiapazona() ' Примечание. Использование подчеркивания позволяет разделить строки кода. With Sheet1 ' Запишите 5 в диапазон A1: A10, используя свойство Cells .Range(.Cells(1, 1), .Cells(10, 1)).Value2 = 5 Debug.Print "Первый адрес: " _ + .Range(.Cells(1, 1), .Cells(10, 1)).Address ' Диапазон B1: Z1 будет выделен жирным шрифтом .Range(.Cells(1, 2), .Cells(1, 26)).Font.Bold = True Debug.Print "Второй адрес : " _ + .Range(.Cells(1, 2), .Cells(1, 26)).Address End With End Sub
В примере я использовал Debug.Print для печати в Immediate Window. Для просмотра этого окна выберите «View» -> «в Immediate Window» (Ctrl + G).
Свойство Offset диапазона
У диапазона есть свойство, которое называется Offset. Термин «Offset» относится к отсчету от исходной позиции. Он часто используется в определенных областях программирования. С помощью свойства «Offset» вы можете получить диапазон ячеек того же размера и на определенном расстоянии от текущего диапазона. Это полезно, потому что иногда вы можете выбрать диапазон на основе определенного условия. Например, на скриншоте ниже есть столбец для каждого дня недели. Учитывая номер дня (т.е. понедельник = 1, вторник = 2 и т.д.). Нам нужно записать значение в правильный столбец.
Сначала мы попытаемся сделать это без использования Offset.
' Это Sub тесты с разными значениями Sub TestSelect() ' Понедельник SetValueSelect 1, 111.21 ' Среда SetValueSelect 3, 456.99 ' Пятница SetValueSelect 5, 432.25 ' Воскресение SetValueSelect 7, 710.17 End Sub ' Записывает значение в столбец на основе дня Public Sub SetValueSelect(lDay As Long, lValue As Currency) Select Case lDay Case 1: Sheet1.Range("H3").Value2 = lValue Case 2: Sheet1.Range("I3").Value2 = lValue Case 3: Sheet1.Range("J3").Value2 = lValue Case 4: Sheet1.Range("K3").Value2 = lValue Case 5: Sheet1.Range("L3").Value2 = lValue Case 6: Sheet1.Range("M3").Value2 = lValue Case 7: Sheet1.Range("N3").Value2 = lValue End Select End Sub
Как видно из примера, нам нужно добавить строку для каждого возможного варианта. Это не идеальная ситуация. Использование свойства Offset обеспечивает более чистое решение.
' Это Sub тесты с разными значениями Sub TestOffset() DayOffSet 1, 111.01 DayOffSet 3, 456.99 DayOffSet 5, 432.25 DayOffSet 7, 710.17 End Sub Public Sub DayOffSet(lDay As Long, lValue As Currency) ' Мы используем значение дня с Offset, чтобы указать правильный столбец Sheet1.Range("G3").Offset(, lDay).Value2 = lValue End Sub
Как видите, это решение намного лучше. Если количество дней увеличилось, нам больше не нужно добавлять код. Чтобы Offset был полезен, должна быть какая-то связь между позициями ячеек. Если столбцы Day в приведенном выше примере были случайными, мы не могли бы использовать Offset. Мы должны были бы использовать первое решение.
Следует иметь в виду, что Offset сохраняет размер диапазона. Итак .Range («A1:A3»).Offset (1,1) возвращает диапазон B2:B4. Ниже приведены еще несколько примеров использования Offset.
Sub IspOffset() ' Запись в В2 - без Offset Sheet1.Range("B2").Offset().Value2 = "Ячейка B2" ' Написать в C2 - 1 столбец справа Sheet1.Range("B2").Offset(, 1).Value2 = "Ячейка C2" ' Написать в B3 - 1 строка вниз Sheet1.Range("B2").Offset(1).Value2 = "Ячейка B3" ' Запись в C3 - 1 столбец справа и 1 строка вниз Sheet1.Range("B2").Offset(1, 1).Value2 = "Ячейка C3" ' Написать в A1 - 1 столбец слева и 1 строка вверх Sheet1.Range("B2").Offset(-1, -1).Value2 = "Ячейка A1" ' Запись в диапазон E3: G13 - 1 столбец справа и 1 строка вниз Sheet1.Range("D2:F12").Offset(1, 1).Value2 = "Ячейки E3:G13" End Sub
Использование диапазона CurrentRegion
CurrentRegion возвращает диапазон всех соседних ячеек в данный диапазон. На скриншоте ниже вы можете увидеть два CurrentRegion. Я добавил границы, чтобы прояснить CurrentRegion.
Строка или столбец пустых ячеек означает конец CurrentRegion.
Вы можете вручную проверить
CurrentRegion в Excel, выбрав диапазон и нажав Ctrl + Shift + *.
Если мы возьмем любой диапазон
ячеек в пределах границы и применим CurrentRegion, мы вернем диапазон ячеек во
всей области.
Например:
Range («B3»). CurrentRegion вернет диапазон B3:D14
Range («D14»). CurrentRegion вернет диапазон B3:D14
Range («C8:C9»). CurrentRegion вернет диапазон B3:D14 и так далее
Как пользоваться
Мы получаем CurrentRegion следующим образом
' CurrentRegion вернет B3:D14 из приведенного выше примера Dim rg As Range Set rg = Sheet1.Range("B3").CurrentRegion
Только чтение строк данных
Прочитать диапазон из второй строки, т.е. пропустить строку заголовка.
' CurrentRegion вернет B3:D14 из приведенного выше примера Dim rg As Range Set rg = Sheet1.Range("B3").CurrentRegion ' Начало в строке 2 - строка после заголовка Dim i As Long For i = 2 To rg.Rows.Count ' текущая строка, столбец 1 диапазона Debug.Print rg.Cells(i, 1).Value2 Next i
Удалить заголовок
Удалить строку заголовка (т.е. первую строку) из диапазона. Например, если диапазон — A1:D4, это возвратит A2:D4
' CurrentRegion вернет B3:D14 из приведенного выше примера Dim rg As Range Set rg = Sheet1.Range("B3").CurrentRegion ' Удалить заголовок Set rg = rg.Resize(rg.Rows.Count - 1).Offset(1) ' Начните со строки 1, так как нет строки заголовка Dim i As Long For i = 1 To rg.Rows.Count ' текущая строка, столбец 1 диапазона Debug.Print rg.Cells(i, 1).Value2 Next i
Использование Rows и Columns в качестве Ranges
Если вы хотите что-то сделать со всей строкой или столбцом,
вы можете использовать свойство «Rows и
Columns» на рабочем листе. Они оба принимают один параметр — номер строки
или столбца, к которому вы хотите получить доступ.
Sub IspRowIColumns() ' Установите размер шрифта столбца B на 9 Sheet1.Columns(2).Font.Size = 9 ' Установите ширину столбцов от D до F Sheet1.Columns("D:F").ColumnWidth = 4 ' Установите размер шрифта строки 5 до 18 Sheet1.Rows(5).Font.Size = 18 End Sub
Использование Range вместо Worksheet
Вы также можете использовать Cella, Rows и Columns, как часть Range, а не как часть Worksheet. У вас может быть особая необходимость в этом, но в противном случае я бы избегал практики. Это делает код более сложным. Простой код — твой друг. Это уменьшает вероятность ошибок.
Код ниже выделит второй столбец диапазона полужирным. Поскольку диапазон имеет только две строки, весь столбец считается B1:B2
Sub IspColumnsVRange() ' Это выделит B1 и B2 жирным шрифтом. Sheet1.Range("A1:C2").Columns(2).Font.Bold = True End Sub
Чтение значений из одной ячейки в другую
В большинстве примеров мы записали значения в ячейку. Мы
делаем это, помещая диапазон слева от знака равенства и значение для размещения
в ячейке справа. Для записи данных из одной ячейки в другую мы делаем то же
самое. Диапазон назначения идет слева, а диапазон источника — справа.
В следующем примере показано, как это сделать:
Sub ChitatZnacheniya() ' Поместите значение из B1 в A1 Sheet1.Range("A1").Value2 = Sheet1.Range("B1").Value2 ' Поместите значение из B3 в лист2 в ячейку A1 Sheet1.Range("A1").Value2 = Sheet2.Range("B3").Value2 ' Поместите значение от B1 в ячейки A1 до A5 Sheet1.Range("A1:A5").Value2 = Sheet1.Range("B1").Value2 ' Вам необходимо использовать свойство «Value», чтобы прочитать несколько ячеек Sheet1.Range("A1:A5").Value2 = Sheet1.Range("B1:B5").Value2 End Sub
Как видно из этого примера, невозможно читать из нескольких ячеек. Если вы хотите сделать это, вы можете использовать функцию копирования Range с параметром Destination.
Sub KopirovatZnacheniya() ' Сохранить диапазон копирования в переменной Dim rgCopy As Range Set rgCopy = Sheet1.Range("B1:B5") ' Используйте это для копирования из более чем одной ячейки rgCopy.Copy Destination:=Sheet1.Range("A1:A5") ' Вы можете вставить в несколько мест назначения rgCopy.Copy Destination:=Sheet1.Range("A1:A5,C2:C6") End Sub
Функция Copy копирует все, включая формат ячеек. Это тот же результат, что и ручное копирование и вставка выделения. Подробнее об этом вы можете узнать в разделе «Копирование и вставка ячеек»
Использование метода Range.Resize
При копировании из одного диапазона в другой с использованием присваивания (т.е. знака равенства) диапазон назначения должен быть того же размера, что и исходный диапазон.
Использование функции Resize позволяет изменить размер
диапазона до заданного количества строк и столбцов.
Например:
Sub ResizePrimeri() ' Печатает А1 Debug.Print Sheet1.Range("A1").Address ' Печатает A1:A2 Debug.Print Sheet1.Range("A1").Resize(2, 1).Address ' Печатает A1:A5 Debug.Print Sheet1.Range("A1").Resize(5, 1).Address ' Печатает A1:D1 Debug.Print Sheet1.Range("A1").Resize(1, 4).Address ' Печатает A1:C3 Debug.Print Sheet1.Range("A1").Resize(3, 3).Address End Sub
Когда мы хотим изменить наш целевой диапазон, мы можем
просто использовать исходный размер диапазона.
Другими словами, мы используем количество строк и столбцов
исходного диапазона в качестве параметров для изменения размера:
Sub Resize() Dim rgSrc As Range, rgDest As Range ' Получить все данные в текущей области Set rgSrc = Sheet1.Range("A1").CurrentRegion ' Получить диапазон назначения Set rgDest = Sheet2.Range("A1") Set rgDest = rgDest.Resize(rgSrc.Rows.Count, rgSrc.Columns.Count) rgDest.Value2 = rgSrc.Value2 End Sub
Мы можем сделать изменение размера в одну строку, если нужно:
Sub Resize2() Dim rgSrc As Range ' Получить все данные в ткущей области Set rgSrc = Sheet1.Range("A1").CurrentRegion With rgSrc Sheet2.Range("A1").Resize(.Rows.Count, .Columns.Count) = .Value2 End With End Sub
Чтение Value в переменные
Мы рассмотрели, как читать из одной клетки в другую. Вы также можете читать из ячейки в переменную. Переменная используется для хранения значений во время работы макроса. Обычно вы делаете это, когда хотите манипулировать данными перед тем, как их записать. Ниже приведен простой пример использования переменной. Как видите, значение элемента справа от равенства записывается в элементе слева от равенства.
Sub IspVar() ' Создайте Dim val As Integer ' Читать число из ячейки val = Sheet1.Range("A1").Value2 ' Добавить 1 к значению val = val + 1 ' Запишите новое значение в ячейку Sheet1.Range("A2").Value2 = val End Sub
Для чтения текста в переменную вы используете переменную
типа String.
Sub IspVarText() ' Объявите переменную типа string Dim sText As String ' Считать значение из ячейки sText = Sheet1.Range("A1").Value2 ' Записать значение в ячейку Sheet1.Range("A2").Value2 = sText End Sub
Вы можете записать переменную в диапазон ячеек. Вы просто
указываете диапазон слева, и значение будет записано во все ячейки диапазона.
Sub VarNeskol() ' Считать значение из ячейки Sheet1.Range("A1:B10").Value2 = 66 End Sub
Вы не можете читать из нескольких ячеек в переменную. Однако
вы можете читать массив, который представляет собой набор переменных. Мы
рассмотрим это в следующем разделе.
Как копировать и вставлять ячейки
Если вы хотите скопировать и вставить диапазон ячеек, вам не
нужно выбирать их. Это распространенная ошибка, допущенная новыми пользователями
VBA.
Вы можете просто скопировать ряд ячеек, как здесь:
Range("A1:B4").Copy Destination:=Range("C5")
При использовании этого метода копируется все — значения,
форматы, формулы и так далее. Если вы хотите скопировать отдельные элементы, вы
можете использовать свойство PasteSpecial
диапазона.
Работает так:
Range("A1:B4").Copy Range("F3").PasteSpecial Paste:=xlPasteValues Range("F3").PasteSpecial Paste:=xlPasteFormats Range("F3").PasteSpecial Paste:=xlPasteFormulas
В следующей таблице приведен полный список всех типов вставок.
Виды вставок |
xlPasteAll |
xlPasteAllExceptBorders |
xlPasteAllMergingConditionalFormats |
xlPasteAllUsingSourceTheme |
xlPasteColumnWidths |
xlPasteComments |
xlPasteFormats |
xlPasteFormulas |
xlPasteFormulasAndNumberFormats |
xlPasteValidation |
xlPasteValues |
xlPasteValuesAndNumberFormats |
Чтение диапазона ячеек в массив
Вы также можете скопировать значения, присвоив значение
одного диапазона другому.
Range("A3:Z3").Value2 = Range("A1:Z1").Value2
Значение диапазона в этом примере считается вариантом массива. Это означает, что вы можете легко читать из диапазона ячеек в массив. Вы также можете писать из массива в диапазон ячеек. Если вы не знакомы с массивами, вы можете проверить их в этой статье.
В следующем коде показан пример использования массива с
диапазоном.
Sub ChitatMassiv() ' Создать динамический массив Dim StudentMarks() As Variant ' Считать 26 значений в массив из первой строки StudentMarks = Range("A1:Z1").Value2 ' Сделайте что-нибудь с массивом здесь ' Запишите 26 значений в третью строку Range("A3:Z3").Value2 = StudentMarks End Sub
Имейте в виду, что массив, созданный для чтения, является
двумерным массивом. Это связано с тем, что электронная таблица хранит значения
в двух измерениях, то есть в строках и столбцах.
Пройти через все клетки в диапазоне
Иногда вам нужно просмотреть каждую ячейку, чтобы проверить значение.
Вы можете сделать это, используя цикл For Each, показанный в следующем коде.
Sub PeremeschatsyaPoYacheikam() ' Пройдите через каждую ячейку в диапазоне Dim rg As Range For Each rg In Sheet1.Range("A1:A10,A20") ' Распечатать адрес ячеек, которые являются отрицательными If rg.Value < 0 Then Debug.Print rg.Address + " Отрицательно." End If Next End Sub
Вы также можете проходить последовательные ячейки, используя
свойство Cells и стандартный цикл For.
Стандартный цикл более гибок в отношении используемого вами
порядка, но он медленнее, чем цикл For Each.
Sub PerehodPoYacheikam() ' Пройдите клетки от А1 до А10 Dim i As Long For i = 1 To 10 ' Распечатать адрес ячеек, которые являются отрицательными If Range("A" & i).Value < 0 Then Debug.Print Range("A" & i).Address + " Отрицательно." End If Next ' Пройдите в обратном порядке, то есть от A10 до A1 For i = 10 To 1 Step -1 ' Распечатать адрес ячеек, которые являются отрицательными If Range("A" & i) < 0 Then Debug.Print Range("A" & i).Address + " Отрицательно." End If Next End Sub
Форматирование ячеек
Иногда вам нужно будет отформатировать ячейки в электронной
таблице. Это на самом деле очень просто. В следующем примере показаны различные
форматы, которые можно добавить в любой диапазон ячеек.
Sub FormatirovanieYacheek() With Sheet1 ' Форматировать шрифт .Range("A1").Font.Bold = True .Range("A1").Font.Underline = True .Range("A1").Font.Color = rgbNavy ' Установите числовой формат до 2 десятичных знаков .Range("B2").NumberFormat = "0.00" ' Установите числовой формат даты .Range("C2").NumberFormat = "dd/mm/yyyy" ' Установите формат чисел на общий .Range("C3").NumberFormat = "Общий" ' Установить числовой формат текста .Range("C4").NumberFormat = "Текст" ' Установите цвет заливки ячейки .Range("B3").Interior.Color = rgbSandyBrown ' Форматировать границы .Range("B4").Borders.LineStyle = xlDash .Range("B4").Borders.Color = rgbBlueViolet End With End Sub
Основные моменты
Ниже приводится краткое изложение основных моментов
- Range возвращает диапазон ячеек
- Cells возвращают только одну клетку
- Вы можете читать из одной ячейки в другую
- Вы можете читать из диапазона ячеек в другой диапазон ячеек.
- Вы можете читать значения из ячеек в переменные и наоборот.
- Вы можете читать значения из диапазонов в массивы и наоборот
- Вы можете использовать цикл For Each или For, чтобы проходить через каждую ячейку в диапазоне.
- Свойства Rows и Columns позволяют вам получить доступ к диапазону ячеек этих типов
IF function
The IF function is one of the most popular functions in Excel, and it allows you to make logical comparisons between a value and what you expect.
So an IF statement can have two results. The first result is if your comparison is True, the second if your comparison is False.
For example, =IF(C2=”Yes”,1,2) says IF(C2 = Yes, then return a 1, otherwise return a 2).
Use the IF function, one of the logical functions, to return one value if a condition is true and another value if it’s false.
IF(logical_test, value_if_true, [value_if_false])
For example:
-
=IF(A2>B2,»Over Budget»,»OK»)
-
=IF(A2=B2,B4-A4,»»)
Argument name |
Description |
---|---|
logical_test (required) |
The condition you want to test. |
value_if_true (required) |
The value that you want returned if the result of logical_test is TRUE. |
value_if_false (optional) |
The value that you want returned if the result of logical_test is FALSE. |
Simple IF examples
-
=IF(C2=”Yes”,1,2)
In the above example, cell D2 says: IF(C2 = Yes, then return a 1, otherwise return a 2)
-
=IF(C2=1,”Yes”,”No”)
In this example, the formula in cell D2 says: IF(C2 = 1, then return Yes, otherwise return No)As you see, the IF function can be used to evaluate both text and values. It can also be used to evaluate errors. You are not limited to only checking if one thing is equal to another and returning a single result, you can also use mathematical operators and perform additional calculations depending on your criteria. You can also nest multiple IF functions together in order to perform multiple comparisons.
-
=IF(C2>B2,”Over Budget”,”Within Budget”)
In the above example, the IF function in D2 is saying IF(C2 Is Greater Than B2, then return “Over Budget”, otherwise return “Within Budget”)
-
=IF(C2>B2,C2-B2,0)
In the above illustration, instead of returning a text result, we are going to return a mathematical calculation. So the formula in E2 is saying IF(Actual is Greater than Budgeted, then Subtract the Budgeted amount from the Actual amount, otherwise return nothing).
-
=IF(E7=”Yes”,F5*0.0825,0)
In this example, the formula in F7 is saying IF(E7 = “Yes”, then calculate the Total Amount in F5 * 8.25%, otherwise no Sales Tax is due so return 0)
Note: If you are going to use text in formulas, you need to wrap the text in quotes (e.g. “Text”). The only exception to that is using TRUE or FALSE, which Excel automatically understands.
Common problems
Problem |
What went wrong |
---|---|
0 (zero) in cell |
There was no argument for either value_if_true or value_if_False arguments. To see the right value returned, add argument text to the two arguments, or add TRUE or FALSE to the argument. |
#NAME? in cell |
This usually means that the formula is misspelled. |
Need more help?
You can always ask an expert in the Excel Tech Community or get support in the Answers community.
See Also
IF function — nested formulas and avoiding pitfalls
IFS function
Using IF with AND, OR and NOT functions
COUNTIF function
How to avoid broken formulas
Overview of formulas in Excel