Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Как работает Row внутри Evaluate - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, Manyasha, SLAVICK, китин  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как работает Row внутри Evaluate (Макросы/Sub)
Как работает Row внутри Evaluate
t330 Дата: Понедельник, 01.04.2019, 21:21 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 98
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Всем, привет!

В коде ниже для преобразования текста в диаппазоне в верхний и нижний регистр используется функция Evaluate

Поскольку Evaluate не умеет работать с массивами , то чтобы заставить Evaluate работать с массивом введятся дополнительные фиктивные массивы следующим образом:
фрагменты ROW(" & rngRows.Address & ") и COLUMN(" & rngColumns.Address & ") возвращают числа - номера строк и столбцов, используемого диаппазона соответственно. Далее функция IF получает на входе эти числа и возвращает TRUE (IF всегда возвращает TRUE для чисел, отличных от 0). Таким образом, текст внутри функции
[vba]
Код
Evaluate("IF(ROW(" & rngRows.Address & "),IF(COLUMN(" & rngColumns.Address & "),UPPER(" & rngRectangle.Address & ")))")
[/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 & ")))")
    
    Debug.Print rngRows.Address, rngColumns.Address, rngRectangle.Address
    
End Sub

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 & ")))")
    
    Debug.Print rngRows.Address, rngColumns.Address, rngRectangle.Address
    
End Sub

[/vba]
К сообщению приложен файл: Evaluate.xlsm(18.4 Kb)


Сообщение отредактировал t330 - Понедельник, 01.04.2019, 21:22
 
Ответить
СообщениеВсем, привет!

В коде ниже для преобразования текста в диаппазоне в верхний и нижний регистр используется функция Evaluate

Поскольку Evaluate не умеет работать с массивами , то чтобы заставить Evaluate работать с массивом введятся дополнительные фиктивные массивы следующим образом:
фрагменты ROW(" & rngRows.Address & ") и COLUMN(" & rngColumns.Address & ") возвращают числа - номера строк и столбцов, используемого диаппазона соответственно. Далее функция IF получает на входе эти числа и возвращает TRUE (IF всегда возвращает TRUE для чисел, отличных от 0). Таким образом, текст внутри функции
[vba]
Код
Evaluate("IF(ROW(" & rngRows.Address & "),IF(COLUMN(" & rngColumns.Address & "),UPPER(" & rngRectangle.Address & ")))")
[/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 & ")))")
    
    Debug.Print rngRows.Address, rngColumns.Address, rngRectangle.Address
    
End Sub

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 & ")))")
    
    Debug.Print rngRows.Address, rngColumns.Address, rngRectangle.Address
    
End Sub

[/vba]

Автор - t330
Дата добавления - 01.04.2019 в 21:21
Karataev Дата: Понедельник, 01.04.2019, 22:42 | Сообщение № 2
Группа: Проверенные
Ранг: Старожил
Сообщений: 1327
Репутация: 526 ±
Замечаний: 0% ±

Excel
Зачем тут кавычки , пробелы и символы & ?

Символы & нужны, чтобы соединить фрагменты в одну строку.
В кавычки в VBA заключается какой-либо текст. В данном случае в кавычки заключен этот текст:
"IF(ROW("
Правая кавычка относится не к rngRows.Address, а к тому, что слева.

Пробелы просто нужны, т.к. такой синтаксис в VBA. В VBA нельзя писать впритык, как например это делается в формулах Excel'я.

Пример использования кавычек, пробелов и символа & в другом коде:
[vba]
Код
Sub Макрос1()
    Dim strText As String
    strText = "фрагмент 1" & " " & "фрагмент 2"
End Sub
[/vba]


Киви-кошелек: 9166309108
Яндекс-деньги: 410014131888288


Сообщение отредактировал Karataev - Понедельник, 01.04.2019, 22:46
 
Ответить
Сообщение
Зачем тут кавычки , пробелы и символы & ?

Символы & нужны, чтобы соединить фрагменты в одну строку.
В кавычки в VBA заключается какой-либо текст. В данном случае в кавычки заключен этот текст:
"IF(ROW("
Правая кавычка относится не к rngRows.Address, а к тому, что слева.

Пробелы просто нужны, т.к. такой синтаксис в VBA. В VBA нельзя писать впритык, как например это делается в формулах Excel'я.

Пример использования кавычек, пробелов и символа & в другом коде:
[vba]
Код
Sub Макрос1()
    Dim strText As String
    strText = "фрагмент 1" & " " & "фрагмент 2"
End Sub
[/vba]

