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

Страницы: 1
Выпадающий список со сверкой по шаблонной таблице
 
Здравствуйте, товарищи
Есть задача, которую попросили решить без использования макросов. У меня ничего не получилось, пришел к вам)
Описываемый пример приложен
Дано: есть таблица для заполнения, изначально все ячейки не заполнены. Предполагается, что в ячейках таблицы стоит выпадающее меню, можно выбрать только "Да". Таблица представляет 9 ролей в ряд (для примера упростил, в нем 4) на первой строке, по вертикали идут юзеры. Также есть шаблон таблицы, в котором выбраны все возможные максимальные наборы комбинации ролей. Некоторые из них несовместимы друг с другом, то есть нельзя для них проставить "Да" одновременно. Выбранных ролей с "да" может быть меньше, чем в шаблоне таблицы (например, для Роли 1 может быть выбрано не 3 "да", а 1 или 2 из допустимых, и это все еще будет правильно).
Варианты результата разбил на "очень желательный" и "так тоже хорошо, я даже и это не смог".
1) Пользователь имеет выпадающий список в ячейках. Он может выбирать "Да", если это не противоречит шаблонной таблице. Если происходит нарушение, то есть выбраны две несовместимые роли, то либо он не может так выбрать (в выпадающем меню "Да" отсутствует/недоступно), либо у него скидывается одна или несколько других ролей, несовместимых с последней выбранной.
2) Пользователь руками вводит "Да" в ячейки. Мы как-то сообщаем пользователю, что такой вариант возможен или недопустим (например, есть доп.столбец, где написано "Можно" или "Нельзя").

Надеюсь понятно объяснил) Буду очень признателен любым вариантам!
Изменено: bertz - 21.04.2023 00:36:17
Передача данных из фильтра в VBA
 
Добрый день!

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

Буду рад вашей помощи :) Гуглил, не нагуглил.
Создание массива с уникальными значениями из данных листа
 
Здравствуйте, товарищи.
Имеется начало макроса, суть которого - вытащить с листа только уникальные значения и загнать их в массив. Для этого накидал проверку каждого следующего элемента на наличие в массиве. Но при запуске эксель просто закрывается.
Нашел момент, где происходит вылет, в приложенном файле он помечен MsgBox "1". До этого момента цикл не доходит. То ли не завершается предыдущий виток цикла, то ли ошибки в распознавании условия нового.. Помогите, други, такого я раньше не видел)
Прикладываю два файла: обработчик и тест2. В обработчике макрос, тест2 для тестирования работы. Если нет желания качать, то код цикла, где происходит вылет, прикладываю ниже.
Код
Do While Len(Range("B" & nstroka).Value) > 0
    If nnstroka = 0 Then
    MsgBox "0"
        For i = 0 To 12 Step 1
            arr_full(i, nnstroka) = Str(Cells(nstroka, i + 1))
        Next
    ElseIf nnstroka = 1 Then
    MsgBox "1"
        sdist = Str(Range("A" & nstroka).Value)
        sdate = Str(Range("B" & nstroka).Value)
        slogin = Str(Range("H" & nstroka).Value)
        If Not sdist = arr_full(0, nnstroka - 1) And Not sdate = arr_full(1, nnstroka - 1) And Not slogin = arr_full(7, nnstroka - 1) Then
            For i = 0 To 12 Step 1
                arr_full(i, nnstroka) = Cells(nstroka, i + 1)
            Next
        End If
    ElseIf nnstroka > 1 Then
    MsgBox ">1"
        sdist = Str(Range("A" & nstroka).Value)
        sdate = Str(Range("B" & nstroka).Value)
        slogin = Str(Range("H" & nstroka).Value)
        For ii = 0 To nnstroka Step 1
            If sdist = arr_full(0, ii) And sdate = arr_full(1, ii) And slogin = arr_full(7, ii) Then
                GoTo skip1
            Else
            End If
        Next
        For i = 0 To 12 Step 1
            arr_full(i, nnstroka) = Str(Cells(nstroka, i + 1))
        Next
    End If
    nnstroka = nnstroka + 1
skip1:
    nstroka = nstroka + 1
Loop
Изменено: vikttur - 29.06.2021 00:12:16
VBA приложить файл с неполным именем
 
