Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Нужна консультация по среде MS Visual Basic 6.0, обноление exe файла
 
Добрый день.

Нужна консультация по среде программирования MS Visual Basic 6.0. Макрос написан в ней. В папке лежат файлы с кодом (расширением bas), с интерфейсом (расширение frm). Есть один файл c расширением vbp, при запуске которго можно видеть и код, и интерфейс. Сам макрос запускается файлом с расширением exe.

В код были внесены изменения. Как правильно нужно обновить файл exe, чтобы макрос работал по новому коду? Пытаюсь делать через File - > Make *название файла*.exe. Выдает ошибку "Can't find project or library"
Изменено: alexpet - 05.02.2024 14:36:07
Цикл For-Next работает, а For Each - нет, ошибка Type mismatch
 
Добрый день! Подскажите, пожалуйста.

Необходимо в книге Excel найти лист с определнным именем и "убить" на нем все формулы. Реализовано через цикл For-Next, который нормально работает.
Код
Dim Name1 As Variant

For Name1 = 1 To Worksheets.Count
    If Worksheets(Name1).Name = "Расчёты" Then
    ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value
    End If
Next Name1

Хочу реализовать задачу более компактным образом, через For-Each. Не работает, выдает ошибку Type mismatch. Почему это происходит?
Код
Dim Name1 As Variant

For Each Name1 In Sheets
    If Worksheets(Name1).Name = "Расчёты" Then ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value
Next 

Вот так тоже аналогичная ошибка
Код
Dim Name1 As Variant

For Each Name1 In Sheets
    If Worksheets(Name1).Name = "Расчёты" Then Worksheets("Расчёты").UsedRange.Value = Worksheets("Расчёты").UsedRange.Value
Next 
Изменено: alexpet - 06.10.2023 17:03:02
VBA - Поиск номеров строк и столбцов по содержимому ячейки, Наиболее грамотное и изящное решение
 
Доброго времени суток!

Я только начинаю погружаться в VBA, сейчас пишу второй в жизни макрос после дипломного. Подскажите, пожалуйста, один момент.

В самом начале алгоритма для решения моей задачи необходимо выявить номера строк и столбцов областей, на которые я буду цеплять данные и формировать сводные таблицы. Делаю это с помощью циклов For Next, как нас учили. Всё работает нормально. Но может есть более изящное и грамотное решение с точки зрения технологии программирования? Например через цикл For Each, (не очень хорошо понимаю, как он работает, если нужно записать в переменные номера строк и столбцов найденных значений). Или может вообще это можно сделать без цикла, стандартной функцией?

Для определения первой и последней строки фрагмента таблицы, с которым в дальнейшей будете работать, вы бы использовали нижеприведенный код или что-то другое? Особенное если хотелось бы сделать его более универсальным, без прописывания количества итераций. Private использован потому что у меня в модуле несколько процедур.
Код
'Для поиска номера строки, в которой начинаются начисления (контрольное слово 1. Начислено)
Private fRow1 As Integer

'Для поиска номера строки, в которой заканчиваются начисления (контрольное слово Всего начислено)
Private fRow2 As Integer

'Поиск номера строки, в которой начинаются начисления, проверка, тот ли файл указан (по слову 1. Начислено)

For fRow1 = 1 To 20
    If Cells(fRow1, 2).Value = "1. Начислено" Then
    Exit For
    End If
Next fRow1

'Если нужного слова нет, значит не тот файл, выводим сообщение и прекращаем макрос
If fRow1 = 21 Then
    MsgBox "Ошибка! Некоректный файл Начислений-Удержаний, программа будет прекращена. Выберите корректный файл ""Свод начислений и удержаний"" и повторите попытку.", vbExclamation, "Упс!"
    End
End If

'Поиск номера строки, в которой заканчиваются начисления, по записи "Всего начислено"
For fRow2 = 20 To 1000
    If Cells(fRow2, 2).Value = "Всего начислено" Then
    Exit For
    End If
Next fRow2
Или, к примеру, если нужно найти в шапке другой таблицы номера столбцов для формирования сводной, есть ли более грамотный и компактный вариант? Нижеприведенный нормально работает. А вы бы как сделали?

ShRowFot - ранее определённый аналогичным методом номер строки, в которой находится шапка.
Код
'Поиск номера столбца, в котором расположены Элементы
For ColElem = 1 To 20
    If Cells(ShRowFot, ColElem).Value = "Элемент" Then
    Exit For
    End If
Next ColElem


'Поиск номера столбца, в котором содержится ключевое слово "Графа 7 (всего)"
For ColGr7 = 1 To 20
    If Cells(ShRowFot, ColGr7).Value = "Графа 7 (всего)" Then
    Exit For
    End If
Next ColGr7

