Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в AppGallery >>

VBA Excel. Содержание рубрики

    Содержание рубрики VBA Excel на сайте «Время не ждёт». Систематизация статей по тематическим группам для ускорения поиска нужной информации по заданной теме.

    Знакомство с VBA Excel

    Методы VBA Excel

    Метод Application.Goto
    Метод Application.InputBox (синтаксис, параметры)
    Метод Application.Intersect (пересечение диапазонов)
    Метод Application.OnKey
    Метод Application.OnTime
    Метод Application.Union (объединение диапазонов)
    Метод Controls.Add пользовательской формы
    Метод CreateTextFile (синтаксис, параметры)
    Метод Find объекта Range
    Метод FindNext объекта Range
    Метод Hyperlinks.Add (создание гиперссылки)
    Метод OpenTextFile (синтаксис, параметры)
    Метод Range.AutoFill (автозаполнение ячеек)
    Метод Range.Insert (вставка со сдвигом ячеек)
    Метод Range.Justify (переупорядочивание текста)
    Метод Range.PasteSpecial (специальная вставка)
    Метод Range.Replace (замена текста в ячейках)
    Метод Range.Show
    Метод WorksheetFunction.Convert
    Метод WorksheetFunction.Match
    Метод WorksheetFunction.Sum
    Метод WorksheetFunction.SumIf
    Метод WorksheetFunction.SumIfs
    Метод WorksheetFunction.Transpose
    Метод WorksheetFunction.VLookup
    Методы Count, CountA и CountBlank
    Методы CountIf и CountIfs
    Методы очистки ячеек (Range.Clear и другие)
    Открытие сайта методом FollowHyperlink
    Создание новой книги
    Удаление ячеек со сдвигом (Range.Delete)

    Объект Range в VBA Excel

    Автоподбор высоты объединенной ячейки
    Автоподбор ширины объединенной ячейки
    Вставка пустой строки или столбца
    Вставка формулы в ячейку
    Выделенный диапазон ячеек (адрес, выбор, строки)
    Выравнивание текста в ячейке
    Вырезание, копирование и вставка ячеек (диапазонов)
    Диапазон ячеек и массив (обмен значениями)
    Диапазон ячеек пуст (определение)
    Значения ошибок в ячейках
    Объединение ячеек и его отмена
    Переменная диапазона ячеек (As Range)
    Примечание к ячейке
    Программное создание границ ячеек
    Размер ячейки (высота строки, ширина столбца)
    Свойства Column и Columns объекта Range
    Свойства Row и Rows объекта Range
    Свойство Areas объекта Range
    Свойство Cells объекта Range
    Свойство End объекта Range
    Свойство Range.Characters
    Свойство Range.CurrentRegion
    Свойство Range.Hidden
    Свойство Range.Offset
    Свойство Range.Resize (синтаксис, примеры)
    Свойство Range.Text
    Свойство Range.WrapText (перенос текста)
    Ссылка на несколько диапазонов
    Цвет текста (шрифта) в ячейке
    Цвет ячейки (заливка, фон)
    Узор (рисунок) в ячейке
    Форматирование текста в ячейке (объект Font)
    Ячейки (обращение, запись, чтение, очистка)

    Объекты VBA Excel

    Операторы в VBA Excel

    Переменные в VBA Excel

    Примеры кода VBA Excel

    Автоматическая запись текущей даты и времени
    Автоматическое заполнение интервала дат (периода)
    Бегущая, ползущая и танцующая строки
    Буфер обмена (копирование, вставка, очистка)
    Вставка рисунка в ячейку
    Выбор случайной ячейки из диапазона
    Генератор случайных чисел (Rnd и Randomize)
    Генерация документов (реестр, массив, бланк)
    Генерация документов и отчетов
    Добавление кнопки в контекстное меню
    Добавление строки в таблицу с сортировкой
    Заполнение формы из таблицы
    Запуск макроса при изменении ячейки
    Изменение свойств пользовательской формы
    Имитация движения и кликов мыши
    Квадратные ячейки (тетрадные клетки)
    Копирование данных с одного листа на другой
    Копирование и перемещение файлов
    Копирование строк по условию
    Номер последней заполненной строки
    Определение координат элемента массива
    Отбор неповторяющихся значений
    Отбор уникальных значений с помощью Collection
    Отбор уникальных значений с помощью Dictionary
    Открыта или закрыта книга (проверка состояния)
    Открытие файла другой программы из кода VBA Excel
    Ошибки в таблице – поиск и исправление
    Парсинг сайтов, html-страниц и файлов
    Перебор листов в книге
    Перемещение листа и его отмена
    Переход к ячейке по адресу из формулы
    Переход по ссылке к ячейке в другой книге
    Поиск значения в таблице
    Поиск и выделение дубликатов в столбце
    Пользовательская автоформа (создание)
    Проверить срок годности
    Проверка существования диаграммы
    Проверка существования листа
    Программное создание графика (диаграммы)
    Программное создание модуля
    Программное создание формы
    Работа с умной таблицей
    Расчет зарплаты за выбранный период
    Расчет рабочего времени
    Сбор данных из открытых книг
    Секундомер в ячейке рабочего листа
    Смена названия кнопки при нажатии
    Смещение умной таблицы вниз
    Создание простого тестового задания
    Создание таблицы (умной, обычной)
    Создание файлов
    Создание, копирование, перемещение папок
    Сортировка массива
    Сортировка таблицы (диапазона)
    Сохранение книг и листов в PDF
    Сохранение массива в текстовый файл
    Список папок
    Список файлов в папке
    Сравнение прайс-листов
    Сумма прописью (код пользовательской функции)
    Удаление книги из собственного кода
    Удаление непечатаемых символов
    Удаление повторяющихся значений в диапазоне ячеек
    Удаление пустых строк
    Удаление файлов
    Учет расхода воды и других ресурсов
    Число Пи (значение)
    Экспорт и импорт пользовательской формы

    Прочее в VBA Excel

    Работа с приложением Word

    Редактор VBA Excel

    События VBA Excel

    Функции в VBA Excel

    Возраст по дате рождения
    Изменение значений других ячеек из функции
    Пользовательская функция (синтаксис, компоненты)
    Проверка переменных и выражений
    Работа с текстом (функции)
    Удаление лишних пробелов (LTrim, RTrim, Trim)
    Функции Left, Mid, Right (вырезать часть строки)
    Функции Space, String и StrReverse
    Функция Beep API (звуковой сигнал, мелодия)
    Функция Choose (синтаксис, компоненты, примеры)
    Функция FileDateTime
    Функция Filter (фильтрация массива)
    Функция Format (синтаксис, параметры, примеры)
    Функция FreeFile
    Функция Hex
    Функция InputBox (синтаксис, параметры, значения)
    Функция InStr (синтаксис, параметры, примеры)
    Функция InStrRev (синтаксис, параметры, примеры)
    Функции Int и Fix
    Функция Join (синтаксис, параметры, значения)
    Функция MicroTimer
    Функция MsgBox (синтаксис, параметры, значения)
    Функция Replace (замена подстроки)
    Функция Shell
    Функция Split (синтаксис, параметры, значения)
    Функция StrComp (сравнение строк)
    Функция StrConv (смена регистра букв)
    Функция Switch (синтаксис, примеры)
    Функция Timer (примеры)
    Функция Val (примеры)
    Функция для вычисления факториала
    Функции для работы с датой
    Функция преобразования HTML-цвета в число
    Функции преобразования типов данных

    Циклы в VBA Excel

    Элементы управления в VBA Excel

    ComboBox – заполнение поля со списком
    ListBox – заполнение списка данными
    Заполнение списка ComboBox по условию
    Изменение цвета кнопки при наведении курсора
    Маска ввода в TextBox
    Привязка события к элементу управления
    Программное раскрытие ComboBox
    Размеры и расположение элементов управления
    Свойства SelStart, SelLength, SelText (TextBox)
    Свойство Picture элементов управления
    Сочетания клавиш для кнопок
    Удаление элементов ActiveX с рабочего листа
    Удаление элементов управления формы с листа
    Элемент управления CheckBox (флажок)
    Элемент управления ComboBox (поле со списком)
    Элемент управления CommandButton (кнопка)
    Элемент управления DTPicker
    Элемент управления Frame (рамка)
    Элемент управления Image
    Элемент управления Label (метка, надпись)
    Элемент управления ListBox (список)
    Элемент управления MultiPage
    Элемент управления OptionButton (переключатель)
    Элемент управления RefEdit (редактор ссылок)
    Элемент управления ScrollBar (полоса прокрутки)
    Элемент управления SpinButton (счетчик)
    Элемент управления TabStrip
    Элемент управления TextBox (текстовое поле)
    Элемент управления ToggleButton (выключатель)
    Элемент управления TreeView (древовидная структура)

    84 комментария для “VBA Excel. Содержание рубрики”

    1. Здравствуйте! У Вас нет темы по работе с фильтром. Можно проконсультироваться на этот счёт?

      1. Евгений

        Здравствуйте, Сергей!
        Задавайте вопрос, постараюсь ответить.

    2. Спасибо, Евгений! Имеется в Excel столбец с включённым автофильтром. Можно ли программно запустить окно фильтра для выбора значений? Т.е. не руками нажимать на иконку фильтра, а заставить окно открываться с помощью макроса. Спасибо за ответ.

      1. Евгений

        Да, это возможно:

        1. Большущее спасибо!!! Я перерыл кучу сайтов, но нигде на находил ответ на свой вопрос. Можно ещё, Евгений, Вас потревожу?
          Теперь как корректно отработать кнопки Ok и Отмена работы фильтра? Только на одном форуме нашёл способ — вставить в произвольной ячейке формулу, в которой присутствует поле из фильтрованного списка (например, Range(«B2»).FormulaR1C1 = «=RС[-1]»), а потом в событии листа Worksheet_Calculate() прописать команды, которые соответствуют нажатию кнопки OK. Всё хорошо, когда лист пустой. Но если на нём ещё есть формулы или нужно подправить значение в какой-то ячейке, то не знаю, как отследить, в какой момент запускался фильтр, а в какой — другие манипуляции.

          1. Евгений

            Сергей, уточните вопрос: нужно программно нажать кнопки Ok и Отмена или отследить, какая из них была нажата?

            1. Просто отследить, какая кнопка нажата.
              По предыдущему вопросу. Я вставил sendkeys… в конец макроса, который запускается при нажатии кнопки на листе. Окно фильтра появляется и тут же закрывается. А как сделать, чтобы окно осталось, и пользователь мог выбрать данные?

            2. Евгений, я разобрался, почему не выводилось окно с фильтром.

          2. Евгений

            Пример отслеживания нажатий кнопки «OK» автофильтра. На нажатие кнопки «Отмена» код не реагирует.

            Вставьте в стандартный модуль (в примере — Module1) объявление глобальной переменной и код процедуры для кнопки:

            В модуль листа:

            Range("A1").CurrentRegion можно заменить на имя таблицы.

            1. Евгений, а формулу в поле B2 оставлять или её можно удалить?

              1. Евгений

                Можно удалить, если в таблице есть другие формулы. Я изменил код процедуры Worksheet_Calculate() в предыдущем примере, чтобы она не реагировала на изменение формул, а только на нажатие кнопки «OK» автофильтра. Range("A1") — это ячейка с кнопкой фильтра.

    3. Евгений, спасибо за корректировку процедуры. Думаю, в ней и поле myString1 необязательно (и связанная проверка с ним), т.к. пользователь может выбрать все значения.
      Но… после команды SendKeys "%{DOWN}" событие Worksheet_Calculate() отрабатывается только один раз :(.

      1. Евгений

        Сергей, событие Worksheet_Calculate() не зависит от команды SendKeys "%{DOWN}". Ограничение стоит здесь:

        Код в процедуре Worksheet_Calculate() срабатывает только когда активна ячейка Range("A1"). Если заменить в этой строке Range("A1") на диапазон строки заголовков таблицы, тогда код будет срабатывать при любой активной ячейке в заголовке.

        В переменную myString записывается состояние таблицы до применения фильтра, в переменную myString1 — после применения. Затем их содержимое сравнивается: если они содержат разные значения — значит, фильтр был применен.

    4. Здравствуйте! может я не туда пишу. вопрос
      нужно посчитать кол-во строк в столбце «В» (от 100 до 5000) и вставить в формулу вместо 744
      table = Range("B2:C744")
      спасибо.

      1. Евгений

        Привет, Сергей!

        В столбце «B» не должно быть пустых ячеек до последней строки таблицы.

      1. Евгений

        Привет, Сергей!

    5. Спасибо за достаточно полную информацию.
      Был бы очень вам признателен, если бы вы подсказали:
      как изменить ширину блоков верхнего колонтитула.
      «Введена слишком длинная строка. Уменьшите число знаков.»
      При изменении шрифта с полужирного на обычный всё нормально
      воспринимается,
      Прошу прощения, если не по адресу.

    6. Владислав

      Добрый день! Никак не могу решить проблему с заблокированным автофильтром на защищенном макросом (нашел на форумах) листе. Подскажите пожалуйста, куда и какую строчку нужно добавить в макрос, чтобы при открытии файла был активен автофильтр:

      1. Евгений

        Добрый день, Владислав!
        Замените строку

        на

        1. Владислав

          Добрый день, Евгений!
          ОГРОМНОЕ СПАСИБО!!! :))

        2. Добрый день! Подскажите пожалуйста как ограничить выбор в фильтре столбца. (Чтоб в открывающемся окне списка можно было поставить только одну галку. И не было возможности «выбрать все»).

          1. Евгений

            Здравствуйте, Мари!
            По-моему, перенастроить встроенный автофильтр невозможно.

    7. Здравствуйте, помогите, пожалуйста, решить задачу((

      Разработать программу «Кредитный калькулятор» для расчета выплат по кредиту в условиях начисления процентов по аннуитетной схеме постнумерандо. Форма должна предусматривать ввод:
      1) сумма кредита, допустимы 2 знака после запятой;
      2) процентная ставка (годовая), допустимы 2 знака после запятой;
      3) количество периодов (месяцев), целое положительное число.
      Также форма должна содержать две кнопки:
      1) «Ok» (выполнить расчет, заполнить лист Excel, освободить форму и закончить работу программы);
      2) «Отмена» (освободить форму и закончить работу программы).
      На лист Excel следует вывести 5 колонок:
      1) номер периода;
      2) остаток кредита;
      3) сумма процентов за пользование кредитом, подлежащая к оплате;
      4) сумма погашения основного долга (кредита);
      5) общая сумма выплат за период.
      Форма должна быть открыта из макроса «main» и там же освобождена по завершению своего использования. Форма должна содержать только код работы с формой и ввода данных. Логика верификации данных должна быть, по возможности, отделена от кода формы. Бизнес-логика обязательно должна быть отделена от кода формы.

      1. Евгений

        Здравствуйте, Рафия!
        С разработкой кредитного калькулятора вам помогут только за плату на бирже фриланса.

    8. Добрый день, Евгений! Я только начинаю работать с VBA. Помогите, пожалуйста, прописать код для автоматического перемещения курсора на ячейку вправо после заполнения предыдущей.

      1. Евгений

        Здравствуйте, Ева! Для перемещения фокуса в ячейку справа код VBA не нужен: используйте для этого клавишу «Tab» или настройте клавишу «Enter» для перехода вправо (Файл >> Параметры >> Дополнительно).

        1. Спасибо за ответ! Да, но это надо делать вручную; речь идёт об автоматическом перемещении курсора.

          1. Евгений

            Этот код перемещает фокус с активной ячейки на ячейку справа:

    9. Добрый день, Евгений .
      Был бы очень вам признателен, если бы вы подсказали:
      как изменить ширину блоков верхнего колонтитула.
      «Введена слишком длинная строка. Уменьшите число знаков.»
      При изменении шрифта с полужирного на обычный всё нормально
      воспринимается,
      Прошу прощения, если не по адресу.

      1. Евгений

        Здравствуйте, Таер!
        Изменить максимальное количество знаков в колонтитуле невозможно. Попробуйте создать рисунок с надписью и вставить его в колонтитул: Вставка — Текст — Колонтитулы — Рисунок.

    10. Доброго времени суток. Помогите с написанием кода. Имеется диапазон с данными (A2:A4). В каждой из ячейки внесены данные. К каждой ячейке прикреплена фигура. Первоначально фигура имеет зеленый цвет. После выбора нужной ячейки фигура подкрашивается, а после переключения ячейки на др., фигура не возвращается в первоначальный цвет(Зеленый). Помогите написать код. Пример:

      1. Евгений

        Привет! Для пар «ячейка A2 — Oval 1»; «ячейка A3 — Oval 2»; «ячейка A4 — Oval 3»:

        1. Благодарю за ответ, Евгений. У меня таких овалов будет штук 30. Есть ли возможность сократить код?

          1. Евгений

            Все зависит от условий задачи. Например, если номер овала соответствует номеру строки соответствующей ему ячейки и нет лишних фигур на листе, тогда можно использовать следующий код:

            1. Доброго времени суток. Вопрос: Как сократить код если фигур на листе около 2000 и количество листов около 10 и на каждом объектов по 2000.Благодарю за ответ!

      2. Алексей

        Помогите разобраться, что такое Target? И как его использовать…

    11. Алексей

      Здравствуйте, Евгений!
      Подскажите как решить задачу: нужно при запуске макроса открывать другой файл «.csv». В нём в столбце А «переменная», в столбце B время (17.01.2022 4:00:01). Нужно найти ячейку с «переменной» и временем на 5 минут меньше чем ТЕКУЩЕЕ в системе, скопировать её значение и вставить в 1 файл в ячейку А1. Я так понимаю нужна функция Find, но не понимаю как в ней сделать увязку с текущим временем минус 5 минут.

      1. Евгений

        Добрый день, Алексей!
        Используйте функцию DateAdd:

    12. Добрый день.
      Из рабочей книги Excel с помощью макроса создается новая книга, в которую копируются данные, и переименовывается.
      Есть ли возможность, чтобы у этой новой книги задать в макросе альбомную ориентацию и вписать данные на одну страницу, а то каждый день приходится делать это в ручную.

      1. Евгений

        Здравствуйте, Сергей!

    13. Здравствуйте, Евгений.
      Спасибо за вашу помощь. С альбомной ориентацией все получилось.
      А что насчет вписать все эти данные на 1 лист, так как в режиме печати получается
      на 12 страниц.

      1. Евгений

        Попробуйте так:

    14. У меня объектов будет 400. И при написании для всех 400 фигур (овал и прямоугольники), пишет, что объёмный текст. Спасибо за ответ.

      1. Евгений

        Добрый день. Бываю, практически, каждый день, но отвечаю не на все комментарии.

        1. Евгений, буду глубоко признателен, если Вы поможете мне с проблемой описанной в посте выше!

          1. Евгений

            Попробуйте по группам фигур с последовательными номерами и одним присваиваемым цветом пройтись циклами:

    15. Добрый день.

      Как с вами связаться? Нужно за денежку естественно написать небольшой код по скачиванию определенной страницы с интернет через макрос эксель.

      1. Евгений

        Здравствуйте, Денис!
        Я не оказываю платные услуги. Вы можете обратиться на биржу фриланса.

    16. Здравствуйте Евгений.
      Отличный курс. Спасибо.
      Уточните пожалуйста. Имеются ли все статьи из рубрики VBA Excel в одном файле (word, pdf или другом), для изучения в оффлайн режиме.
      Буду признателен за помощь.

      1. Евгений

        Добрый день, Тамир!
        Все статьи только на сайте.

        1. Извините за длинное сообщение. Более проконсультироваться не у кого. А «диванные герои» ничего путевого не могут посоветовать.

          Изучая большое количество информации выявил следующее, что повергло меня в некое замешательство, так как не компетентен в отношении VBA:
          1) Многие статьи рекомендуют в параметрах программы Excel установить настройку безопасности макроса «Отключить все макросы с уведомлением» и активировать галочку «Доверять доступ к объектной модели проектов VBA».
          2) Так же некоторые статьи советуют редакторе Visual Basic в пункте Tools-Options на вкладке Editor установить галочку на параметр «Require Variable Declaration» и изменить зхначение «Tab Width» на 2.
          Уточните пожалуйста, нужно ли проводить данные настройки, либо использовать какие-либо другие манипуляции по настройке табличного редактора Excel и редактора Visual Basic?

          Далее о проблеме, по которой и нашел Ваш сайт.
          Имеется таблица Excel, созданная в версии 2003 и редактируемая, на сегодняшний день, в версии 2016. Таблица имеет несколько тысяч строк с десятками примечаний в каждой строке. Спустя много лет использования файла, большая часть примечания при открытии для редактирования оказывается на 2-5 тысяч строк ниже материнской ячейки. В ручную это все перетаскивать ну очень не удобно, вследствие чего решил написать макрос, который восстановит стандартное положение примечаний.

          Задача. Создать отдельную книгу Excel с макросом, которую можно будет переместить на другой компьютер и с помощью которой можно восcтановить расположение примечаний в проблемном файле.

          Здесь возникло огромное количество вопросов. Опишу процесс поэтапно и прошу поправить, если где-то что-то делаю некорректно.
          1) Создаю модуль insert-Module
          2) Двойной клик на Module1, в пункте Insert-Procedure выбираю Sub + Public, и тут не знаю, нужно ли устанавливать галочку «All local variables as Static»
          3) Далее в правом окне пишу код. Здесь в смятении, что писать, так как нашел много разных вариантов восстановления расположения примечаний.
          У меня получилось вот такие варианты кода, в которых сомневаюсь.
          Первый:

          Второй (без выполнения п.2):

          4) Закрываю редактор VBA.
          5) Закрываю файл Excel. здесь подтверждаю сохранение и соглашаюсь с политикой конфиденциальности.
          6) Переношу файл с макросом на другой компьютер, запускаю его.
          7) Запускаю проблемную книгу, перехожу на лист со сместившимися примечаниями, запускаю макрос.
          Правильно ли выбран порядок действий и как правильнее оформить код, на Ваш взгляд?

          Прошу помощи по всему вышенаписанному.
          Заранее благодарю.

          1. Евгений

            Здравствуйте, Тамир!

            1) Если вы планируете работать с VBA Excel, установите настройку безопасности «Включить все макросы (не рекомендуется, возможен запуск опасной программы)» и галочку «Доверять доступ к объектной модели проектов VBA». Незнакомые файлы Excel, например, полученные из Интернета, перед открытием проверяйте антивирусом.
            2) Параметр «Tab Width» задает количество пробелов, добавляемых при нажатии клавиши «Tab». Установите столько, сколько вам нравится. Я использую — 4.
            3) Ключевая фраза «Option Explicit» означает, что все используемые переменные должны быть заранее объявлены, — очень полезная вещь. Можно сделать так, чтобы запись «Option Explicit» в каждом новом модуле появлялась автоматически: Tools >> Options >> установить галочку у пункта «Recuire Variable Declaration».

            С файлом 2003 года попробуйте поступить так:
            1) Сделайте копию файла 2003 года и сохраните его как файл 2016 года с поддержкой макросов (.xlsm).
            2) Создайте модуль, а новую процедуру не создавайте. Просто скопируйте любую из двух процедур из вашего комментария и вставьте ее в модуль под ключевой фразой «Option Explicit».
            3) Запустите процедуру, нажав клавишу «F5» или кнопку «Run» (лист с примечаниями должен быть активным).

    17. Владимир

      Евгений, добрый день! Подскажите пожалуйста как написать код, чтобы поле со списком в форме раскрывалось при нажатии на самом поле, а не наводить курсор на стрелку справа. Спасибо

      1. Евгений

        Здравствуйте, Владимир!
        Добавьте следующую процедуру в модуль формы:

    18. Георгий

      Добрый день, Евгений!
      Разрабатываю учет договоров. Имеется ЛИСТ БАЗА. Есть такая задача: При вызове номера договора, в соответствующих полях UserForm отражается текущая информация по договору : ФИО, Сумма договора и Сумма по факту.
      Далее , делается некий расчет по Вариантам 1 и 2.
      Данные этого процесса при клике кнопки ДОБАВИТЬ ЗАПИСЬ необходимо на листе БАЗА, в таблице, внести в ячейки ТОГО ДОГОВОРА, НОМЕР КОТОРОГО БЫЛ ВЫЗВАН. А именно: ячейки в столбцах 37,38,39,40.
      И этот процесс необходим всякий раз ,когда производятся расчеты по вариантам 1 и 2 по любому договору из листа БАЗА.
      Сам сделал: при клике ДОБАВИТЬ НОВЫЙ КЛИЕНТ вставляется новая строка и в нее добавляются в эти ячейки необходимая инфо. А при клике ДОБАВИТЬ ЗАПИСЬ-нет, не получается. Мое мнение-что-то я не так делаю с переменными.
      Пробовал сам найти решение- не получается. Искал инфо- результат=0. Подскажите в чем тут загвоздка? Если понадобится могу выслать файл.

      Option Explicit
      Dim ShDog As Worksheet
      Dim DogListObj As ListObject
      Dim DogListRow As ListRow

      Sub RastorgjenieDog() 'добавление информации о расторжении в нужный договор
      Dim Cell As Range

      Set ShDog = ThisWorkbook.Worksheets("БАЗА") ' выход на лист с "Умной" таблицей
      Set DogListObj = ShDog.ListObjects("УчетДоговоров_tb") ' выход на "Умную" таблицу
      'Set DogListRow = DogListObj.ListRows. ' видимо проблема с созданием переменной((
      Set Cell = DogListObj.ListColumns.Item(7).Range.Find(Form_BAKU.NDogRastr.Value, LookAt:=xlWhole) ' поиск № договора в столбце

      If Not Cell Is Nothing Then 'Если найден Номер Договора
      DogListRow.Range(37) = Form_BAKU.AmountDogFaktRastr.Value ' вставка значений из UserForm в ячейки листа "БАЗА" ' видимо проблема с созданием переменной((
      DogListRow.Range(38) = Form_BAKU.PercentRastrAmountDog.Value
      DogListRow.Range(39) = Form_BAKU.AmountRastrAmountDog.Value
      DogListRow.Range(40) = Form_BAKU.PercentAmountDogFaktRastr.Value
      DogListRow.Range(41) = Form_BAKU.AmountRastrFaktAmountDog.Value
      DogListRow.Range(42) = Form_BAKU.SumKlientyPosleRastr.Value
      End If
      End Sub

      1. Евгений

        Добрый день, Георгий!
        Объявите эту переменную, когда можно будет извлечь номер строки:

        Cell.Row — номер строки рабочего листа
        (Cell.Row — n) — номер строки умной таблицы
        n — количество строк над первой строкой умной таблицы

        1. Георгий

          Добрый день, Евгений!
          Во-первых, Вам Огромная благодарность за проявленное внимание. Пытался создать переменные по вашему совету. Но..к сожалению, программа выдает ошибку (видимо у меня не получилось внести переменные Правильно). Пожайлуста, подскажите как все-таки должно все выглядеть, чтобы работало. Очень на Вас надеюсь. Спасибо заранее.
          Приведу пример, что я все-таки «натворил»

          Option Explicit
          Dim ShDog As Worksheet
          Dim DogListObj As ListObject
          Dim DogListRow As ListRow

          Sub RastorgjenieDog() 'добавление информации о расторжении в нужный договор
          Dim Cell As Range
          Dim n As Variant

          Set ShDog = ThisWorkbook.Worksheets("БАЗА") ' выход на лист с "Умной" таблицей
          Set DogListObj = ShDog.ListObjects("УчетДоговоров_tb") ' выход на "Умную" таблицу
          'Set DogListRow = DogListObj.ListRows. ' видимо проблема с созданием переменной((
          Set Cell = DogListObj.ListColumns.Item(7).Range.Find(Form_BAKU.NDogRastr.Value, LookAt:=xlWhole) ' поиск № договора в столбце

          If Not Cell Is Nothing Then 'Если найден Номер Договора
          Set DogListRow = DogListObj.ListRows.Item(Cell.Row - n) 'Здесь выдает ошибку

          DogListRow.Range(37) = Form_BAKU.AmountDogFaktRastr.Value ' вставка значений из UserForm в ячейки листа "БАЗА" ' видимо проблема с созданием переменной((
          DogListRow.Range(38) = Form_BAKU.PercentRastrAmountDog.Value
          DogListRow.Range(39) = Form_BAKU.AmountRastrAmountDog.Value
          DogListRow.Range(40) = Form_BAKU.PercentAmountDogFaktRastr.Value
          DogListRow.Range(41) = Form_BAKU.AmountRastrFaktAmountDog.Value
          DogListRow.Range(42) = Form_BAKU.SumKlientyPosleRastr.Value
          End If

          'Ваши комментарии:
          'Объявите эту переменную, когда можно будет извлечь номер строки:
          'If Not Cell Is Nothing Then 'Если найден Номер Договора
          'Set DogListRow = DogListObj.ListRows.Item(Cell.Row - n)
          'Cell.Row — номер строки рабочего листа
          '(Cell.Row — n) — номер строки умной таблицы
          'n — количество строк над первой строкой умной таблицы
          End Sub

          1. Евгений

            Здравствуйте, Георгий!
            Замените n на число строк, расположенных над первой строкой умной таблицы, включая шапку таблицы, например,
            Set DogListRow = DogListObj.ListRows.Item(Cell.Row - 2)
            если у вас две строки над первой строкой умной таблицы

            1. Георгий

              Спасибо за ответ, Евгений. Но, увы и это не работает. Я одно не пойму: зачем указывать число строк над таблицей если переменная — это номер договора и от него идет вся история. Повторюсь: Надо, чтобы некие данные попадали в нужные ячейки определенных столбцов при обращении к определенному номеру договора? Ладно, как говорится, будем искать….

              1. Евгений

                После присвоения объектной переменной Cell ссылки на ячейку

                выражение Cell.Row возвращает номер строки найденной ячейки на рабочем листе, а не в таблице. В умной таблице своя нумерация строк. Чтобы ваши данные добавились в строку умной таблицы с найденной ячейкой, надо вычислить номер строки умной таблицы, в которой находится найденная ячейка. Для этого необходимо из Cell.Row вычесть количество строк выше первой строки умной таблицы, включая строку заголовков, так как строка заголовков не входит в коллекцию ListRows.

                1. Георгий

                  Хорошо, если все так как Вы описываете правильно, то почему ваша конструкция не работает? Что я только не делал: и вычитал строки, и добавлял…Результат тот же -выдаёт ошибку. И все-таки это связано с неправильным присвоением переменных. Приведите, пожалуйста, вариант ПРАВИЛЬНОГО отображения переменных, в рамках данного примера. Может в этот раз сработает…Спасибо заранее.

                  1. Евгений

                    Как только вы передали код, я проверил его на своем компьютере. Все переменные работают. Если ошибка возникает на этой строке

                    проверьте, все ли работает у вас до этой строки:
                    1) начиная с этой строки и до End If всё закомментируйте (End If комментировать не нужно)
                    2) вставьте после строки

                    строку

                    3) запустите код из формы и посмотрите, отобразится ли адрес ячейки.
                    Если все будет нормально, нужная ячейка будет найдена, значит проблема где-то дальше.
                    Думаю, вам стоит переименовать переменную Cell, например, на MyCell, так как Cell — это, все-таки, ключевое слово в VBA.

                    1. Георгий

                      Добрый день, Евгений!
                      Все сделал так, как Вы посоветовали. Да, именно на этом этапе выдает ошибку:

                      Set DogListRow = DogListObj.ListRows.Item(Cell.Row — n) ‘Здесь выдает ошибку

                      Вставил
                      MsgBox Cell.Address
                      Да, адрес ячейки был найден правильно. И как Вы правильно заметили, проблема видимо дальше.

                      Далее, изменил Cell на MyCell. Результат=0. Все также выдает ошибку.
                      Теперь смотрите. У меня есть код по которому на листе с Умной таблицей происходит следующая процедура:
                      1. Ищется в строке ячейка с номером договора
                      2. После обнаружения, из определенных ячеек данные вносятся в TextBox UserForm.
                      Вот код:
                      Sub Search_NDogRastr() ‘ поиск информации по номеру договора на листе с Умной таблицей
                      Dim Cell As Range
                      Set ShDog = ThisWorkbook.Worksheets(«БАЗА») ‘ выход на лист с «Умной» таблицей
                      Set DogListObj = ShDog.ListObjects(«УчетДоговоров_tb»)

                      ‘поиск номера договора в Умной таблице
                      Set Cell = DogListObj.ListColumns.Item(7).Range.Find(Form_BAKU.NDogRastr.Value, LookAt:=xlWhole)
                      If Not Cell Is Nothing Then ‘Если найден Номер Договора

                      ‘ вставка значений из Умной таблицы по каждому договору в соответствующие TextBoxы UserForm
                      Form_BAKU.FIOKlientRastr.Value = Cell.Cells(1, 2)
                      Form_BAKU.AmountDogRastr.Text = Cell.Cells(1, 14)
                      Form_BAKU.AmountDogFaktRastr.Text = Cell.Cells(1, 31)
                      Form_BAKU.AmountRastrAmountDog.Text = Cell.Cells(1, 39)
                      Form_BAKU.AmountRastrFaktAmountDog.Text = Cell.Cells(1, 41)

                      End If

                      End Sub
                      И эта программа работает четко.
                      Теперь возьмем нашу «НЕрабочую» программу. Алгоритм тот же, но с той лишь разницей, что теперь данные нужно не из таблицы брать, а в таблицу вставлять из TextBox UserForm:
                      1. Ищется в строке ячейка с номером договора
                      2. После обнаружения, из определенных TextBox UserForm данные вносятся в определенные ячейки Необходимого договора.
                      Код программы:
                      Sub RastorgjenieDog() ‘добавление информации о расторжении в нужный договор

                      Dim Cell As Range
                      ‘Dim n As Long

                      Set ShDog = ThisWorkbook.Worksheets(«БАЗА») ‘ выход на лист с «Умной» таблицей
                      Set DogListObj = ShDog.ListObjects(«УчетДоговоров_tb») ‘ выход на «Умную» таблицу

                      ‘поиск номера договора в Умной таблице
                      Set Cell = DogListObj.ListColumns.Item(7).Range.Find(Form_BAKU.NDogRastr.Value, LookAt:=xlWhole) ‘ поиск № договора в столбце
                      If Not Cell Is Nothing Then ‘Если найден Номер Договора
                      MsgBox Cell.Address
                      ‘Set DogListRow = DogListObj.ListRows.Item(Cell.Row)

                      ‘ вставка значений из TextBox UserForm в определенные ячейки Умной таблицы для каждого найденного договора
                      DogListRow.Range(39) = Form_BAKU.AmountRastrAmountDog.Value
                      DogListRow.Range(37) = Form_BAKU.AmountDogFaktRastr.Value
                      DogListRow.Range(38) = Form_BAKU.PercentRastrAmountDog.Value / 100
                      DogListRow.Range(40) = Form_BAKU.PercentAmountDogFaktRastr.Value / 100
                      DogListRow.Range(41) = Form_BAKU.AmountRastrFaktAmountDog.Value
                      DogListRow.Range(42) = Form_BAKU.SumKlientyPosleRastr.Value

                      End If

                      End Sub
                      Очень похожий алгоритм и действия, но…..НЕ РАБОТАЕТ.
                      Может Вы увидите ПРОБЛЕМУ?

                      1. Евгений

                        Добрый день, Георгий!
                        Я и не знал, что так можно: Cell.Cells(1, 14) (я в таком случае использовал свойство Offset). Тогда вам переменная DogListRow не нужна, используйте вариант с Cells:

                        Возможно, где вы делите на 100, надо будет делимое преобразовать в числовой формат.

    Обсуждение закрыто.