Arrays VBA - Одна переменная для множества значений! - (Серия VBA 12)

แชร์
ฝัง
  • เผยแพร่เมื่อ 13 ม.ค. 2025

ความคิดเห็น • 79

  • @АндрейЛесников-з8ч
    @АндрейЛесников-з8ч 5 ปีที่แล้ว +11

    Мега-мега-мегаграмотное изложение материала и продуктивные уроки! Редкость на просторах интернета! Низкий Вам поклон за столь эффективное изложение материала по VBA! Вы педагог от Бога, продолжайте в том же духе! Низкий поклон за труды! Не поленюсь и напишу это коммент по каждым видео курса!!!

    • @BilyalKhassenov
      @BilyalKhassenov  5 ปีที่แล้ว +1

      Здравствуйте, Андрей!
      Со своей стороны точно также не поленюсь и поблагодарю Вас за этот приятный комментарий под каждым видео точно так же :)
      С уважением и хорошего Вам дня,
      ХБ

  • @bananamastersup
    @bananamastersup 3 ปีที่แล้ว +1

    Спасибо за серию этих видеоуроков! Все наглядно и понятно, предлагается самостоятельная работа, подача материала интересная и приятная. Всех благ автору!

  • @sinsmith9687
    @sinsmith9687 3 ปีที่แล้ว +3

    Шикарно =) После этого урока сразу решил свою проблему с массивами. Всех Благ.

  • @ИннаК-н3в
    @ИннаК-н3в 3 ปีที่แล้ว +2

    Билял, спасибо за уроки! Да, я справляюсь с домашними заданиями, очень интересно!

  • @lozovink
    @lozovink 4 ปีที่แล้ว +3

    ДЗ можно еще усложнить тем условием что например -- если неизвестно где в листе будет располагаться таблица с оценками .. и для начала автоматически определить диапазон её расположения))

  • @lozovink
    @lozovink 4 ปีที่แล้ว +1

    Уроки и подача превосходны! Спасибо Вам!

  • @abdulfarid89
    @abdulfarid89 4 ปีที่แล้ว +7

    Присоединяюсь к комментариям. действительно один из лучших каналов по обучению VBA!!!

    • @BilyalKhassenov
      @BilyalKhassenov  4 ปีที่แล้ว

      Здравствуйте, Фарид!
      Большое спасибо за Ваш комментарий 😊
      Хорошего Вам дня!
      С уважением,
      Билял

    • @abdulfarid89
      @abdulfarid89 4 ปีที่แล้ว

      @@BilyalKhassenov у меня еще вопрос. Как можно научиться вашему уровню знаний vba?в чем ваш секрет? Как обучились и что использовали?

  • @alegli8869
    @alegli8869 ปีที่แล้ว +1

    Для всех начинающих. Автору огромное спасибо за контент, но почти все варианты в комментариях ДЗ неверные. Ни кто не понял что от них хотят. Идея задания следующая - Создаем динамический массив, наполняем его данными, далее циклом выводим сообщение. Почти у всех объявлен массив, но не заполнен, и данные в программе берутся из листа книги а не из массива. По большому счету массив из этих примеров можно выкинуть и результат не измениться. Вот пример решение этой задачи при помощи массива, или смотрите следующее видео Автора.
    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

  • @RUSn9
    @RUSn9 4 ปีที่แล้ว +5

    Благодарю за достойные уроки! Домашнее задание сделал так:
    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

    • @BilyalKhassenov
      @BilyalKhassenov  4 ปีที่แล้ว +1

      Здравствуйте!
      Большое спасибо за комментарий и отличное решение домашнего задания из этого видео! Если в дальнейшем будут какие-либо вопросы, всегда обращайтесь - буду рад помочь 😊
      Хороших Вам выходных!
      С уважением,
      Билял

    • @deniswolf1846
      @deniswolf1846 3 ปีที่แล้ว

      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
      Вот и все.

    • @Irina-eo6et
      @Irina-eo6et 2 ปีที่แล้ว

      У вас макрос начинает выводить значения начиная с шапки, как я поняла из условия шапку выводить не нужно

  • @AraimRenmazuo
    @AraimRenmazuo 3 ปีที่แล้ว

    Огромное спасибо за урок!! Постарался решить домашнее задание, результат получается, но скорее всего не очень рационально:
    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

  • @Dmitrii-Zhinzhilov
    @Dmitrii-Zhinzhilov 3 ปีที่แล้ว +2

    Билял, благодарю за отличный урок! И ура - я справился с ДЗ !!!

  • @Serega_Zaicev
    @Serega_Zaicev 4 ปีที่แล้ว +1

    мне как чайнику даже понятно , круто спасибо !!!!

  • @SamSambl4
    @SamSambl4 4 ปีที่แล้ว +2

    Спасибо за труд!

  • @mariadergausova8412
    @mariadergausova8412 4 ปีที่แล้ว +2

    Спасибо за урок!

  • @V._A._S.
    @V._A._S. 3 ปีที่แล้ว +2

    Отлично. Спасибо.

  • @totohajudas7556
    @totohajudas7556 2 ปีที่แล้ว +1

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

  • @elnursh
    @elnursh ปีที่แล้ว

    MsgBox testArrays(LBound(testArrays)) - extract the value from the lower bound
    MsgBox testArrays(UBound(testArrays)) - extract the value from the upper bound

  • @Евгений-10.11
    @Евгений-10.11 4 ปีที่แล้ว +6

    Билял, спасибо за замечательный курс! Не то слово, что приятно) Я впечатлён Вашим преподношением материала в сериях роликов по VBA! Не останавливайтесь ни в коем случае: построение урока, с рассмотрением решений домашних заданий - замечательно. Скорость и прямота, без слов-паразитов, грамотное изложение - всё просто супер!!! Касаемо данного урока есть вопрос: при написании процедур я часто передаю параметры в другие процедуры, но ByVal не указываю, а просто передаю переменные и их типы! Это некорректно с моей стороны? Чем это чревато, если что?

    • @BilyalKhassenov
      @BilyalKhassenov  4 ปีที่แล้ว +8

      Здравствуйте, Евгений!
      Очень рад, что мой видеоканал Вам понравился! :)
      Именно из-за того, что этот канал полезен и помогает людям, я настроен и в дальнейшем исключительно активно поддерживать его и выпускать еженедельно по субботам видео :)
      Теперь касательно Вашего вопроса с 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.
      Надеюсь, я смог помочь Вам. Если будут какие-либо вопросы, всегда смело сразу обращайтесь, Евгений!
      С уважением и хороших Вам выходных,
      Билял

  • @deniswolf1846
    @deniswolf1846 3 ปีที่แล้ว +1

    Добрый день, верно ли я понимаю, что для выполнения домашнего задания некоторые пользователи для определения верхней границы массива использовали 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 определяет границы динамического массива, когда по сути мы их задаем.

  • @khrom-h7j
    @khrom-h7j 4 ปีที่แล้ว +2

    Хорошо все разложено, лично мне не хватило только одной маленькой детали preserv, хотя на этом уроке может и не нужно такое знание...

    • @BilyalKhassenov
      @BilyalKhassenov  4 ปีที่แล้ว +3

      Здравствуйте, Роман!
      И вправду, отличное замечание - можно было бы это ключевое слово также «захватить» в видео. С другой стороны, проблема заключается в том, что всегда стараюсь видео делать максимально короткими, насколько это возможно - особенно в случае с такими основополагающими видео.
      Когда-нибудь позже я планирую снять абсолютно новый плейлист по VBA, который будет содержать в себе пересмотренные, еще более насыщенные видео и при этом всё так же максимально короткометражные. В этом планируемом плейлисте я обязательно включу упомянутый Вами Preserve 😊
      С уважением,
      Билял

  • @АрменЖидрасян
    @АрменЖидрасян 3 ปีที่แล้ว

    Отлично объяснено, только не пойму почему нет примера с присвоением значений через testArray = Array (1, 2, 3,......)

  • @МихаилБуев-е1ш
    @МихаилБуев-е1ш 4 ปีที่แล้ว +1

    Спасибо, курс очень информативный для новичка, много нового для себя узнаю, решил домашку двумя способами, меня интересует вопрос - пойдет ли в зачет первый способ с использованием обычного(не динамического) массива, вот он:
    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
    Заранее благодарю за ответ!

  • @Российскийинтеллигент
    @Российскийинтеллигент 4 ปีที่แล้ว +1

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

    • @BilyalKhassenov
      @BilyalKhassenov  4 ปีที่แล้ว

      Здравствуйте, Сергей!
      Не совсем понятна поставленная задача. Вам нужно создать нечто на подобии функции Excel СУММЕСЛИ или СУММЕСЛИМН?
      С уважением,
      Билял

  • @ovmov3321
    @ovmov3321 2 ปีที่แล้ว

    1) а можно ли указать тип данных для дин масива сразу при обьявлении?
    Dim massive () as long
    Вот так
    2) а можно ли указать значения нижнего и верхнего предела массива переменной?
    вот так?
    dim massive (a to b) as long ?

  • @romankuznetsov3990
    @romankuznetsov3990 5 ปีที่แล้ว +2

    Здравствуйте!
    Хотел бы попросить помочь в решении задачи.
    Дано:
    1. в ячейке "А1" пишется слово "буква" или "цифра"
    2. в столбце "В" в случайном порядке каждая ячейка содержит слово "буква" или "цифра" (диапазон ячеек в столбце "В" переменный)
    3. в столбце "С" напротив "буква" или "цифра" столбца "В" указаны соответственно какие-либо буквы (а, б, е, я и т.п.) или цифры (1, 2, 4, 8 и т.п.)
    Необходимо:
    В зависимости от того, какое слово указано в ячейке "А1", в столбце "Е", начиная с ячейки "Е1", вывести весь перечень букв или цифр из столбца "С" в порядке их нахождения сверху-вниз.
    Возможно ли решить эту задачу при помощи освещённых тем?

    • @BilyalKhassenov
      @BilyalKhassenov  5 ปีที่แล้ว +3

      Здравствуйте, Роман!
      Хочу предложить Вам следующее решение:
      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, и теперь, благодаря Вашему примеру, вероятно одним из следующих уроков будет данная тема :)
      Если у Вас остались вопросы - пишите! С удовольствие отвечу :)
      С уважением,
      ХБ

    • @romankuznetsov3990
      @romankuznetsov3990 5 ปีที่แล้ว +1

      ​@@BilyalKhassenov Здравствуйте!
      Спасибо большое вам за ответ и предложенный вариант решения задачи!
      Но я виноват.. Это тот случай, когда желание упростить условие задачи, чтобы донести её суть до слушателя, искажает у последнего понимание этой сути.
      Дело в том, что вместо слов "буква" и "цифра" могут быть абсолютно любые категории. Да и самих категорий может быть больше, чем две.
      Попробую изложить условие задачи немного по-другому.
      ***
      Дано:
      1. в ячейке "А1" пишется слово "овощи" или "фрукты"
      , или "ягоды".
      2. в столбце "В" в случайном порядке каждая ячейка содержит слово "овощи" или "фрукты"
      , или "ягоды" (диапазон ячеек в столбце "В" переменный)
      . Например, В1=фрукты, В2=фрукты, В3=ягоды, В4=овощи, В5=фрукты и т.д.
      3. в столбце "С" напротив "овощи" или "фрукты"
      , или "ягоды" столбца "В" указаны соответственно какие-либо овощи (капуста, морковь и т.п.) или фрукты (яблоки, груши и т.п.)
      , или ягоды (малина, черника и т.п.). Например, С1=бананы, С2=яблоки, С3=смородина, С4=картофель, С5=груши и т.д.
      Необходимо:
      В зависимости от того, какое слово указано в ячейке "А1", в столбце "Е", начиная с ячейки "Е1", вывести весь перечень овощей или фруктов, или ягод из столбца "С" в порядке их нахождения сверху-вниз. Т.е. при условии, что А1=фрукты, то для примеров из пп. 2 и 3: Е1=бананы, Е2=яблоки, Е3=груши и т.д.
      ***
      Т.е. макрос должен работать, как функция ВПР в Excel. Только в отличие от этой функции он должен вернуть не одно лишь значение, а все.
      Простите, что так много букв..)

    • @romankuznetsov3990
      @romankuznetsov3990 5 ปีที่แล้ว +1

      Удалось!!!
      Получился вот такой код:
      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

    • @BilyalKhassenov
      @BilyalKhassenov  5 ปีที่แล้ว +2

      Здравствуйте, Роман!
      Буквально сел написать свой вариант решения (не увидел, что Вы свой вариант уже написали), так что он готов и скидываю как альтернативу. Если интересно можете посмотреть, попробовать :)
      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. Очень рад, что у Вас тоже удалось найти решение :)

    • @romankuznetsov3990
      @romankuznetsov3990 5 ปีที่แล้ว +1

      @@BilyalKhassenov Спасибо вам большое!!! Теперь в моём модуле две процедуры для решения задачи с продуктами =)
      А на самом деле ваши обучающие видео и ваши предложения вносят огромный вклад в оптимизацию и ускорение моего рабочего процесса и рабочего процесса моих товарищей! Ещё раз спасибо!

  • @Евгений-10.11
    @Евгений-10.11 4 ปีที่แล้ว +2

    Есть ещё вопрос большой, но не по данной серии курса: из-за моей цели работать над универсальными программками, работающими на любой версии Office (32 или 64 бита) столкнулся с проблемой декларирования функций. Для меня это сложно к пониманию (. Не могли бы Вы подготовить, как Вы умеете!!! достойный материал на эту тему? Ещё раз спасибо за Ваши уроки!

    • @BilyalKhassenov
      @BilyalKhassenov  4 ปีที่แล้ว +1

      Здравствуйте, Евгений!
      Обязательно постараюсь снять видео на данную тему. Правда, не могу обещать, что оно вышло бы скоро, так как на ближайшие недели запланированы видео по теме пользовательских форм. Но, как было сказано, обязательно постараюсь сделать это как можно быстрее :)
      Спасибо за Ваш комментарий, всегда пишите, если будут какие-либо вопросы :)
      С уважением,
      Билял

    • @Евгений-10.11
      @Евгений-10.11 4 ปีที่แล้ว +1

      Билял Хасенов - Excel & VBA Спасибо за оценки и надежду на новые достойные вниманию уроки!!! Буду ждать их и вникать!!!

  • @magog08mag40
    @magog08mag40 2 ปีที่แล้ว

    Как он быстро удалил кнопку? которую он создал первой на 10:35

  • @ЮрийКривцов-ъ9ф
    @ЮрийКривцов-ъ9ф 4 ปีที่แล้ว +1

    Билял, где-то в твоих видео видел, но не могу найти сейчас: мне нужно выделить диапазон из заполненных ячеек в книге, как это сделать в VBA? У меня в книге несколько диапазонов разделены пустыми строками. Мне надо некоторые из них выделить и кое-что применить к выделенному) Там какая-то простая команда VBA, подскажи пожалуйста)

    • @BilyalKhassenov
      @BilyalKhassenov  4 ปีที่แล้ว +1

      Здравствуйте, Юрий!
      Думаю, Вы имеете ввиду CurrentRegion :)

    • @ЮрийКривцов-ъ9ф
      @ЮрийКривцов-ъ9ф 4 ปีที่แล้ว +1

      @@BilyalKhassenov Да да, именно оно) Только что сам нашел его)) Спасибо!))

    • @BilyalKhassenov
      @BilyalKhassenov  4 ปีที่แล้ว +1

      Не за что)

  • @kind-reminder
    @kind-reminder 3 ปีที่แล้ว

    Спасибо.
    по поводу дз: как быть, если в массиве данных есть пустые строки? Как через алгоритм if убрать из цикла эти строки?
    вопрос №2: можно ли прописать код на остановку действующего макроса? например, я включил макрос и через пару сек понял, что хочу его отменить, и хочу сделать это через отдельную кнопочку, а не через зажимание esc - как это реализовать?

  • @давидмаргарян-ю1ч
    @давидмаргарян-ю1ч 4 ปีที่แล้ว

    А у вас есть платный видео курс с более глубокими материалами и с дз?

  • @ИИванов-ь6с
    @ИИванов-ь6с 4 ปีที่แล้ว

    Если в диапазоне с минус 5, то до нуля будут показываться числа -5 -4 -3 -2 -1 , а потом уже текст в ячейках от 0 до 5 ?

  • @Shama-m7b
    @Shama-m7b 4 ปีที่แล้ว +4

    Билл, большое спасибо.
    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

  • @romankuznetsov3990
    @romankuznetsov3990 5 ปีที่แล้ว +2

    Можно ли засчитать такое решение домашнего задания?.. =)
    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

    • @BilyalKhassenov
      @BilyalKhassenov  5 ปีที่แล้ว +2

      Здравствуйте, Роман!
      Конечно, предложенное Вами решение, в принципе, выполняет поставленную задачу. Тем не менее, в данном домашнем задании задачей являлось решение проблемы при помощи Arrays как инструмента. Поэтому, если быть совсем «академически» честным, я бы подобное решение не засчитал :)
      Тем не менее, это только сугубо теоретическое домашнее задание для закрепления темы Arrrays. В жизни же хороши любые методы, которые выполняют требуемый функционал, и Ваше решение, являющееся значительно более наглядным и простым для понимания, определенно имеет свои преимущества.
      В любом случае, большое спасибо за Ваш предложенный вариант решения задачи! :)
      С уважением
      ХБ
      P.S. С праздником Вас! :)

  • @vladimirk.5371
    @vladimirk.5371 5 ปีที่แล้ว +2

    Здравствуйте.
    Вот моё решение домашнего задания:
    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

    • @BilyalKhassenov
      @BilyalKhassenov  5 ปีที่แล้ว +1

      Здравствуйте, Владимир!
      Спасибо за Ваш вариант решения домашнего задания! Мне очень понравилось то, как Вы изящно использовали выражение UsedRange для нахождения индексов строк. Наверно, чуть позже всё-таки сниму еще один отдельный видеоролик посвященный теме UsedRange, поскольку уже несколько раз подписчики канала затрагивали данную тему в комментариях.
      Хорошего Вам дня, Анатолий! :)
      С уважением,
      ХБ

    • @РишатСулейманов-ф4ъ
      @РишатСулейманов-ф4ъ 8 หลายเดือนก่อน

      @@BilyalKhassenov прочитав комментарии, я убедился в том, что в видеоуроках много велосипедов.

  • @ИИванов-ь6с
    @ИИванов-ь6с 4 ปีที่แล้ว

    Когда вместо чисел будет текст, то в окне будет показываться текст в ячейках от 1 до 5 ?

  • @ZigZagUdachich
    @ZigZagUdachich 4 ปีที่แล้ว +3

    Добрый день!
    Есть ли возможность передавать процедуре в качестве параметров список других процедур, пусть даже фиксированное количество, но возможно ли это сделать и если да, то как?

    • @BilyalKhassenov
      @BilyalKhassenov  4 ปีที่แล้ว +1

      Здравствуйте, Павел!
      Спасибо за Ваш вопрос - он и вправду интересен и важен!
      Передавать процедуре в качестве параметров список других процедур вполне возможно. Например, для этого можно использовать массивы. При этом учтите, что массивы всегда передаются в процедуры с параметрами с настройкой 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
      Если будут вопросы - пишите! 😊
      С уважением,
      Билял

    • @ZigZagUdachich
      @ZigZagUdachich 4 ปีที่แล้ว

      @@BilyalKhassenov Здравствуйте! Билял. Большое спасибо за оперативный ответ и огромное спасибо за его содержание, которое более чем превзошло мои ожидания! То что нужно! Успехов вам в вашем замечательном деле - просвещении и Удачи!

  • @marinaalbert2537
    @marinaalbert2537 3 ปีที่แล้ว +1

    Здравствуйте! Полностью сама написала )
    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

  • @yellowmoonishka1725
    @yellowmoonishka1725 10 หลายเดือนก่อน

    спс

  • @user-en8ko2vd1k
    @user-en8ko2vd1k 2 ปีที่แล้ว

    16 сен 2022

  • @Alexey9175
    @Alexey9175 2 หลายเดือนก่อน

    Брат, а почему ты всегда ставишь девочкам хорошие оценки, а мальчикам плохие?

  • @АлексейСоков-ь8и
    @АлексейСоков-ь8и 3 ปีที่แล้ว +1

    2021

  • @RUSn9
    @RUSn9 4 ปีที่แล้ว

    Наверное, можно и так :))
    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

  • @НатальяБелова-у8я
    @НатальяБелова-у8я 2 ปีที่แล้ว

    Мое решение задачи:
    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

  • @СергейЖуков-ш2щ
    @СергейЖуков-ш2щ ปีที่แล้ว

    Всем привет! Нужно использовать информацию не одного, а двух предыдущих уроков))
    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

  • @Правда-е3ы
    @Правда-е3ы 10 หลายเดือนก่อน

    Блин, всё-таки мне надо на курсы записаться.

  • @Sergio-gr6ro
    @Sergio-gr6ro 10 หลายเดือนก่อน

    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