И не подскажете ли хорошую книгу по VBA для начинающих, где доступным языком будет прописана лексика различных команд и будет большой перечень причин стандартных ошибок (когда выводится системное сообщение).
Изменено: alexpet - 29.04.2023 22:20:14
Особенности ссылок на книгу с макросом в VBA, проблемы с VLOOKUP ошибка 1004 Application-defined or object-defined errror
 
Добрый день!  Снова вынужден обратиться за помощью.

Я сделал макрос, который делает суммирование статей начисления заработной платы  по определённым признакам, в указанным в справочнике.
Фрагмент кода, где на выгрузку с начислениями подтягиваются данные их Справочника (внешнего файла) .
fRow1, fRow2, ColEnd - переменные для диапазонов вставки данных формулы. List1 - переменная для листа в книге с отчетом, который нужно обработать.

Переменную для листа Спр1 не объявляю, он нужен только один раз, ссылаюсь прямо на него в формуле.

В этом случае все работает идеально.
Код
List1.Range(Cells(fRow1 + 1, ColEnd + 1), Cells(fRow2 - 1, ColEnd + 1)).Value = "=VLOOKUP(A" & fRow1 + 1 & ",[Справочник.xlsx]Спр1!$A:$F,5,FALSE)"

Для оптимизации и удобства добавил справочную таблицу в тот же файл, где содержится макрос (Свод_начисления-удержания_2.0.xlsm),  Меняю код на...

Выдает ошибку 1004 Application-defined or object-defined errror.

В чем может быть причина? Есть какие-то особенности при использовании ссылок на книгу, где содержится макрос?
Код
List1.Range(Cells(fRow1 + 1, ColEnd + 1), Cells(fRow2 - 1, ColEnd + 1)).Value = "=VLOOKUP(A" & fRow1 + 1 & ",[Свод_начисления-удержания_2.0.xlsm]Спр1!$A:$F,5,FALSE)"
СУММЕСЛИМН в VBA, не могу понять, в чем ошибка
 
Добрый день. Помогите, пожалуйста, целый день провозился, не могу понять, в чем дело.

Необходимо в ячейке сделать расчет аналогичный формуле СУММЕСЛИМН. Ниже приведен фрагмент кода. Все переменные объявлены и инициированы (проверял командой Debug.Print). При выполнении кода на данной сроке выдается ошибка 424 Object required. В чем может быть причина?
Пробовал вместо переменных проставить фиксированные координаты ячеек. Не помогает.

ColEnd - это последний столбец таблицы
fRow1 + 1 - с какой строки начинаем брать данные для суммирования и условия
fRow2 - 1 - на какой строке заканчиваем
7 - условие для суммирования. Пробовал его указывать без кавычек и как "=7". Не помогло

Range(Cells(fRow1 + 1, ColEnd), Cells(fRow2 - 1, ColEnd))) - диапазон чисел, которые будут просуммированы
Range(Cells(fRow1 + 1, ColEnd + 1), Cells(fRow2 - 1, ColEnd + 1)) - диапазон условий
7 - значение в диапазоне условий, которые нужно просуммировать.

И как к этой формуле сразу прицепить деление на 1000 с округлением до 1-го знака?

Код
List1.Cells(1, ColEnd + 6).Value = WorksheetFunction.SumIfs((Range(Cells(fRow1 + 1, ColEnd), Cells(fRow2 - 1, ColEnd))), Range(Cells(fRow1 + 1, ColEnd + 1), Cells(fRow2 - 1, ColEnd + 1)), "7")
Записать в переменную окончание имени файла
 
Добрый день. Подскажите, пожалуйста, никак не могу сообразить.

Есть набор файлов типа

БУ__Отчет_о_детализации_затраты после закрытия_субъект_1 кв. 2022.xls
БУ__Отчет_о_детализации_затраты после закрытия_субъект_6 мес. 2022.xls
БУ__Отчет_о_детализации_затраты до закрытия_департамент_год 2022.xls

Необходим универсальный код, который бы записывал в переменную "хвост" этого файла. Т.е. нужно выцепить всё, что между последним "_" и точкой перед расширением. - 1 кв. 2022, 6 мес. 2022, 12 мес. 2022

Как это можно сделать?
Изменено: alexpet - 16.08.2022 18:53:07
Прекращение всех процедур в модуле VBA
 
Добрый день! Подскажите, пожалуйста, одну вещь.

Есть макрос, который разбит на три процедуры. Процедуры запускаются отдельной процедурой:

Sub Start()

Call Proc1
Call Proc2
Call Proc3

End Sub

В середине Второй процедуры провожу проверку наличия на листе ошибки #Н/Д. При обнаружении - процедура прекращается. Код там такой:

Set ND = IzbrSvod.Range(Cells(2, ColEnd + 1), Cells(RowEnd ColEnd + 5)).Find("#N/A", , xlValues, xlPart)
If ND Is Nothing Then
Else
MsgBox "Отсутствуют необходимые значения. Программа будет прекращена", vbExclamation, "Внимание!"
Exit Sub
End If

Всё работает нормально, если запускать отдельно процедуру. Если же запускать макрос целиком, то при наличии ошибки далее пойдет выполнение Третьей процедуры.

Как прекратить все процедуры в модуле при наступлении условия ND?
Деление столбца данных в VBA с округлением
 
Добрый день. Подскажите, пожалуйста, одну вещь.

Есть таблица с количеством столбцов ColEndSTsub и строк RowEndSTsub. Необходимо справа от таблицы вставить данные из последнего столбца, поделенные на 1000 и округленные до 3 знака.

Вот этот метод работает нормально:

Sheets("Итоги_Субъекты").Range(Cells(2, ColEndSTsub + 1), Cells(RowEndSTsub, ColEndSTsub + 1)).Value = "=ROUND(RC[-1]/1000,3)

Но если я хочу сразу вставить значения, то как это сделать? Можно ли как-то применить WorksheetFunction, чтобы столбец сразу заполнились значениями, без формул?
Изменено: alexpet - 05.08.2022 20:44:23
ВПР в VBA для всего столбца
 
Добрый день!

Только начинаю изучать VBA. Подскажите, пожалуйста, один момент, никак не могу найти решение.

Требуется прицепить справа от таблицы на листе IzbrSvod  с числом столбцов ColEndIzbr и строк RowEndRpt некоторые данные из справочника, лист SpravSubj.            То есть применить некий аналог ВПР.

Всего там будет семь дополнительных столбцов.

Вот команда для одной из них.
IzbrSvod.Cells(2, ColEndIzbr + 1).Value = WorksheetFunction.VLookup(IzbrSvod.Cells(2, ColEndIzbr - 3), SpravSubj.Range("A:F"), 4, False)

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

Или же придется задавать семь циклов?  
Книги по VBA, посоветуйте литературу
 
Добрый день!

На работе начали преподавать VBA в качестве приложения к офисной работе. Увы, идет довольно туго. Посоветуйте каких-нибудь книг, где всё будет объясняться человеческим языком - с аналогиями из реального мира, с картинками. Может быть даже для школьников.
Копирование данных из диапазона через постоянный интервал
 
Здравствуйте, подскажите пожалуйста. Во вложении - пример задачи. Необходимо из некой мало упорядоченной таблицы слева получить четкую таблицу с данными в правой части. То есть - скопировать данные с интервалом в 4 строки. Пробовал формулы СМЕЩ  и ИНДЕКС (СТРОКА). По одиночке данные переносятся, но добиться сохранения работоспособности формулы при протягивании никак не получается. В чём здесь секрет?
Странный стиль ссылок на ячейки
 
Из служебной программы выгрузился файл, где в качестве адреса ячеек отображается что-то типа =XDO_?SUM_LINE_01? или =XDO_?LINE_01_EMP_CATEGORY_WOKER?. С этим файлом нужно поработать (расставить и протянуть формулы и т.п.), но не получается.

Что это такое и как вернуть нормальные координаты типа F23, A12 и т..п.?
Экспорт в XML. Неактивен пункт "Экспорт" на вкладке Разработчик
 
Пытаюсь наладить преобразование файла Excel для сдачи различной отчётности в формате XML.
Но пункт "Экспорт" на вкладке Разработчик почему-то не активен. В чем может быть причина? Может, нужно какие-то надстройки скачивать? Или порты закрыты?
Не активны в этом разделе также и некоторые другие пункты.

Формула для вычитания двух ячеек, в которых возможен текст
 
Добрый вечер!

Подскажите пожалуйста. В двух ячейках есть постоянно меняющиеся значения. Либо какое-то число, либо значок "-".

Если бы нужно было сложить эти ячейки, то проблем нет, существует формула СУММ. Но нужно вычесть одну из другой. Есть ли какая-то формула, чтобы это сработало при наличии прочерка?
Проверка диапазона ячеек на наличие допустимых значений
 
Здравствуйте!

Никак не могу понять, почему не работает формула. Требуется в ячейку А2 вывести предупредительную надпись, если в ячейках А1 - К1 содержатся недопустимые значения. Допустимы только 16, 0 и пустые ячейки.

Формула в моем представлении такая:

=ЕСЛИ(ИЛИ(СЧЁТЕСЛИ(A1:K1;{16;"";0}));"ДАННЫЕ ВЕРНЫ";"Проверьте коды. Должно быть 16 символов")

Но Excel считает, что недопустимых значений нет. Почему так?
Проверка содержимого диапазона ячеек на определенные значения
 