Приветствую, коллеги!

Решение искал, пробовал, не помогает.
У меня есть папка, в которой лежит куча пдф. Название пдф: номер+текст. Мне необходимо приложить к письму пдф, зная только номер.
Код, которым я прикладываю файл:
Код
Dim cert, cert_dir, number As String
cert_dir = "C:\123"
number = "001"
cert = (cert_dir & "\" & "001_скан.pdf")

On Error Resume Next
Set objOutlookApp = GetObject(, "Outlook.Application")
Err.Clear
If objOutlookApp Is Nothing Then
 Set objOutlookApp = CreateObject("Outlook.Application")
End If
objOutlookApp.Session.Logon
Set objMail = objOutlookApp.CreateItem(0)
If Err.number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub
sSubject = "Важное письмо"

With objMail
 .Subject = sSubject
 .Attachments.Add (cert)
 .Display
End With

Set objOutlookApp = Nothing: Set objMail = Nothing
В таком виде работает, но как только я начинаю менять четвертую строчку на разные варианты, чтобы найти файл только по части его имени, все перестает работать.
Варианты, которые я пробовал:
Код
cert = (cert_dir & "\" & "number*.pdf")
cert = (cert_dir & "\" & number & "*.pdf")
cert = Dir(cert_dir & "\" & "number*.pdf")
cert = Dir(cert_dir & "\" & number & "*.pdf")

Dir ломает отправку даже при полностью написанном адресе, как в первом примере.
Объясните, пожалуйста, что я делаю не так?
Пример макроса также во вложении.
VBA. Записать в ячейку значение в формате Процентный
 
Здравствуйте!
Есть некое выражение
Код
Dim procreal as Variant
procreal = (((8 * 8) * 0.05) / 176)

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

Пробовал делать так

Код
Cells(1,1) = Format(procreal, "Percent")
Cells(1,1) = Format(procreal, "0.00%")

Также пробовал записать число в переменную, объявленную как double, и вывести ее в ячейку, но эффект тот же: все это не срабатывает, эксель выводит значение как текст.

Где ошибка и как правильно вывести мое число сразу как число в проценте?

Обновление библиотек, с 15 до 16
 
Добрый день!
Возникла такая проблема, что на двух устройствах стоят разные версии подключаемых библиотек (Object Library): на рабочем 15, на личном 16.
Соответственно, на рабочем не запускаются макросы, написанные на личном устройстве.
Можно ли как-то обновить данные библиотеки?
VBA. Сравнение двух дробных или целых чисел
 
Здравствуйте!

Столкнулся с проблемой некорректного результата после сравнения дробных и целых чисел.
Примерный кусок кода. Суть задачи - сравнить 10 ячеек в ряд (начиная с 24) с  другими десятью ячейками (начиная с 12) на определенной строке (nstroka). Если ячейка q равна 1 и если ячейка qq больше 1 (в моём случае следующее значение 1,5), то i+1. В ячейках содержатся числа от 0 до 3 с шагом 0,5.
Собственно, в итоге выходят ошибочные результаты. Например, значение в 32 ячейке равно 0,5, то есть первое условие сразу не выполнено, но макрос зачитывает его как успешный результат сравнения.
Подскажите, где я свернул не туда?
Код
Dim iq, iqq as double
i=0
q=24
qq=12
Do until q>33
  iq=Cells(nstroka, q)
  iqq=Cells(nstroka, qq)
     If iq=1 and iqq>1 then
     i=i+1
     End if
   qq=qq+1
   q=q+1
Loop
Получение дат из длинного формата даты
 
Здравствуйте!
Есть таблица, в которой содержатся результаты активностей пользователя. У каждой такой активности есть дата завершения, она идёт в формате дд.мм.гггг  чч:мм:сс. Например, 27.12.2017  17:27:48.
Мне нужно взять дату завершения одной активности и посчитать все другие, которые были после этой даты.
Присвоение формата дат не срабатывает, и макрос выдаёт некорректные значения.
То есть, пробовал задавать формат As Date для сравниваемого числа, пробовал дополнительно прописывать в условии примерно такое
Код
Dim sdate as Date
sDate=Cdate(Worksheets("123").Range("V"&nstroka) - тут дата, с которой надо сравнить даты всех других активностей
If Cdate(Range(...))>sdate - это сравнение даты другой активности с присвоенной строкой выше датой
Тоже результат некорректный. Придумал убрать все знаки в числе, свести эти даты к одному большому целому числу и сравнивать уже их, но мне кажется, что есть решение проще и я просто неправильно задаю формат.
Вот. Прошу вашей помощи :)
Ошибка сохранения второго файла, VBA
 
Здравствуйте.
Есть макрос, который открывает шаблон ворда, вносит в него изменения и должен сохранить файл на сервер. Изменения вносятся для большого количества людей, поэтому имена файлов переменные, администратор сам выбирает людей, для которых нужно макрос выполнить.
Код
iPath="D:\ДРАФТЫ\" & Workbooks(1).Worksheets("Серт").Range("B" & q).text
ActiveDocument.SaveAs2 iPath & ".docx"
Первый файл (для первого человека) сохраняется без проблем. Второй - ошибка, сопровождающаяся длительным зависанием экселя. После того, как эксель отвис, попытка успешна (то есть она третья), а следующая (четвертая) опять вызывает ошибку. То есть, ошибкой заканчивается каждое четное выполнение сохранения (дебагер выделяет именно строчку сохранения файла).
Текст ошибки:
Скрытый текст
Попробовал заменить папку сервера на локальную, не помогает. Пробовали на двух компьютерах.
Может быть, кто-нибудь с таким сталкивался?
Заранее спасибо!
Как правильно передать значение из textbox в переменную?
 
Привет любителям экселя :) заранее прошу не кидаться в меня всяким, я только учусь))
В общем, делаю форму-конструктор письма. Поставил галочки напротив того, что должно в нём быть, а результат появился потом в большом поле типа Label.
Последовательность действий такая:
Пользователь в 5 пунктах выбирает из двух вариантов;
В двух пунктах при нажатии "Да" появляется текстбокс, куда он должен вписать данные (например, в вопросе "Есть ли временные рамки?" он выбирает "Да", появляется текстбокс, куда нужно вписать, например, "30 августа");
Нажимает кнопку. Кнопка собирает конструктор исходя из выбранных пунктов, и выводит собранное письмо в поле Label;
Пользователь может поменять выбранные пункты, также нажать кнопку, и она обновит конструктор снова;
Дальше пока не делал))

