Мега-мега-мегаграмотное изложение материала и продуктивные уроки! Редкость на просторах интернета! Низкий Вам поклон за столь эффективное изложение материала по VBA! Вы педагог от Бога, продолжайте в том же духе! Низкий поклон за труды! Не поленюсь и напишу это коммент по каждым видео курса!!!
Здравствуйте, Андрей! Со своей стороны точно также не поленюсь и поблагодарю Вас за этот приятный комментарий под каждым видео точно так же :) С уважением и хорошего Вам дня, ХБ
Спасибо за серию этих видеоуроков! Все наглядно и понятно, предлагается самостоятельная работа, подача материала интересная и приятная. Всех благ автору!
ДЗ можно еще усложнить тем условием что например -- если неизвестно где в листе будет располагаться таблица с оценками .. и для начала автоматически определить диапазон её расположения))
Для всех начинающих. Автору огромное спасибо за контент, но почти все варианты в комментариях ДЗ неверные. Ни кто не понял что от них хотят. Идея задания следующая - Создаем динамический массив, наполняем его данными, далее циклом выводим сообщение. Почти у всех объявлен массив, но не заполнен, и данные в программе берутся из листа книги а не из массива. По большому счету массив из этих примеров можно выкинуть и результат не измениться. Вот пример решение этой задачи при помощи массива, или смотрите следующее видео Автора. Sub TestArr() Dim Arr As Variant Dim EndRow As Long Dim i As Long EndRow = Range("B" & Rows.Count).End(xlUp).Row Arr = ActiveSheet.Range("B2", ActiveSheet.Cells(EndRow, 3)) For i = 1 To UBound(Arr) MsgBox Arr(i, 1) & " - Оценка: " & Arr(i, 2) Next i End Sub
Здравствуйте! Большое спасибо за комментарий и отличное решение домашнего задания из этого видео! Если в дальнейшем будут какие-либо вопросы, всегда обращайтесь - буду рад помочь 😊 Хороших Вам выходных! С уважением, Билял
ReDim то зачем в данном коде? много лишней писанины Dim i As Long For i = 2 To Worksheets("Лист1").Cells(Rows.Count, 1).End(xlUp).Row a = ActiveSheet.Range("A" & i) & ": " & ActiveSheet.Range("B" & i) MsgBox a Next i Вот и все.
Огромное спасибо за урок!! Постарался решить домашнее задание, результат получается, но скорее всего не очень рационально: Sub Homework() Dim NameArray() Dim lboundVar As Long Dim uboundVar As Long lboundVar = 1 uboundVar = ThisWorkbook.Worksheets("лист1").Cells(Rows.Count, 2).End(xlUp).Row uboundVar = uboundVar - 2 ReDim NameArray(lboundVar To uboundVar) Dim i As Integer Dim N As String Dim M As Long N = ThisWorkbook.Worksheets("лист1").Cells(2, 2) M = ThisWorkbook.Worksheets("лист1").Cells(2, 3) MsgBox " Студент " & N & " оценка " & M For i = LBound(NameArray) To UBound(NameArray)
N = ThisWorkbook.Worksheets("лист1").Cells(2 + i, 2) M = ThisWorkbook.Worksheets("лист1").Cells(2 + i, 3)
Все отлично, но для людей со слабым зрением (таким как у меня) и с большим трудом различающим текст на экране видео, может быть прикреплять к видео текст с примерами кода или картинки с крупным шрифтом. Сейчас мне приходится скачивать видео, средствами проигрывателя сохранять кадр как изображение, а потом в графическом редакторе рассматривать текст кода. Понятно, что кто хочет, тот - добьется. Но все же, если это не слишком затруднит Вас. В целом за материал спасибо, очень приятно слышать чистую речь.
MsgBox testArrays(LBound(testArrays)) - extract the value from the lower bound MsgBox testArrays(UBound(testArrays)) - extract the value from the upper bound
Билял, спасибо за замечательный курс! Не то слово, что приятно) Я впечатлён Вашим преподношением материала в сериях роликов по VBA! Не останавливайтесь ни в коем случае: построение урока, с рассмотрением решений домашних заданий - замечательно. Скорость и прямота, без слов-паразитов, грамотное изложение - всё просто супер!!! Касаемо данного урока есть вопрос: при написании процедур я часто передаю параметры в другие процедуры, но ByVal не указываю, а просто передаю переменные и их типы! Это некорректно с моей стороны? Чем это чревато, если что?
Здравствуйте, Евгений! Очень рад, что мой видеоканал Вам понравился! :) Именно из-за того, что этот канал полезен и помогает людям, я настроен и в дальнейшем исключительно активно поддерживать его и выпускать еженедельно по субботам видео :) Теперь касательно Вашего вопроса с ByRef и ByVal. Если вариант передачи данных в функцию или подпрограмму эксплицитно (прямо) не указывается, то VBA по умолчанию использует ByRef. Проверить это Вы можете на следующем макросе: Sub callingProc() Dim rgA As Range, rgB As Range Set rgA = Range("A1:A10") Set rgB = rgA Call helpProc(rgA) MsgBox "Сперва: " & rgB.Address(False, False) & _ vbLf & "В итоге: " & rgA.Address(False, False) End Sub Private Sub helpProc(ByRef rgInputRange As Range) Set rgInputRange = Range("F1:F10") End Sub Сделайте следующее: 1. Вставьте макрос в новый модуль 2. Запустите первую процедуру. Как можете заметить, поскольку во вспомогательной процедуре helpProc стоит настройка ByRef, то измененные значения были сохранены в передающую переменную вызывающей процедуры callingProc. Соответственно в нашем сообщении отображается новое значение, которое получилось в ходе обработки во вспомогательной процедуре. 3. Теперь поменяйте настройку ByRef во вспомогательной процедуре helpProc на ByVal и снова запустите первую процедуру. Теперь изменения полученных значений во вспомогательных процедуре никак не влияют на значения использованной для передачи данных переменной в callingProc. Соответственно в сообщении выводятся одинаковые адреса областей. 4. Теперь удалите настройку передачи данных полностью: Private Sub helpProc(rgInputRange As Range) Set rgInputRange = Range("F1:F10") End Sub Если Вы теперь запустите первую процедуру, то результат будет аналогичен тесту из пункта 2. Происходит это так, поскольку ByRef, как и было сказано, является настройкой по умолчанию. В функциональном плане подобное имплицинтное указание настройки передачи значений особых минусов не имеет. Тем не менее, я бы посоветовал точно, эксплицитно указывать желаемую настройку по нескольким причинам: - Улучшение читабельности кода - Упрощение понимания кода для людей, которые впервые работают с данной процедурой - Улучшение возможности дальнейшего развития кода и его оптимизации - etc. Надеюсь, я смог помочь Вам. Если будут какие-либо вопросы, всегда смело сразу обращайтесь, Евгений! С уважением и хороших Вам выходных, Билял
Добрый день, верно ли я понимаю, что для выполнения домашнего задания некоторые пользователи для определения верхней границы массива использовали Cells(Rows.Count, 2).End(xlUp).Row, вопрос, а для чего в таком случае нужны Lbound и Ubound? Я могу в цикле for сразу прописать: For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row , а Lbound и Ubound убрать из кода, что сократит его на половину, получается верхнюю границу динамического массива определяет не Ubound, а Cells(Rows.Count, 2).End(xlUp). Или же могу вообще прописать exit for при достижении в цикле пустой ячейки. Подскажите пожалуйста в чем смысл Lbound и UBound после мною вышеописанного? Спасибо! Ps уже который сайт смотрю, видео, но не могу понять в итоге почему считается что Lbound и Ubound определяет границы динамического массива, когда по сути мы их задаем.
Здравствуйте, Роман! И вправду, отличное замечание - можно было бы это ключевое слово также «захватить» в видео. С другой стороны, проблема заключается в том, что всегда стараюсь видео делать максимально короткими, насколько это возможно - особенно в случае с такими основополагающими видео. Когда-нибудь позже я планирую снять абсолютно новый плейлист по VBA, который будет содержать в себе пересмотренные, еще более насыщенные видео и при этом всё так же максимально короткометражные. В этом планируемом плейлисте я обязательно включу упомянутый Вами Preserve 😊 С уважением, Билял
Спасибо, курс очень информативный для новичка, много нового для себя узнаю, решил домашку двумя способами, меня интересует вопрос - пойдет ли в зачет первый способ с использованием обычного(не динамического) массива, вот он: Sub homeWork1() Dim testArray(1 To 500) As Long Dim i As Long For i = LBound(testArray) To ActiveWorkbook.Worksheets(1).Cells(Rows.count, 2).End(xlUp).Row - 1 testArray(i) = ActiveSheet.Range("C" & i + 1) Next i For i = LBound(testArray) To ActiveWorkbook.Worksheets(1).Cells(Rows.count, 2).End(xlUp).Row - 1 MsgBox ActiveSheet.Range("C" & i + 1).Offset(0, -1) & ": " & testArray(i)
Next i End Sub А вот второй способ, как и предполагалось, используется динамический массив: Sub homeWork2() Dim dynArr() Dim lBoundVar As Long Dim uBoundVar As Long lBoundVar = 1 uBoundVar = ActiveWorkbook.Worksheets(1).Cells(Rows.count, 2).End(xlUp).Row - 1 ReDim dynArr(lBoundVar To uBoundVar) Dim i As Integer For i = LBound(dynArr) To UBound(dynArr) MsgBox ActiveSheet.Range("C" & i + 1).Offset(0, -1) & " оценка: " & ActiveSheet.Range("C" & i + 1) Next i End Sub Заранее благодарю за ответ!
Уважаемый Билял, подскажите, как с помощью массива сделать из диапазона ячеек сводную таблицу, то есть получить сумму всех повторяющихся строк и соответствующих им значений. Спасибо
Здравствуйте, Сергей! Не совсем понятна поставленная задача. Вам нужно создать нечто на подобии функции Excel СУММЕСЛИ или СУММЕСЛИМН? С уважением, Билял
1) а можно ли указать тип данных для дин масива сразу при обьявлении? Dim massive () as long Вот так 2) а можно ли указать значения нижнего и верхнего предела массива переменной? вот так? dim massive (a to b) as long ?
Здравствуйте! Хотел бы попросить помочь в решении задачи. Дано: 1. в ячейке "А1" пишется слово "буква" или "цифра" 2. в столбце "В" в случайном порядке каждая ячейка содержит слово "буква" или "цифра" (диапазон ячеек в столбце "В" переменный) 3. в столбце "С" напротив "буква" или "цифра" столбца "В" указаны соответственно какие-либо буквы (а, б, е, я и т.п.) или цифры (1, 2, 4, 8 и т.п.) Необходимо: В зависимости от того, какое слово указано в ячейке "А1", в столбце "Е", начиная с ячейки "Е1", вывести весь перечень букв или цифр из столбца "С" в порядке их нахождения сверху-вниз. Возможно ли решить эту задачу при помощи освещённых тем?
Здравствуйте, Роман! Хочу предложить Вам следующее решение: Sub answerToRomansQuestion() Dim cellChecked As Range
If Range("A1") = "Буква" Then 'Сперва проверяем, какого формата данные нужны в столбце "Е" For Each cellChecked In Range("C1:C" & Range("C" & Rows.Count).End(xlUp).Row) 'Для всех значений в столбце "С" If IsNumeric(cellChecked) = False Then 'Если значение типа String, тогда записываем данные в столбец "Е" If Range("E1") = "" Then Range("E" & Range("E" & Rows.Count).End(xlUp).Row) = cellChecked 'Если "Е1" пуста, то без сдвига Else: Range("E" & Range("E" & Rows.Count).End(xlUp).Row).Offset(1, 0) = cellChecked 'Иначе со сдвигом End If End If Next cellChecked ElseIf Range("A1") = "Цифра" Then 'Всё тоже самое, только с цифрами, если в ячейке "А1" значение - "Цифра" For Each cellChecked In Range("C1:C" & Range("C" & Rows.Count).End(xlUp).Row) If IsNumeric(cellChecked) = True Then If Range("E1") = "" Then Range("E" & Range("E" & Rows.Count).End(xlUp).Row) = cellChecked Else: Range("E" & Range("E" & Rows.Count).End(xlUp).Row).Offset(1, 0) = cellChecked End If End If Next cellChecked End If End Sub Просто скопируйте и вставьте код в окно VBA, чтобы было нагляднее :) В основе данного решения лежит фраза “IsNumeric”, которая позволяет проверить, какого типа являются проверяемые данные. Фактически, в данном решении абсолютно не имеет значение столбец “B”, и всё зависит лишь от того, какого типа данные нам нужно отобразить (данная информация указана в ячейке «А1»). На канале еще не было урока на тему IsNumeric, и теперь, благодаря Вашему примеру, вероятно одним из следующих уроков будет данная тема :) Если у Вас остались вопросы - пишите! С удовольствие отвечу :) С уважением, ХБ
@@BilyalKhassenov Здравствуйте! Спасибо большое вам за ответ и предложенный вариант решения задачи! Но я виноват.. Это тот случай, когда желание упростить условие задачи, чтобы донести её суть до слушателя, искажает у последнего понимание этой сути. Дело в том, что вместо слов "буква" и "цифра" могут быть абсолютно любые категории. Да и самих категорий может быть больше, чем две. Попробую изложить условие задачи немного по-другому. *** Дано: 1. в ячейке "А1" пишется слово "овощи" или "фрукты" , или "ягоды". 2. в столбце "В" в случайном порядке каждая ячейка содержит слово "овощи" или "фрукты" , или "ягоды" (диапазон ячеек в столбце "В" переменный) . Например, В1=фрукты, В2=фрукты, В3=ягоды, В4=овощи, В5=фрукты и т.д. 3. в столбце "С" напротив "овощи" или "фрукты" , или "ягоды" столбца "В" указаны соответственно какие-либо овощи (капуста, морковь и т.п.) или фрукты (яблоки, груши и т.п.) , или ягоды (малина, черника и т.п.). Например, С1=бананы, С2=яблоки, С3=смородина, С4=картофель, С5=груши и т.д. Необходимо: В зависимости от того, какое слово указано в ячейке "А1", в столбце "Е", начиная с ячейки "Е1", вывести весь перечень овощей или фруктов, или ягод из столбца "С" в порядке их нахождения сверху-вниз. Т.е. при условии, что А1=фрукты, то для примеров из пп. 2 и 3: Е1=бананы, Е2=яблоки, Е3=груши и т.д. *** Т.е. макрос должен работать, как функция ВПР в Excel. Только в отличие от этой функции он должен вернуть не одно лишь значение, а все. Простите, что так много букв..)
Здравствуйте, Роман! Буквально сел написать свой вариант решения (не увидел, что Вы свой вариант уже написали), так что он готов и скидываю как альтернативу. Если интересно можете посмотреть, попробовать :) Sub answerToRomansQuestion2() Dim cellChecked As Range For Each cellChecked In Range("B1:B" & Range("B" & Rows.Count).End(xlUp).Row) 'Проверяем категорию объекта If cellChecked = Range("A1") Then 'Если категория объекта соответсвует категории, казанной в "А1", то If Range("E" & Range("E" & Rows.Count).End(xlUp).Row).Address = Range("E1").Address And Range("E1") = "" Then Range("E" & Range("E" & Rows.Count).End(xlUp).Row) = cellChecked.Offset(0, 1) 'Если "Е1" свободна, то в неё вносим первый об Else: Range("E" & Range("E" & Rows.Count).End(xlUp).Row + 1) = cellChecked.Offset(0, 1) 'Все остальные объекты вносятся с Row Offset = 1 End If End If Next cellChecked End Sub С уважением и хорошего вечера, ХБ P.S. Очень рад, что у Вас тоже удалось найти решение :)
@@BilyalKhassenov Спасибо вам большое!!! Теперь в моём модуле две процедуры для решения задачи с продуктами =) А на самом деле ваши обучающие видео и ваши предложения вносят огромный вклад в оптимизацию и ускорение моего рабочего процесса и рабочего процесса моих товарищей! Ещё раз спасибо!
Есть ещё вопрос большой, но не по данной серии курса: из-за моей цели работать над универсальными программками, работающими на любой версии Office (32 или 64 бита) столкнулся с проблемой декларирования функций. Для меня это сложно к пониманию (. Не могли бы Вы подготовить, как Вы умеете!!! достойный материал на эту тему? Ещё раз спасибо за Ваши уроки!
Здравствуйте, Евгений! Обязательно постараюсь снять видео на данную тему. Правда, не могу обещать, что оно вышло бы скоро, так как на ближайшие недели запланированы видео по теме пользовательских форм. Но, как было сказано, обязательно постараюсь сделать это как можно быстрее :) Спасибо за Ваш комментарий, всегда пишите, если будут какие-либо вопросы :) С уважением, Билял
Билял, где-то в твоих видео видел, но не могу найти сейчас: мне нужно выделить диапазон из заполненных ячеек в книге, как это сделать в VBA? У меня в книге несколько диапазонов разделены пустыми строками. Мне надо некоторые из них выделить и кое-что применить к выделенному) Там какая-то простая команда VBA, подскажи пожалуйста)
Спасибо. по поводу дз: как быть, если в массиве данных есть пустые строки? Как через алгоритм if убрать из цикла эти строки? вопрос №2: можно ли прописать код на остановку действующего макроса? например, я включил макрос и через пару сек понял, что хочу его отменить, и хочу сделать это через отдельную кнопочку, а не через зажимание esc - как это реализовать?
Билл, большое спасибо. Sub test() Dim ResAr() Dim Name As String Dim result As Long, ILostRow As Long ILostRow = Cells(Rows.Count, 2).End(xlUp).Row ReDim ResAr(2 To ILostRow) For i = LBound(ResAr) To UBound(ResAr) Name = Cells(i, 2) result = Cells(i, 3) MsgBox Name & " - " & result Next i End Sub
Можно ли засчитать такое решение домашнего задания?.. =) Sub HomeWork1() Dim LstRow As Long Dim MyRng As Range LstRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row For Each MyRng In Range(Cells(2, 1), Cells(LstRow, 1)) MsgBox MyRng & " -- " & MyRng.Offset(0, 1) Next MyRng End Sub
Здравствуйте, Роман! Конечно, предложенное Вами решение, в принципе, выполняет поставленную задачу. Тем не менее, в данном домашнем задании задачей являлось решение проблемы при помощи Arrays как инструмента. Поэтому, если быть совсем «академически» честным, я бы подобное решение не засчитал :) Тем не менее, это только сугубо теоретическое домашнее задание для закрепления темы Arrrays. В жизни же хороши любые методы, которые выполняют требуемый функционал, и Ваше решение, являющееся значительно более наглядным и простым для понимания, определенно имеет свои преимущества. В любом случае, большое спасибо за Ваш предложенный вариант решения задачи! :) С уважением ХБ P.S. С праздником Вас! :)
Здравствуйте. Вот моё решение домашнего задания: Option Explicit Sub test() Dim MarkArray () as Long Dim Mark As Long Dim Name As String Dim i As Long Dim lBoundV As Long Dim uboundV As Long lBoundV = Sheet1.UsedRange.Row uboundV = Sheet1.UsedRange.Rows.Count - 1 ReDim MarkArray(lBoundV To uboundV) For i = LBound(MarkArray) To UBound(MarkArray) Mark = Range("C" & i + 1) Name = Range("B" & i + 1) MsgBox Name & " - Оценка: " & Mark Next i End Sub
Здравствуйте, Владимир! Спасибо за Ваш вариант решения домашнего задания! Мне очень понравилось то, как Вы изящно использовали выражение UsedRange для нахождения индексов строк. Наверно, чуть позже всё-таки сниму еще один отдельный видеоролик посвященный теме UsedRange, поскольку уже несколько раз подписчики канала затрагивали данную тему в комментариях. Хорошего Вам дня, Анатолий! :) С уважением, ХБ
Добрый день! Есть ли возможность передавать процедуре в качестве параметров список других процедур, пусть даже фиксированное количество, но возможно ли это сделать и если да, то как?
Здравствуйте, Павел! Спасибо за Ваш вопрос - он и вправду интересен и важен! Передавать процедуре в качестве параметров список других процедур вполне возможно. Например, для этого можно использовать массивы. При этом учтите, что массивы всегда передаются в процедуры с параметрами с настройкой ByRef. Смотрите, вот пример - в нём мы передаём имена процедур в текстовом массиве во вспомогательную процедуру. Вставьте этот код в новый модуль и протестируйте: Option Explicit Sub mainSub() 'В основной процедуре создаем и заполняем массив именами трёх тестовых процедур Dim arrListOfSubNames(1 To 3) As String arrListOfSubNames(1) = "testSub1" arrListOfSubNames(2) = "testSub2" arrListOfSubNames(3) = "testSub3" 'Передаём массив во вспомогательную процедуру, которая запускает каждую из тестовых процедур Call helpSubToCall(arrListOfSubNames) End Sub Sub helpSubToCall(ByRef arrSubNames() As String) Dim intCounter As Integer 'Цикл по массивы и запуск тестовых процедур при помощи указания имени процедуры методу Run For intCounter = LBound(arrSubNames) To UBound(arrSubNames) Run arrSubNames(intCounter) Next intCounter End Sub Sub testSub1() MsgBox "1" 'Тестовая процедура 1 End Sub Sub testSub2() MsgBox "2" 'Тестовая процедура 2 End Sub Sub testSub3() MsgBox "3" 'Тестовая процедура 3 End Sub Если будут вопросы - пишите! 😊 С уважением, Билял
@@BilyalKhassenov Здравствуйте! Билял. Большое спасибо за оперативный ответ и огромное спасибо за его содержание, которое более чем превзошло мои ожидания! То что нужно! Успехов вам в вашем замечательном деле - просвещении и Удачи!
Здравствуйте! Полностью сама написала ) Sub HomeWork() Dim dinArray() Dim lBoundO As Long Dim uBoundO As Long Dim i As Long Dim a As Long Dim strName As String a = 3 i = Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Row lBoundO = 1 uBoundO = i - 2 ReDim dinArray(lBoundO To uBoundO) Dim z As Integer For z = LBound(dinArray) To UBound(dinArray) strName = ActiveSheet.Range("B" & a).Offset(0, -1) MsgBox strName & " оценка: " & Range("B" & a) a = a + 1 Next z End Sub
Наверное, можно и так :)) Sub Education() Dim vArr As Variant Dim j As Long vArr = Range("A1").CurrentRegion.Value For j = 2 To UBound(vArr) MsgBox vArr(j, 2) & "-" & "Оценка: " & vArr(j, 3) Next j End Sub
Мое решение задачи: Sub dinarray() Dim myarray() Dim lboundval, uboundval As Long Dim i As Long Dim sh As Worksheet Dim LastRow As Long Set sh = ThisWorkbook.Worksheets("Лист2") lboundval = 1 LastRow = sh.Cells(Rows.Count, 2).End(xlUp).Row ReDim myarray(lboundval To LastRow - 1) For i = LBound(myarray) To UBound(myarray) myarray(i) = sh.Range("B" & i + 1) & " " & "Оценка:" & sh.Range("C" & i + 1) MsgBox myarray(i) Next i End Sub
Всем привет! Нужно использовать информацию не одного, а двух предыдущих уроков)) Sub homework() Dim lowerbound As Long Dim upperbound As Long lowerbound = 2 upperbound = ThisWorkbook.Worksheets(1).Range("C" & Rows.Count).End(xlUp).Row ReDim dinamicarray(lowerbound To upperbound) Dim i As Integer For i = LBound(dinamicarray) To UBound(dinamicarray) MsgBox Range("B" & i) & " - îöåíêà " & Range("C" & i) Next i End Sub
Sub homework() Dim lBoundNames As Long Dim uBoundNames As Long Dim dynArrayNames() Dim dynArrayGrades() uBoundNames = 2 lBoundNames = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row uBoundGrades = 2 lBoundGrades = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row 'MsgBox ActiveSheet.Range("A" & lBoundGrade) ReDim dynArrayNames(uBoundNames To lBoundNames) ReDim dynArrayGrades(uBoundGrades To lBoundGrades) Dim i As Long For i = LBound(dynArrayNames) To UBound(dynArrayNames) If IsEmpty(ActiveSheet.Range("A" & i)) = False Then dynArrayNames(i) = ActiveSheet.Range("A" & i) 'MsgBox dynArrayNames(i)
Else 'здесь можно выводить ошибку
End If
For j = i To i
If IsEmpty(ActiveSheet.Range("B" & j)) = False Then
Мега-мега-мегаграмотное изложение материала и продуктивные уроки! Редкость на просторах интернета! Низкий Вам поклон за столь эффективное изложение материала по VBA! Вы педагог от Бога, продолжайте в том же духе! Низкий поклон за труды! Не поленюсь и напишу это коммент по каждым видео курса!!!
Здравствуйте, Андрей!
Со своей стороны точно также не поленюсь и поблагодарю Вас за этот приятный комментарий под каждым видео точно так же :)
С уважением и хорошего Вам дня,
ХБ
Спасибо за серию этих видеоуроков! Все наглядно и понятно, предлагается самостоятельная работа, подача материала интересная и приятная. Всех благ автору!
Шикарно =) После этого урока сразу решил свою проблему с массивами. Всех Благ.
Билял, спасибо за уроки! Да, я справляюсь с домашними заданиями, очень интересно!
ДЗ можно еще усложнить тем условием что например -- если неизвестно где в листе будет располагаться таблица с оценками .. и для начала автоматически определить диапазон её расположения))
Уроки и подача превосходны! Спасибо Вам!
Присоединяюсь к комментариям. действительно один из лучших каналов по обучению VBA!!!
Здравствуйте, Фарид!
Большое спасибо за Ваш комментарий 😊
Хорошего Вам дня!
С уважением,
Билял
@@BilyalKhassenov у меня еще вопрос. Как можно научиться вашему уровню знаний vba?в чем ваш секрет? Как обучились и что использовали?
Для всех начинающих. Автору огромное спасибо за контент, но почти все варианты в комментариях ДЗ неверные. Ни кто не понял что от них хотят. Идея задания следующая - Создаем динамический массив, наполняем его данными, далее циклом выводим сообщение. Почти у всех объявлен массив, но не заполнен, и данные в программе берутся из листа книги а не из массива. По большому счету массив из этих примеров можно выкинуть и результат не измениться. Вот пример решение этой задачи при помощи массива, или смотрите следующее видео Автора.
Sub TestArr()
Dim Arr As Variant
Dim EndRow As Long
Dim i As Long
EndRow = Range("B" & Rows.Count).End(xlUp).Row
Arr = ActiveSheet.Range("B2", ActiveSheet.Cells(EndRow, 3))
For i = 1 To UBound(Arr)
MsgBox Arr(i, 1) & " - Оценка: " & Arr(i, 2)
Next i
End Sub
Благодарю за достойные уроки! Домашнее задание сделал так:
Sub Кнопка1_Щелчок()
Dim NameArray() As String
Dim i As Long
For i = 1 To Worksheets("Лист1").Cells(Rows.Count, 1).End(xlUp).row
ReDim NameArray(i)
NameArray(i) = ActiveSheet.Range("A" & i) & ": " & ActiveSheet.Range("B" & i)
MsgBox NameArray(i)
Next i
End Sub
Здравствуйте!
Большое спасибо за комментарий и отличное решение домашнего задания из этого видео! Если в дальнейшем будут какие-либо вопросы, всегда обращайтесь - буду рад помочь 😊
Хороших Вам выходных!
С уважением,
Билял
ReDim то зачем в данном коде? много лишней писанины
Dim i As Long
For i = 2 To Worksheets("Лист1").Cells(Rows.Count, 1).End(xlUp).Row
a = ActiveSheet.Range("A" & i) & ": " & ActiveSheet.Range("B" & i)
MsgBox a
Next i
Вот и все.
У вас макрос начинает выводить значения начиная с шапки, как я поняла из условия шапку выводить не нужно
Огромное спасибо за урок!! Постарался решить домашнее задание, результат получается, но скорее всего не очень рационально:
Sub Homework()
Dim NameArray()
Dim lboundVar As Long
Dim uboundVar As Long
lboundVar = 1
uboundVar = ThisWorkbook.Worksheets("лист1").Cells(Rows.Count, 2).End(xlUp).Row
uboundVar = uboundVar - 2
ReDim NameArray(lboundVar To uboundVar)
Dim i As Integer
Dim N As String
Dim M As Long
N = ThisWorkbook.Worksheets("лист1").Cells(2, 2)
M = ThisWorkbook.Worksheets("лист1").Cells(2, 3)
MsgBox " Студент " & N & " оценка " & M
For i = LBound(NameArray) To UBound(NameArray)
N = ThisWorkbook.Worksheets("лист1").Cells(2 + i, 2)
M = ThisWorkbook.Worksheets("лист1").Cells(2 + i, 3)
MsgBox " Студент " & N & " оценка " & M
Next i
End Sub
Билял, благодарю за отличный урок! И ура - я справился с ДЗ !!!
мне как чайнику даже понятно , круто спасибо !!!!
Спасибо за труд!
Спасибо за урок!
Отлично. Спасибо.
Все отлично, но для людей со слабым зрением (таким как у меня) и с большим трудом различающим текст на экране видео, может быть прикреплять к видео текст с примерами кода или картинки с крупным шрифтом. Сейчас мне приходится скачивать видео, средствами проигрывателя сохранять кадр как изображение, а потом в графическом редакторе рассматривать текст кода. Понятно, что кто хочет, тот - добьется. Но все же, если это не слишком затруднит Вас. В целом за материал спасибо, очень приятно слышать чистую речь.
MsgBox testArrays(LBound(testArrays)) - extract the value from the lower bound
MsgBox testArrays(UBound(testArrays)) - extract the value from the upper bound
Билял, спасибо за замечательный курс! Не то слово, что приятно) Я впечатлён Вашим преподношением материала в сериях роликов по VBA! Не останавливайтесь ни в коем случае: построение урока, с рассмотрением решений домашних заданий - замечательно. Скорость и прямота, без слов-паразитов, грамотное изложение - всё просто супер!!! Касаемо данного урока есть вопрос: при написании процедур я часто передаю параметры в другие процедуры, но ByVal не указываю, а просто передаю переменные и их типы! Это некорректно с моей стороны? Чем это чревато, если что?
Здравствуйте, Евгений!
Очень рад, что мой видеоканал Вам понравился! :)
Именно из-за того, что этот канал полезен и помогает людям, я настроен и в дальнейшем исключительно активно поддерживать его и выпускать еженедельно по субботам видео :)
Теперь касательно Вашего вопроса с ByRef и ByVal. Если вариант передачи данных в функцию или подпрограмму эксплицитно (прямо) не указывается, то VBA по умолчанию использует ByRef.
Проверить это Вы можете на следующем макросе:
Sub callingProc()
Dim rgA As Range, rgB As Range
Set rgA = Range("A1:A10")
Set rgB = rgA
Call helpProc(rgA)
MsgBox "Сперва: " & rgB.Address(False, False) & _
vbLf & "В итоге: " & rgA.Address(False, False)
End Sub
Private Sub helpProc(ByRef rgInputRange As Range)
Set rgInputRange = Range("F1:F10")
End Sub
Сделайте следующее:
1. Вставьте макрос в новый модуль
2. Запустите первую процедуру. Как можете заметить, поскольку во вспомогательной процедуре helpProc стоит настройка ByRef, то измененные значения были сохранены в передающую переменную вызывающей процедуры callingProc. Соответственно в нашем сообщении отображается новое значение, которое получилось в ходе обработки во вспомогательной процедуре.
3. Теперь поменяйте настройку ByRef во вспомогательной процедуре helpProc на ByVal и снова запустите первую процедуру. Теперь изменения полученных значений во вспомогательных процедуре никак не влияют на значения использованной для передачи данных переменной в callingProc. Соответственно в сообщении выводятся одинаковые адреса областей.
4. Теперь удалите настройку передачи данных полностью:
Private Sub helpProc(rgInputRange As Range)
Set rgInputRange = Range("F1:F10")
End Sub
Если Вы теперь запустите первую процедуру, то результат будет аналогичен тесту из пункта 2. Происходит это так, поскольку ByRef, как и было сказано, является настройкой по умолчанию.
В функциональном плане подобное имплицинтное указание настройки передачи значений особых минусов не имеет. Тем не менее, я бы посоветовал точно, эксплицитно указывать желаемую настройку по нескольким причинам:
- Улучшение читабельности кода
- Упрощение понимания кода для людей, которые впервые работают с данной процедурой
- Улучшение возможности дальнейшего развития кода и его оптимизации
- etc.
Надеюсь, я смог помочь Вам. Если будут какие-либо вопросы, всегда смело сразу обращайтесь, Евгений!
С уважением и хороших Вам выходных,
Билял
Добрый день, верно ли я понимаю, что для выполнения домашнего задания некоторые пользователи для определения верхней границы массива использовали Cells(Rows.Count, 2).End(xlUp).Row, вопрос, а для чего в таком случае нужны Lbound и Ubound? Я могу в цикле for сразу прописать: For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row , а Lbound и Ubound убрать из кода, что сократит его на половину, получается верхнюю границу динамического массива определяет не Ubound, а Cells(Rows.Count, 2).End(xlUp). Или же могу вообще прописать exit for при достижении в цикле пустой ячейки. Подскажите пожалуйста в чем смысл Lbound и UBound после мною вышеописанного? Спасибо!
Ps уже который сайт смотрю, видео, но не могу понять в итоге почему считается что Lbound и Ubound определяет границы динамического массива, когда по сути мы их задаем.
Хорошо все разложено, лично мне не хватило только одной маленькой детали preserv, хотя на этом уроке может и не нужно такое знание...
Здравствуйте, Роман!
И вправду, отличное замечание - можно было бы это ключевое слово также «захватить» в видео. С другой стороны, проблема заключается в том, что всегда стараюсь видео делать максимально короткими, насколько это возможно - особенно в случае с такими основополагающими видео.
Когда-нибудь позже я планирую снять абсолютно новый плейлист по VBA, который будет содержать в себе пересмотренные, еще более насыщенные видео и при этом всё так же максимально короткометражные. В этом планируемом плейлисте я обязательно включу упомянутый Вами Preserve 😊
С уважением,
Билял
Отлично объяснено, только не пойму почему нет примера с присвоением значений через testArray = Array (1, 2, 3,......)
Спасибо, курс очень информативный для новичка, много нового для себя узнаю, решил домашку двумя способами, меня интересует вопрос - пойдет ли в зачет первый способ с использованием обычного(не динамического) массива, вот он:
Sub homeWork1()
Dim testArray(1 To 500) As Long
Dim i As Long
For i = LBound(testArray) To ActiveWorkbook.Worksheets(1).Cells(Rows.count, 2).End(xlUp).Row - 1
testArray(i) = ActiveSheet.Range("C" & i + 1)
Next i
For i = LBound(testArray) To ActiveWorkbook.Worksheets(1).Cells(Rows.count, 2).End(xlUp).Row - 1
MsgBox ActiveSheet.Range("C" & i + 1).Offset(0, -1) & ": " & testArray(i)
Next i
End Sub
А вот второй способ, как и предполагалось, используется динамический массив:
Sub homeWork2()
Dim dynArr()
Dim lBoundVar As Long
Dim uBoundVar As Long
lBoundVar = 1
uBoundVar = ActiveWorkbook.Worksheets(1).Cells(Rows.count, 2).End(xlUp).Row - 1
ReDim dynArr(lBoundVar To uBoundVar)
Dim i As Integer
For i = LBound(dynArr) To UBound(dynArr)
MsgBox ActiveSheet.Range("C" & i + 1).Offset(0, -1) & " оценка: " & ActiveSheet.Range("C" & i + 1)
Next i
End Sub
Заранее благодарю за ответ!
Уважаемый Билял, подскажите, как с помощью массива сделать из диапазона ячеек сводную таблицу, то есть получить сумму всех повторяющихся строк и соответствующих им значений. Спасибо
Здравствуйте, Сергей!
Не совсем понятна поставленная задача. Вам нужно создать нечто на подобии функции Excel СУММЕСЛИ или СУММЕСЛИМН?
С уважением,
Билял
1) а можно ли указать тип данных для дин масива сразу при обьявлении?
Dim massive () as long
Вот так
2) а можно ли указать значения нижнего и верхнего предела массива переменной?
вот так?
dim massive (a to b) as long ?
Здравствуйте!
Хотел бы попросить помочь в решении задачи.
Дано:
1. в ячейке "А1" пишется слово "буква" или "цифра"
2. в столбце "В" в случайном порядке каждая ячейка содержит слово "буква" или "цифра" (диапазон ячеек в столбце "В" переменный)
3. в столбце "С" напротив "буква" или "цифра" столбца "В" указаны соответственно какие-либо буквы (а, б, е, я и т.п.) или цифры (1, 2, 4, 8 и т.п.)
Необходимо:
В зависимости от того, какое слово указано в ячейке "А1", в столбце "Е", начиная с ячейки "Е1", вывести весь перечень букв или цифр из столбца "С" в порядке их нахождения сверху-вниз.
Возможно ли решить эту задачу при помощи освещённых тем?
Здравствуйте, Роман!
Хочу предложить Вам следующее решение:
Sub answerToRomansQuestion()
Dim cellChecked As Range
If Range("A1") = "Буква" Then 'Сперва проверяем, какого формата данные нужны в столбце "Е"
For Each cellChecked In Range("C1:C" & Range("C" & Rows.Count).End(xlUp).Row) 'Для всех значений в столбце "С"
If IsNumeric(cellChecked) = False Then 'Если значение типа String, тогда записываем данные в столбец "Е"
If Range("E1") = "" Then
Range("E" & Range("E" & Rows.Count).End(xlUp).Row) = cellChecked 'Если "Е1" пуста, то без сдвига
Else:
Range("E" & Range("E" & Rows.Count).End(xlUp).Row).Offset(1, 0) = cellChecked 'Иначе со сдвигом
End If
End If
Next cellChecked
ElseIf Range("A1") = "Цифра" Then 'Всё тоже самое, только с цифрами, если в ячейке "А1" значение - "Цифра"
For Each cellChecked In Range("C1:C" & Range("C" & Rows.Count).End(xlUp).Row)
If IsNumeric(cellChecked) = True Then
If Range("E1") = "" Then
Range("E" & Range("E" & Rows.Count).End(xlUp).Row) = cellChecked
Else:
Range("E" & Range("E" & Rows.Count).End(xlUp).Row).Offset(1, 0) = cellChecked
End If
End If
Next cellChecked
End If
End Sub
Просто скопируйте и вставьте код в окно VBA, чтобы было нагляднее :)
В основе данного решения лежит фраза “IsNumeric”, которая позволяет проверить, какого типа являются проверяемые данные.
Фактически, в данном решении абсолютно не имеет значение столбец “B”, и всё зависит лишь от того, какого типа данные нам нужно отобразить (данная информация указана в ячейке «А1»).
На канале еще не было урока на тему IsNumeric, и теперь, благодаря Вашему примеру, вероятно одним из следующих уроков будет данная тема :)
Если у Вас остались вопросы - пишите! С удовольствие отвечу :)
С уважением,
ХБ
@@BilyalKhassenov Здравствуйте!
Спасибо большое вам за ответ и предложенный вариант решения задачи!
Но я виноват.. Это тот случай, когда желание упростить условие задачи, чтобы донести её суть до слушателя, искажает у последнего понимание этой сути.
Дело в том, что вместо слов "буква" и "цифра" могут быть абсолютно любые категории. Да и самих категорий может быть больше, чем две.
Попробую изложить условие задачи немного по-другому.
***
Дано:
1. в ячейке "А1" пишется слово "овощи" или "фрукты"
, или "ягоды".
2. в столбце "В" в случайном порядке каждая ячейка содержит слово "овощи" или "фрукты"
, или "ягоды" (диапазон ячеек в столбце "В" переменный)
. Например, В1=фрукты, В2=фрукты, В3=ягоды, В4=овощи, В5=фрукты и т.д.
3. в столбце "С" напротив "овощи" или "фрукты"
, или "ягоды" столбца "В" указаны соответственно какие-либо овощи (капуста, морковь и т.п.) или фрукты (яблоки, груши и т.п.)
, или ягоды (малина, черника и т.п.). Например, С1=бананы, С2=яблоки, С3=смородина, С4=картофель, С5=груши и т.д.
Необходимо:
В зависимости от того, какое слово указано в ячейке "А1", в столбце "Е", начиная с ячейки "Е1", вывести весь перечень овощей или фруктов, или ягод из столбца "С" в порядке их нахождения сверху-вниз. Т.е. при условии, что А1=фрукты, то для примеров из пп. 2 и 3: Е1=бананы, Е2=яблоки, Е3=груши и т.д.
***
Т.е. макрос должен работать, как функция ВПР в Excel. Только в отличие от этой функции он должен вернуть не одно лишь значение, а все.
Простите, что так много букв..)
Удалось!!!
Получился вот такой код:
Sub LikeVPR()
Dim SetCell As Range, MyRange As Range, MyCell As Range
Dim LstRow As Long
LstRow = Cells(Rows.Count, 2).End(xlUp).Row
Set MyRange = Range(Cells(1, 2), Cells(LstRow, 2))
Set SetCell = Range("a1")
Range("e1").Activate
For Each MyCell In MyRange
If MyCell = SetCell Then
ActiveCell = MyCell.Offset(0, 1)
ActiveCell.Offset(1, 0).Activate
End If
Next MyCell
Range("a1").Activate
End Sub
Здравствуйте, Роман!
Буквально сел написать свой вариант решения (не увидел, что Вы свой вариант уже написали), так что он готов и скидываю как альтернативу. Если интересно можете посмотреть, попробовать :)
Sub answerToRomansQuestion2()
Dim cellChecked As Range
For Each cellChecked In Range("B1:B" & Range("B" & Rows.Count).End(xlUp).Row) 'Проверяем категорию объекта
If cellChecked = Range("A1") Then 'Если категория объекта соответсвует категории, казанной в "А1", то
If Range("E" & Range("E" & Rows.Count).End(xlUp).Row).Address = Range("E1").Address And Range("E1") = "" Then
Range("E" & Range("E" & Rows.Count).End(xlUp).Row) = cellChecked.Offset(0, 1) 'Если "Е1" свободна, то в неё вносим первый об
Else:
Range("E" & Range("E" & Rows.Count).End(xlUp).Row + 1) = cellChecked.Offset(0, 1) 'Все остальные объекты вносятся с Row Offset = 1
End If
End If
Next cellChecked
End Sub
С уважением и хорошего вечера,
ХБ
P.S. Очень рад, что у Вас тоже удалось найти решение :)
@@BilyalKhassenov Спасибо вам большое!!! Теперь в моём модуле две процедуры для решения задачи с продуктами =)
А на самом деле ваши обучающие видео и ваши предложения вносят огромный вклад в оптимизацию и ускорение моего рабочего процесса и рабочего процесса моих товарищей! Ещё раз спасибо!
Есть ещё вопрос большой, но не по данной серии курса: из-за моей цели работать над универсальными программками, работающими на любой версии Office (32 или 64 бита) столкнулся с проблемой декларирования функций. Для меня это сложно к пониманию (. Не могли бы Вы подготовить, как Вы умеете!!! достойный материал на эту тему? Ещё раз спасибо за Ваши уроки!
Здравствуйте, Евгений!
Обязательно постараюсь снять видео на данную тему. Правда, не могу обещать, что оно вышло бы скоро, так как на ближайшие недели запланированы видео по теме пользовательских форм. Но, как было сказано, обязательно постараюсь сделать это как можно быстрее :)
Спасибо за Ваш комментарий, всегда пишите, если будут какие-либо вопросы :)
С уважением,
Билял
Билял Хасенов - Excel & VBA Спасибо за оценки и надежду на новые достойные вниманию уроки!!! Буду ждать их и вникать!!!
Как он быстро удалил кнопку? которую он создал первой на 10:35
Билял, где-то в твоих видео видел, но не могу найти сейчас: мне нужно выделить диапазон из заполненных ячеек в книге, как это сделать в VBA? У меня в книге несколько диапазонов разделены пустыми строками. Мне надо некоторые из них выделить и кое-что применить к выделенному) Там какая-то простая команда VBA, подскажи пожалуйста)
Здравствуйте, Юрий!
Думаю, Вы имеете ввиду CurrentRegion :)
@@BilyalKhassenov Да да, именно оно) Только что сам нашел его)) Спасибо!))
Не за что)
Спасибо.
по поводу дз: как быть, если в массиве данных есть пустые строки? Как через алгоритм if убрать из цикла эти строки?
вопрос №2: можно ли прописать код на остановку действующего макроса? например, я включил макрос и через пару сек понял, что хочу его отменить, и хочу сделать это через отдельную кнопочку, а не через зажимание esc - как это реализовать?
А у вас есть платный видео курс с более глубокими материалами и с дз?
Если в диапазоне с минус 5, то до нуля будут показываться числа -5 -4 -3 -2 -1 , а потом уже текст в ячейках от 0 до 5 ?
Билл, большое спасибо.
Sub test()
Dim ResAr()
Dim Name As String
Dim result As Long, ILostRow As Long
ILostRow = Cells(Rows.Count, 2).End(xlUp).Row
ReDim ResAr(2 To ILostRow)
For i = LBound(ResAr) To UBound(ResAr)
Name = Cells(i, 2)
result = Cells(i, 3)
MsgBox Name & " - " & result
Next i
End Sub
Можно ли засчитать такое решение домашнего задания?.. =)
Sub HomeWork1()
Dim LstRow As Long
Dim MyRng As Range
LstRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
For Each MyRng In Range(Cells(2, 1), Cells(LstRow, 1))
MsgBox MyRng & " -- " & MyRng.Offset(0, 1)
Next MyRng
End Sub
Здравствуйте, Роман!
Конечно, предложенное Вами решение, в принципе, выполняет поставленную задачу. Тем не менее, в данном домашнем задании задачей являлось решение проблемы при помощи Arrays как инструмента. Поэтому, если быть совсем «академически» честным, я бы подобное решение не засчитал :)
Тем не менее, это только сугубо теоретическое домашнее задание для закрепления темы Arrrays. В жизни же хороши любые методы, которые выполняют требуемый функционал, и Ваше решение, являющееся значительно более наглядным и простым для понимания, определенно имеет свои преимущества.
В любом случае, большое спасибо за Ваш предложенный вариант решения задачи! :)
С уважением
ХБ
P.S. С праздником Вас! :)
Здравствуйте.
Вот моё решение домашнего задания:
Option Explicit
Sub test()
Dim MarkArray () as Long
Dim Mark As Long
Dim Name As String
Dim i As Long
Dim lBoundV As Long
Dim uboundV As Long
lBoundV = Sheet1.UsedRange.Row
uboundV = Sheet1.UsedRange.Rows.Count - 1
ReDim MarkArray(lBoundV To uboundV)
For i = LBound(MarkArray) To UBound(MarkArray)
Mark = Range("C" & i + 1)
Name = Range("B" & i + 1)
MsgBox Name & " - Оценка: " & Mark
Next i
End Sub
Здравствуйте, Владимир!
Спасибо за Ваш вариант решения домашнего задания! Мне очень понравилось то, как Вы изящно использовали выражение UsedRange для нахождения индексов строк. Наверно, чуть позже всё-таки сниму еще один отдельный видеоролик посвященный теме UsedRange, поскольку уже несколько раз подписчики канала затрагивали данную тему в комментариях.
Хорошего Вам дня, Анатолий! :)
С уважением,
ХБ
@@BilyalKhassenov прочитав комментарии, я убедился в том, что в видеоуроках много велосипедов.
Когда вместо чисел будет текст, то в окне будет показываться текст в ячейках от 1 до 5 ?
Добрый день!
Есть ли возможность передавать процедуре в качестве параметров список других процедур, пусть даже фиксированное количество, но возможно ли это сделать и если да, то как?
Здравствуйте, Павел!
Спасибо за Ваш вопрос - он и вправду интересен и важен!
Передавать процедуре в качестве параметров список других процедур вполне возможно. Например, для этого можно использовать массивы. При этом учтите, что массивы всегда передаются в процедуры с параметрами с настройкой ByRef. Смотрите, вот пример - в нём мы передаём имена процедур в текстовом массиве во вспомогательную процедуру. Вставьте этот код в новый модуль и протестируйте:
Option Explicit
Sub mainSub()
'В основной процедуре создаем и заполняем массив именами трёх тестовых процедур
Dim arrListOfSubNames(1 To 3) As String
arrListOfSubNames(1) = "testSub1"
arrListOfSubNames(2) = "testSub2"
arrListOfSubNames(3) = "testSub3"
'Передаём массив во вспомогательную процедуру, которая запускает каждую из тестовых процедур
Call helpSubToCall(arrListOfSubNames)
End Sub
Sub helpSubToCall(ByRef arrSubNames() As String)
Dim intCounter As Integer
'Цикл по массивы и запуск тестовых процедур при помощи указания имени процедуры методу Run
For intCounter = LBound(arrSubNames) To UBound(arrSubNames)
Run arrSubNames(intCounter)
Next intCounter
End Sub
Sub testSub1()
MsgBox "1" 'Тестовая процедура 1
End Sub
Sub testSub2()
MsgBox "2" 'Тестовая процедура 2
End Sub
Sub testSub3()
MsgBox "3" 'Тестовая процедура 3
End Sub
Если будут вопросы - пишите! 😊
С уважением,
Билял
@@BilyalKhassenov Здравствуйте! Билял. Большое спасибо за оперативный ответ и огромное спасибо за его содержание, которое более чем превзошло мои ожидания! То что нужно! Успехов вам в вашем замечательном деле - просвещении и Удачи!
Здравствуйте! Полностью сама написала )
Sub HomeWork()
Dim dinArray()
Dim lBoundO As Long
Dim uBoundO As Long
Dim i As Long
Dim a As Long
Dim strName As String
a = 3
i = Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Row
lBoundO = 1
uBoundO = i - 2
ReDim dinArray(lBoundO To uBoundO)
Dim z As Integer
For z = LBound(dinArray) To UBound(dinArray)
strName = ActiveSheet.Range("B" & a).Offset(0, -1)
MsgBox strName & " оценка: " & Range("B" & a)
a = a + 1
Next z
End Sub
спс
16 сен 2022
Брат, а почему ты всегда ставишь девочкам хорошие оценки, а мальчикам плохие?
2021
Наверное, можно и так :))
Sub Education()
Dim vArr As Variant
Dim j As Long
vArr = Range("A1").CurrentRegion.Value
For j = 2 To UBound(vArr)
MsgBox vArr(j, 2) & "-" & "Оценка: " & vArr(j, 3)
Next j
End Sub
Мое решение задачи:
Sub dinarray()
Dim myarray()
Dim lboundval, uboundval As Long
Dim i As Long
Dim sh As Worksheet
Dim LastRow As Long
Set sh = ThisWorkbook.Worksheets("Лист2")
lboundval = 1
LastRow = sh.Cells(Rows.Count, 2).End(xlUp).Row
ReDim myarray(lboundval To LastRow - 1)
For i = LBound(myarray) To UBound(myarray)
myarray(i) = sh.Range("B" & i + 1) & " " & "Оценка:" & sh.Range("C" & i + 1)
MsgBox myarray(i)
Next i
End Sub
Всем привет! Нужно использовать информацию не одного, а двух предыдущих уроков))
Sub homework()
Dim lowerbound As Long
Dim upperbound As Long
lowerbound = 2
upperbound = ThisWorkbook.Worksheets(1).Range("C" & Rows.Count).End(xlUp).Row
ReDim dinamicarray(lowerbound To upperbound)
Dim i As Integer
For i = LBound(dinamicarray) To UBound(dinamicarray)
MsgBox Range("B" & i) & " - îöåíêà " & Range("C" & i)
Next i
End Sub
Блин, всё-таки мне надо на курсы записаться.
Sub homework()
Dim lBoundNames As Long
Dim uBoundNames As Long
Dim dynArrayNames()
Dim dynArrayGrades()
uBoundNames = 2
lBoundNames = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
uBoundGrades = 2
lBoundGrades = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
'MsgBox ActiveSheet.Range("A" & lBoundGrade)
ReDim dynArrayNames(uBoundNames To lBoundNames)
ReDim dynArrayGrades(uBoundGrades To lBoundGrades)
Dim i As Long
For i = LBound(dynArrayNames) To UBound(dynArrayNames)
If IsEmpty(ActiveSheet.Range("A" & i)) = False Then
dynArrayNames(i) = ActiveSheet.Range("A" & i)
'MsgBox dynArrayNames(i)
Else
'здесь можно выводить ошибку
End If
For j = i To i
If IsEmpty(ActiveSheet.Range("B" & j)) = False Then
dynArrayGrades(j) = ActiveSheet.Range("B" & j)
'MsgBox dynArrayGrades(j)
Else
'здесь можно записывать 0 в массив или выодить ошибку
End If
MsgBox "Студент: " & dynArrayNames(i) & ", Оценка: " & dynArrayGrades(j)
Next j
Next i
End Sub