Необходимо вывести в ячейке предупреждение, если в диапазоне ячеек содержатся значения "-" либо нулевые, при этом пустые ячейки допустимы.

Если речь об одной ячейке А1, то все просто, формула будет:

=ЕСЛИ(ИЛИ(A1="-";И(A1=0;A1<>""));"Нечисловые данные";"Данные верны")

А как преобразовать формулу для проверки всего диапазона А1:K10?

И можно ли как-то добавить проверку на прочие нечисловые значения? Например, внесены данные в текстовом формате.

Спасибо.
VBA для чайников, проводим самоизоляцию с пользой
 
Добрый день!

Посоветуйте какой-нибудь начальный курс по VBA для полных чайников в программировании. Чтобы все разъяснялось максимально доступно, на пальцах, спичках и рыбках. На Youtube этого добра много. Но что лучше выбрать?
Автоматизация работы настраиваемого фильтра
 
Имеется список адресов в столбце А. Необходимо выбрать фильтром нужный, содержащий одновременно три значения - город. улицу и номер дома.

Вручную понятно. как это сделать - воспользоваться текстовым фильтром с параметром "содержит" и прописать, например, "Белгород*Ватутина*36".
Но это очень долго. Существует ли какая-то формула, которая позволит осуществлять выбор всех строк, содержащих в столбце А все три значения в столбцах С, D и Е? Или какая-то функция стандартная может быть есть? Пример - во вложении.

Пытался записать макрос. Но когда выведено окно поиска, то возможность работать с книгой пропадает - не скопировать в ячейку с поиском данные. даже не остановить запись макроса.
Изменено: alexpet - 20.02.2020 17:48:58
Округление с повышенной точностью, 0,00049 - > 0,001
 
Существует ли формула, при помощи которой можно произвести округление числа с повышенной точностью?

Например, дано число 0.00049. Требуется округлить его строго до третьего знака. Стандартная формула =ОКРУГЛ(А1;3) выдает 0,000

ОКРУГЛВВЕРХ, конечно, даст нам 0,001. Но если число будет 0,0000045, то ответ будет аналогичным - 0,001, что неверно.

Проблема в том, что данные 0,00049 не должны потеряться (они все-таки ближе к 0,001, чем к 0,000) и из-за логики листа, в которых они присутствуют.

Человек бы округлял так:

9 округляет 4 до 5, а 5 округляет 0 до 1. Итог - 0,001.

Можно ли заставить Excel округлять как человек?  
Выборочно копировать в другую таблицу названия и коды
 
Добрый день, подскажите, пожалуйста. Необходимо скопировать из левой таблицы в правую название веществ и их коды. При этом вещества с кодами "8888" и "х" копировать не требуется. Как при помощи формул это сделать? Информация об объемах выбросов подтягивается при помощи ВПР, там все в порядке.
Переместить строку вверх, до первого ненулевого значения
 
Добрый день. помогите. пожалуйста, написать команду на VBA.

Имеется небольшая табличка (во вложении). Требуется переместить строку под №220 вверх, чтобы таблица приобрела вид как на листе "как нужно". При этом количество заполненных строк с 201 по 219 заранее неизвестно, может быть только две строки заполнено, а может и 10. В конечном итоге необходимо сохранить все вещества, а все строки после вещества 8888 должны стать пустыми.

Спасибо!
Стал тормозить Excel
 
Здравствуйте!

Внезапно стал тормозить Excel. Те же самые небольшие файлы (для моей работы это таблицы на 100к знаков), которые месяц назад летали, теперь работают со скрипом. А большие (200-300к строк) и вовсе зависают. Особенно это заметно при использовании ВПР с других книг. Очень долго, минут пять, выполняется. Да и потом, при работе с фильтрами, тоже подвисает. Даже элементарная вставка значения в одну (!) ячейку выполняется секунд 20. Аналогичная проблема и у коллег. Стало просто невозможно работать.

Никаких скрытых объектов и формул нет, границы таблицы установлены в нужном месте. Сохранение как двоичной книги помогает слабо. Установка ручного пересчета формул и отключение автосохранения тоже. ИТ-шники ничего толком сказать не могут.

Что интересно, если в разгар работы, когда бешено крутится кулер, и медленно идет отсчет процесса %, нажать ESC, то все операции, вроде бы, будут выполнены. А иногда и нет... Также во время простоя могут самопроизвольно запустится какие-то вычисления.

В чем может быть причина? Обновления какие-то скачались? В настройках что-то включилось? Повторюсь, еще месяц назад все спокойно ВПР-ли 100 тысячные таблицы.

Комп, если что, i5/16Gb. При зависаниях происходит 100% загрузка процессора. Excel 2016/
Изменено: alexpet - 29.11.2018 11:17:28
Страницы: 1
Наверх