Суть проблемы:
После нажатия "да" открывается текстбокс, но вписанное в него значение с первого раза не закидывается в Label при формировании письма. Чтобы начало отображаться нужно переключить на "нет", затем снова на "да". Как я понимаю, это обновляет текстбокс из-за первой строчки TextBox_Change. Вопрос: Можно ли это как-то обойти? Например, чтобы при нажатии кнопки текстбокс понимал, что вводиться в него на этой итерации уже ничего не будет, и ему следует полученные данные внести в переменную?
Все переменные объявлены как глобальные в самом модуле.
В коде, если это нужно, нажатие на кнопку, введение в текстбокс и добавление этого в основное сообщение выглядит так:
Код
Private Sub TimeYES_Click()
sTime=""
Timetext.Visible=True
Timetext.Enabled=True
sTimeType="Yes"
Timetext.Setfocus
sTime="Срок, устанавливаемый организацией - до " & sdate & " включительно"
End sub

Private sub Timetext_Change()
sdate=TimeText.Value
End sub

Private sub refrash_click()
...
If sTimeType="Yes" Then
MainMsg=MainMsg&vbcrlf&sTime
End if
...
Label=MainMsg
End sub
Ошибка макроса сохранения PowerPoint
 
Здравствуйте товарищи!
Есть большая эксель таблица. Сделал макрос, который из неё вытаскивает нужные данные и засовывает их в шаблон презентации.
Ошибка возникает на этапе сохранения. Причём код ошибку не возвращает, о её наличии можно понять по имени файла презентации FALSE.
Пробовал в разных видах, гуглил на разных сайтах, но все методы возвращают именно к такому результату: файл в нужную папку не сохраняется, имя файла с Шаблон меняется на FALSE.
Что я делаю не так?)
Код выглядит примерно так:
Скрытый текст
[CODE][/CODE]
Изменено: bertz - 21.06.2019 14:29:39
Фантомный текст в ячейке, Я сломался
 