Автор - Karataev
Дата добавления - 01.04.2019 в 22:42
_Boroda_ Дата: Понедельник, 01.04.2019, 22:51 | Сообщение № 3
Группа: Модераторы
Ранг: Местный житель
Сообщений: 15567
Репутация: 6074 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Все, что внутри 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_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеВсе, что внутри 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_
Дата добавления - 01.04.2019 в 22:51
t330 Дата: Вторник, 02.04.2019, 00:02 | Сообщение № 4
Группа: Пользователи
Ранг: Участник
Сообщений: 98
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
А вот если Вы напишете
Код

=СТРОКА(ДВССЫЛ(В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
Дата добавления - 02.04.2019 в 00:02
_Boroda_ Дата: Вторник, 02.04.2019, 00:23 | Сообщение № 5
Группа: Модераторы
Ранг: Местный житель
Сообщений: 15567
Репутация: 6074 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Конечно. Как Вы в одной ячейке хотите увидеть массив? Выделите формулу в строке формул и нажмите F9


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеКонечно. Как Вы в одной ячейке хотите увидеть массив? Выделите формулу в строке формул и нажмите F9

Автор - _Boroda_
Дата добавления - 02.04.2019 в 00:23
t330 Дата: Вторник, 02.04.2019, 01:14 | Сообщение № 6
Группа: Пользователи
Ранг: Участник
Сообщений: 98
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Выделите формулу в строке формул и нажмите F9


Выделил в строке формул, нажал F9 , получил и в строке формул =#ССЫЛКА! (см скрин)
К сообщению приложен файл: 9040587.jpg(24.0 Kb)
 
Ответить
Сообщение
Выделите формулу в строке формул и нажмите F9


Выделил в строке формул, нажал F9 , получил и в строке формул =#ССЫЛКА! (см скрин)

Автор - t330
Дата добавления - 02.04.2019 в 01:14
_Boroda_ Дата: Вторник, 02.04.2019, 02:20 | Сообщение № 7
Группа: Модераторы
Ранг: Местный житель
Сообщений: 15567
Репутация: 6074 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
У меня в посте
у Вас текст "A1:A5"
кавычки просто обоpначают, что это текст. Правила русского языка такие :D
А в ячейку В1 кавычки не нужно вводить. Там должно быть написано просто
A1:A5


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеУ меня в посте
у Вас текст "A1:A5"
кавычки просто обоpначают, что это текст. Правила русского языка такие :D
А в ячейку В1 кавычки не нужно вводить. Там должно быть написано просто
A1:A5

Автор - _Boroda_
Дата добавления - 02.04.2019 в 02:20
t330 Дата: Вторник, 02.04.2019, 03:53 | Сообщение № 8
Группа: Пользователи
Ранг: Участник
Сообщений: 98
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
кавычки просто обоpначают, что это текст. Правила русского языка такие


Спасибо, понял:)
Кстати, нет такого правила русского языка. Это скорее правило из языков программирования.
 
Ответить
Сообщение
кавычки просто обоpначают, что это текст. Правила русского языка такие


Спасибо, понял:)
Кстати, нет такого правила русского языка. Это скорее правило из языков программирования.

Автор - t330
Дата добавления - 02.04.2019 в 03:53
_Boroda_ Дата: Вторник, 02.04.2019, 11:37 | Сообщение № 9
Группа: Модераторы
Ранг: Местный житель
Сообщений: 15567
Репутация: 6074 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
[offtop]Это я в третьем часу ночи поленился писать, речь не про текст, а про название. А вообще спорно. "А1:А5" в вышеприведенном контексте используется как обозначение диапазона. Поскольку имени у этого диапазона нет, то обозначение является также и названием и по идее заключается в кавычки. Но не всегда, если название латиницей, то не заключается (но у нас не название, а обозначение, поэтому непонятно). Но и это не всегда, жестких указаний на этот счет нет, на усмотрение автора. Получается, что вроде бы кавычки нужно, но если не поставил, то ошибки тоже нет.
Короче, бардак в стране! :D [/offtop]


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение[offtop]Это я в третьем часу ночи поленился писать, речь не про текст, а про название. А вообще спорно. "А1:А5" в вышеприведенном контексте используется как обозначение диапазона. Поскольку имени у этого диапазона нет, то обозначение является также и названием и по идее заключается в кавычки. Но не всегда, если название латиницей, то не заключается (но у нас не название, а обозначение, поэтому непонятно). Но и это не всегда, жестких указаний на этот счет нет, на усмотрение автора. Получается, что вроде бы кавычки нужно, но если не поставил, то ошибки тоже нет.
Короче, бардак в стране! :D [/offtop]

Автор - _Boroda_
Дата добавления - 02.04.2019 в 11:37
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как работает Row внутри Evaluate (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс цитирования
© 2010-2019 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!