В коде ниже для преобразования текста в диаппазоне в верхний и нижний регистр используется функция Evaluate
Поскольку Evaluate не умеет работать с массивами , то чтобы заставить Evaluate работать с массивом введятся дополнительные фиктивные массивы следующим образом: фрагменты ROW(" & rngRows.Address & ") и COLUMN(" & rngColumns.Address & ") возвращают числа - номера строк и столбцов, используемого диаппазона соответственно. Далее функция IF получает на входе эти числа и возвращает TRUE (IF всегда возвращает TRUE для чисел, отличных от 0). Таким образом, текст внутри функции [vba]
говорит: «Вот Х вертикальных значений TRUE и вот Y горизонтальных значений TRUE. Для каждого из них переведи символы в заглавную форму для соответствующих ячеек из используемого диапазона rngRectangle.Address»
ВОПРОС:
Поясните пожалуйста как работает функция ROW и COLUMN в этом коде. Почему внутри ROW пишем в скобках вот такое выражение (" & rngRows.Address & ") В данном случае (см вложенный файл с примером) rngRows.Address - это $A$1:$A$12
Получается что ROW принимает вот такой вид: ROW (" & $A$1:$A$12 & ") Зачем тут кавычки , пробелы и символы & ?
[vba]
Код
Option Explicit
Sub RectangularUpper() ' Преобразует все ячейки в выделенном диапазоне в верхний регистр Dim rngRectangle As Range, rngRows As Range, rngColumns As Range Set rngRectangle = ActiveSheet.UsedRange ' Определяет вертикальный вектор массива Set rngRows = rngRectangle.Resize(, 1) ' Определяет горизонтальный вектор массива Set rngColumns = rngRectangle.Resize(1) rngRectangle = Evaluate("IF(ROW(" & rngRows.Address & "),IF(COLUMN(" & rngColumns.Address & "),UPPER(" & rngRectangle.Address & ")))")
Sub RectangularLower() ' Преобразует все ячейки в выделенном диапазоне в нижний регистр Dim rngRectangle As Range, rngRows As Range, rngColumns As Range Set rngRectangle = ActiveSheet.UsedRange ' Определяет вертикальный вектор массива Set rngRows = rngRectangle.Resize(, 1) ' Определяет горизонтальный вектор массива Set rngColumns = rngRectangle.Resize(1) rngRectangle = Evaluate("IF(ROW(" & rngRows.Address & "),IF(COLUMN(" & rngColumns.Address & "),Lower(" & rngRectangle.Address & ")))")
В коде ниже для преобразования текста в диаппазоне в верхний и нижний регистр используется функция Evaluate
Поскольку Evaluate не умеет работать с массивами , то чтобы заставить Evaluate работать с массивом введятся дополнительные фиктивные массивы следующим образом: фрагменты ROW(" & rngRows.Address & ") и COLUMN(" & rngColumns.Address & ") возвращают числа - номера строк и столбцов, используемого диаппазона соответственно. Далее функция IF получает на входе эти числа и возвращает TRUE (IF всегда возвращает TRUE для чисел, отличных от 0). Таким образом, текст внутри функции [vba]
говорит: «Вот Х вертикальных значений TRUE и вот Y горизонтальных значений TRUE. Для каждого из них переведи символы в заглавную форму для соответствующих ячеек из используемого диапазона rngRectangle.Address»
ВОПРОС:
Поясните пожалуйста как работает функция ROW и COLUMN в этом коде. Почему внутри ROW пишем в скобках вот такое выражение (" & rngRows.Address & ") В данном случае (см вложенный файл с примером) rngRows.Address - это $A$1:$A$12
Получается что ROW принимает вот такой вид: ROW (" & $A$1:$A$12 & ") Зачем тут кавычки , пробелы и символы & ?
[vba]
Код
Option Explicit
Sub RectangularUpper() ' Преобразует все ячейки в выделенном диапазоне в верхний регистр Dim rngRectangle As Range, rngRows As Range, rngColumns As Range Set rngRectangle = ActiveSheet.UsedRange ' Определяет вертикальный вектор массива Set rngRows = rngRectangle.Resize(, 1) ' Определяет горизонтальный вектор массива Set rngColumns = rngRectangle.Resize(1) rngRectangle = Evaluate("IF(ROW(" & rngRows.Address & "),IF(COLUMN(" & rngColumns.Address & "),UPPER(" & rngRectangle.Address & ")))")
Sub RectangularLower() ' Преобразует все ячейки в выделенном диапазоне в нижний регистр Dim rngRectangle As Range, rngRows As Range, rngColumns As Range Set rngRectangle = ActiveSheet.UsedRange ' Определяет вертикальный вектор массива Set rngRows = rngRectangle.Resize(, 1) ' Определяет горизонтальный вектор массива Set rngColumns = rngRectangle.Resize(1) rngRectangle = Evaluate("IF(ROW(" & rngRows.Address & "),IF(COLUMN(" & rngColumns.Address & "),Lower(" & rngRectangle.Address & ")))")
Символы & нужны, чтобы соединить фрагменты в одну строку. В кавычки в VBA заключается какой-либо текст. В данном случае в кавычки заключен этот текст: "IF(ROW(" Правая кавычка относится не к rngRows.Address, а к тому, что слева.
Пробелы просто нужны, т.к. такой синтаксис в VBA. В VBA нельзя писать впритык, как например это делается в формулах Excel'я.
Пример использования кавычек, пробелов и символа & в другом коде: [vba]
Код
Sub Макрос1() Dim strText As String strText = "фрагмент 1" & " " & "фрагмент 2" End Sub
Символы & нужны, чтобы соединить фрагменты в одну строку. В кавычки в VBA заключается какой-либо текст. В данном случае в кавычки заключен этот текст: "IF(ROW(" Правая кавычка относится не к rngRows.Address, а к тому, что слева.
Пробелы просто нужны, т.к. такой синтаксис в VBA. В VBA нельзя писать впритык, как например это делается в формулах Excel'я.
Пример использования кавычек, пробелов и символа & в другом коде: [vba]
Код
Sub Макрос1() Dim strText As String strText = "фрагмент 1" & " " & "фрагмент 2" End Sub
Все, что внутри Evaluate - это как бы если мы пишем формулу на листе и говорим "Посчитай мне вот это" Сейчас не буду о правильно-неправильно и о "лучше было бы вот так", сейчас просто про то, как оно работает Если перевести то, что внутри Evaluate на язык формул, то мы получим
Код
ЕСЛИ(СТРОКА(ссылка на диапазон1);ЕСЛИ(СТОЛБЕЦ(ссылка на диапазон2);ПРОПИСН(ссылка на диапазон3)))
Не совсем понятно зачем Вам все это нужно, если прекрасно работает и вот так [vba]
Код
Evaluate("UPPER(" & rngRectangle.Address & ")")
[/vba], ну да ладно, сейчас не об этом В формуле Вы подставляете диапазоны, которые определили выше в коде. Диапазоны, а не текст. Это как формулами использовать ДВССЫЛ. Например, в ячейке B1 у Вас текст "A1:A5", если Вы напишете формулу
Код
=СТРОКА(B1)
, то результат будет 1 - строка ячейки В1. А вот если Вы напишете
Код
=СТРОКА(ДВССЫЛ(В1))
, то результат будет уже {1:2:3:4:5} То же самое и здесь, если бы Вы написали[vba]
Код
"ROW(rngRows.Address)"
[/vba], то VBA Вас бы не понял - для него все то, что в кавычках - это текст. Не сработает такая формула
Код
=СТРОКА(rngRows.Address)
(если, конечно, rngRows.Address - не имя такое, но это не наш случай). Когда же Вы пишете с кавычками, то Вы разделяете текст и переменные [vba]
Код
"ROW(" & rngRows.Address & ")"
[/vba] - это то же самое, что и [vba]
Код
"ROW(A1:A5)"
[/vba]. Это уже VBA понимает Другими словами, если вовнутрь какого-то текста нужно засунуть переменную или результат расчета, то их в кавычки обрамлять не нужно. А все остальное нужно. Получается так "IF(ROW(" - текст & rngRows.Address - расчет (адрес переменной)& "),IF(COLUMN(" & rngColumns.Address& "),UPPER(" & rngRectangle.Address& ")))"
Все, что внутри Evaluate - это как бы если мы пишем формулу на листе и говорим "Посчитай мне вот это" Сейчас не буду о правильно-неправильно и о "лучше было бы вот так", сейчас просто про то, как оно работает Если перевести то, что внутри Evaluate на язык формул, то мы получим
Код
ЕСЛИ(СТРОКА(ссылка на диапазон1);ЕСЛИ(СТОЛБЕЦ(ссылка на диапазон2);ПРОПИСН(ссылка на диапазон3)))
Не совсем понятно зачем Вам все это нужно, если прекрасно работает и вот так [vba]
Код
Evaluate("UPPER(" & rngRectangle.Address & ")")
[/vba], ну да ладно, сейчас не об этом В формуле Вы подставляете диапазоны, которые определили выше в коде. Диапазоны, а не текст. Это как формулами использовать ДВССЫЛ. Например, в ячейке B1 у Вас текст "A1:A5", если Вы напишете формулу
Код
=СТРОКА(B1)
, то результат будет 1 - строка ячейки В1. А вот если Вы напишете
Код
=СТРОКА(ДВССЫЛ(В1))
, то результат будет уже {1:2:3:4:5} То же самое и здесь, если бы Вы написали[vba]
Код
"ROW(rngRows.Address)"
[/vba], то VBA Вас бы не понял - для него все то, что в кавычках - это текст. Не сработает такая формула
Код
=СТРОКА(rngRows.Address)
(если, конечно, rngRows.Address - не имя такое, но это не наш случай). Когда же Вы пишете с кавычками, то Вы разделяете текст и переменные [vba]
Код
"ROW(" & rngRows.Address & ")"
[/vba] - это то же самое, что и [vba]
Код
"ROW(A1:A5)"
[/vba]. Это уже VBA понимает Другими словами, если вовнутрь какого-то текста нужно засунуть переменную или результат расчета, то их в кавычки обрамлять не нужно. А все остальное нужно. Получается так "IF(ROW(" - текст & rngRows.Address - расчет (адрес переменной)& "),IF(COLUMN(" & rngColumns.Address& "),UPPER(" & rngRectangle.Address& ")))"_Boroda_
=СТРОКА(ДВССЫЛ(В1)) , то результат будет уже {1:2:3:4:5}
Спасибо за подробный ответ. Все понял по теме вопроса, но не понял =СТРОКА(ДВССЫЛ(В1)) ввожу эту формулу на листе Эксель и в ответ получаю #ссылка , а не массив {1:2:3:4:5}
=СТРОКА(ДВССЫЛ(В1)) , то результат будет уже {1:2:3:4:5}
Спасибо за подробный ответ. Все понял по теме вопроса, но не понял =СТРОКА(ДВССЫЛ(В1)) ввожу эту формулу на листе Эксель и в ответ получаю #ссылка , а не массив {1:2:3:4:5}t330
кавычки просто обоpначают, что это текст. Правила русского языка такие А в ячейку В1 кавычки не нужно вводить. Там должно быть написано просто A1:A5_Boroda_
[offtop]Это я в третьем часу ночи поленился писать, речь не про текст, а про название. А вообще спорно. "А1:А5" в вышеприведенном контексте используется как обозначение диапазона. Поскольку имени у этого диапазона нет, то обозначение является также и названием и по идее заключается в кавычки. Но не всегда, если название латиницей, то не заключается (но у нас не название, а обозначение, поэтому непонятно). Но и это не всегда, жестких указаний на этот счет нет, на усмотрение автора. Получается, что вроде бы кавычки нужно, но если не поставил, то ошибки тоже нет. Короче, бардак в стране! [/offtop]
[offtop]Это я в третьем часу ночи поленился писать, речь не про текст, а про название. А вообще спорно. "А1:А5" в вышеприведенном контексте используется как обозначение диапазона. Поскольку имени у этого диапазона нет, то обозначение является также и названием и по идее заключается в кавычки. Но не всегда, если название латиницей, то не заключается (но у нас не название, а обозначение, поэтому непонятно). Но и это не всегда, жестких указаний на этот счет нет, на усмотрение автора. Получается, что вроде бы кавычки нужно, но если не поставил, то ошибки тоже нет. Короче, бардак в стране! [/offtop]_Boroda_