Добрый день!
Прошу помощи со следующим куском кода (не ругайтесь, если он кривой, я падаван ещё):
Код
For ww = LBound(arr) To UBound(arr)
sum = 0
q = 10
Z = Z + 1
Do Until q > 800
If Worksheets("Данные").Range("IP" & q).Text Like arr(ww) Then
If Worksheets("Данные").Range("IW" & q).Value > 43466 Then
sum = sum + 1
End If
End If
q = q + 1
Loop
oTable.Cell(Z,4).Range.InsertAfter sum
Next
MsgBox "Готово"

Суть происходящего: макрос берёт из ранее заполненного архива логин, ищет его в базе экселя и проверяет дату завершения активности. Если она больше 1 января 2019, то переменная sum увеличивается на 1. После прохода по всей таблице полученное значение sum записывается в нужную ячейку в ворде.
Суть проблемы: для последней ячейки записывается странное значение. Во первых, в нём всегда двузначное число. Во вторых, истине соответствует  только первое число (будь то 0, 1 или какое-то ещё), а второе (при моих проверках) всегда "2". То есть, при 0 совпадений для логина с номером в массиве ww последняя ячейка будет иметь значение "02".
Можно было бы удалить последний символ, но вычисления в своем боевом варианте будут идти по 13 столбцам, а не по 1.
Пожалуйста, помогите разобраться, в чём моя ошибка, откуда берётся эта фантомная двойка?
Заранее спасибо всем!
Изменено: bertz - 22.05.2019 14:00:47
Cкорость работы при больших вычислениях VBA и стандартных формул эксель, VBA и стандартные формулы
 
Добрый день!
Вопрос не по формулам, а по оптимизации.
Столкнулся на работе со следующей проблемой:
Есть файл, который содержит кучу информации:
Лист1 - персональные данные, 1200х25 ячеек;
Лист2 - выгрузки из базы. В среднем 400х325 ячеек;
Лист3 - перечень организаций. 400х5 ячеек;
Лист4 - промежуточный арифметический. Переводит данные из выгрузки в данные для финального расчёта. Каждая ячейка - формула, содержащая всякие "Если", Индексы и пр. 1200х70 ячеек;
Лист5 - вывод данных по определенной категории пользователей. Все ячейки - ВПР, индексы, если и пр. 1200х55 ячеек;
Лист6 - лист с выводом статистической информации

Вот. Всё это сейчас весит 4.5Мб, и довольно долго начинает грузить. В этом году планируется увеличение кол-ва пользователей до 2.5-3 тысяч. Боимся, что работа станет очень затруднительной.
В чём вопрос: правильно ли я понимаю, что основной вес и время отклика связаны с большим кол-вом формул, которые как-бы постоянно считаются? Если всё это перевести в VBA, и запускать обновление только тогда, когда это надо нам, избежим ли мы коллапса?

P.S. Думал сделать просто второй эксель, который будет выводить основную информацию из первого, но, пока не разбирался из-за чего, данные в новом файле не обновляются без открытия старого файла, что нивелирует эту идею. Возможно, проблема в том, что файлы лежат на сетевом диске, хотя и в одной папке.
Изменено: bertz - 12.02.2019 11:13:13
Поиск одинаковых значений, нахождение последнего по дате и выдача значения из полученной строки, Названия короче я не придумал
 
Добрый день!
Помогите, пожалуйста)
Описание ситуации:
На листе 1 есть большая таблица (отчётная). Кроме неё есть прочие листы. На один из листов (lvl3) вставляется отчёт, выгружаемый из системы.
Отчёт содержит ключевые интересующие столбцы: логин, полученный балл, дата прохождения.
Т.к. один логин может по разным причинам два и более раз проходить тест, необходимо подтянуть последнее значение по дате на лист 1.
Таким образом, получается поиск примерно такой: если логин с листа 1 повторяется на листе lvl3 более одного раза, то необходимо просмотреть даты получения баллов, выбрать актуальную (последнюю) и вернуть значение балла из строки с актуальной датой..
С коллегой пытались через индекс и поискпоз, но не смогли довести до конца :(
Отработка.xlsx (8.98 КБ)  
Страницы: 1
Наверх