Здравствуйте, товарищи Есть задача, которую попросили решить без использования макросов. У меня ничего не получилось, пришел к вам) Описываемый пример приложен Дано: есть таблица для заполнения, изначально все ячейки не заполнены. Предполагается, что в ячейках таблицы стоит выпадающее меню, можно выбрать только "Да". Таблица представляет 9 ролей в ряд (для примера упростил, в нем 4) на первой строке, по вертикали идут юзеры. Также есть шаблон таблицы, в котором выбраны все возможные максимальные наборы комбинации ролей. Некоторые из них несовместимы друг с другом, то есть нельзя для них проставить "Да" одновременно. Выбранных ролей с "да" может быть меньше, чем в шаблоне таблицы (например, для Роли 1 может быть выбрано не 3 "да", а 1 или 2 из допустимых, и это все еще будет правильно). Варианты результата разбил на "очень желательный" и "так тоже хорошо, я даже и это не смог". 1) Пользователь имеет выпадающий список в ячейках. Он может выбирать "Да", если это не противоречит шаблонной таблице. Если происходит нарушение, то есть выбраны две несовместимые роли, то либо он не может так выбрать (в выпадающем меню "Да" отсутствует/недоступно), либо у него скидывается одна или несколько других ролей, несовместимых с последней выбранной. 2) Пользователь руками вводит "Да" в ячейки. Мы как-то сообщаем пользователю, что такой вариант возможен или недопустим (например, есть доп.столбец, где написано "Можно" или "Нельзя").
Надеюсь понятно объяснил) Буду очень признателен любым вариантам!
Есть следующая задача: пользователь таблицы должен иметь возможность выполнить некий набор макросов к тому диапазону, который он предварительно настроил в самой таблице. То есть, в файле примера пользователь может выбрать условие в столбцах 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
Решение искал, пробовал, не помогает. У меня есть папка, в которой лежит куча пдф. Название пдф: номер+текст. Мне необходимо приложить к письму пдф, зная только номер. Код, которым я прикладываю файл:
Код
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
В таком виде работает, но как только я начинаю менять четвертую строчку на разные варианты, чтобы найти файл только по части его имени, все перестает работать. Варианты, которые я пробовал:
Dir ломает отправку даже при полностью написанном адресе, как в первом примере. Объясните, пожалуйста, что я делаю не так? Пример макроса также во вложении.
Dim procreal as Variant
procreal = (((8 * 8) * 0.05) / 176)
После подсчета я получаю дробное число (0.018181) и хочу записать его в ячейку в виде процента, НО: мне нужно, чтобы формат сразу распознавался как числовой в процентах (выделил диапазон таких результатов - увидел сумму в процентах), а не как текстовый.
Также пробовал записать число в переменную, объявленную как double, и вывести ее в ячейку, но эффект тот же: все это не срабатывает, эксель выводит значение как текст.
Где ошибка и как правильно вывести мое число сразу как число в проценте?
Добрый день! Возникла такая проблема, что на двух устройствах стоят разные версии подключаемых библиотек (Object Library): на рабочем 15, на личном 16. Соответственно, на рабочем не запускаются макросы, написанные на личном устройстве. Можно ли как-то обновить данные библиотеки?
Столкнулся с проблемой некорректного результата после сравнения дробных и целых чисел. Примерный кусок кода. Суть задачи - сравнить 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 - это сравнение даты другой активности с присвоенной строкой выше датой
Тоже результат некорректный. Придумал убрать все знаки в числе, свести эти даты к одному большому целому числу и сравнивать уже их, но мне кажется, что есть решение проще и я просто неправильно задаю формат. Вот. Прошу вашей помощи
Здравствуйте. Есть макрос, который открывает шаблон ворда, вносит в него изменения и должен сохранить файл на сервер. Изменения вносятся для большого количества людей, поэтому имена файлов переменные, администратор сам выбирает людей, для которых нужно макрос выполнить.
Первый файл (для первого человека) сохраняется без проблем. Второй - ошибка, сопровождающаяся длительным зависанием экселя. После того, как эксель отвис, попытка успешна (то есть она третья), а следующая (четвертая) опять вызывает ошибку. То есть, ошибкой заканчивается каждое четное выполнение сохранения (дебагер выделяет именно строчку сохранения файла). Текст ошибки:
Попробовал заменить папку сервера на локальную, не помогает. Пробовали на двух компьютерах. Может быть, кто-нибудь с таким сталкивался? Заранее спасибо!
Привет любителям экселя заранее прошу не кидаться в меня всяким, я только учусь)) В общем, делаю форму-конструктор письма. Поставил галочки напротив того, что должно в нём быть, а результат появился потом в большом поле типа 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
Здравствуйте товарищи! Есть большая эксель таблица. Сделал макрос, который из неё вытаскивает нужные данные и засовывает их в шаблон презентации. Ошибка возникает на этапе сохранения. Причём код ошибку не возвращает, о её наличии можно понять по имени файла презентации FALSE. Пробовал в разных видах, гуглил на разных сайтах, но все методы возвращают именно к такому результату: файл в нужную папку не сохраняется, имя файла с Шаблон меняется на FALSE. Что я делаю не так?) Код выглядит примерно так:
Скрытый текст
Код
Public Sub exl_to_pp()
Dim ppApp As PowerPoint.Application
Dim ppPres As PowerPoint.Presentations
Dim ppSlide As PowerPoint.Slide
Dim ppShape As PowerPoint.Shapes
'дальше идёт работа со страницами, есть два цикла, но основное выглядит примерно так
Set ppApp = New PowerPoint.Application
ppApp.Presentations.Open "D:\Шаблон.pptx"
ppApp.ActivePresentation.Slides(3).Select
info = Worksheets("Графики").Range("D6")
ppApp.ActivePresentation.Slides(3).Shapes(3).Table.Cell(3,3).Shape.TextFrame.TextRange.Text = info
info = Worksheets("Графики").Range("C6")
ppApp.ActivePresentation.Slides(3).Shapes(3).Table.Cell(3,4).Shape.TextFrame.TextRange.Text = info
info =Worksheets("Графики").Range("D16")
ppApp.ActivePresentation.Slides(3).Shapes(3).Table.Cell(4,3).Shape.TextFrame.TextRange.Text = info
'в таком духе заполняются 3 слайда, затем сохранение
ppApp.Presentations(1).SaveAs
Filename = "D:\Статистика.pptx"
MsgBox "Готово"
End sub
Добрый день! Прошу помощи со следующим куском кода (не ругайтесь, если он кривой, я падаван ещё):
Код
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. Пожалуйста, помогите разобраться, в чём моя ошибка, откуда берётся эта фантомная двойка? Заранее спасибо всем!
Добрый день! Вопрос не по формулам, а по оптимизации. Столкнулся на работе со следующей проблемой: Есть файл, который содержит кучу информации: Лист1 - персональные данные, 1200х25 ячеек; Лист2 - выгрузки из базы. В среднем 400х325 ячеек; Лист3 - перечень организаций. 400х5 ячеек; Лист4 - промежуточный арифметический. Переводит данные из выгрузки в данные для финального расчёта. Каждая ячейка - формула, содержащая всякие "Если", Индексы и пр. 1200х70 ячеек; Лист5 - вывод данных по определенной категории пользователей. Все ячейки - ВПР, индексы, если и пр. 1200х55 ячеек; Лист6 - лист с выводом статистической информации
Вот. Всё это сейчас весит 4.5Мб, и довольно долго начинает грузить. В этом году планируется увеличение кол-ва пользователей до 2.5-3 тысяч. Боимся, что работа станет очень затруднительной. В чём вопрос: правильно ли я понимаю, что основной вес и время отклика связаны с большим кол-вом формул, которые как-бы постоянно считаются? Если всё это перевести в VBA, и запускать обновление только тогда, когда это надо нам, избежим ли мы коллапса?
P.S. Думал сделать просто второй эксель, который будет выводить основную информацию из первого, но, пока не разбирался из-за чего, данные в новом файле не обновляются без открытия старого файла, что нивелирует эту идею. Возможно, проблема в том, что файлы лежат на сетевом диске, хотя и в одной папке.
Добрый день! Помогите, пожалуйста) Описание ситуации: На листе 1 есть большая таблица (отчётная). Кроме неё есть прочие листы. На один из листов (lvl3) вставляется отчёт, выгружаемый из системы. Отчёт содержит ключевые интересующие столбцы: логин, полученный балл, дата прохождения. Т.к. один логин может по разным причинам два и более раз проходить тест, необходимо подтянуть последнее значение по дате на лист 1. Таким образом, получается поиск примерно такой: если логин с листа 1 повторяется на листе lvl3 более одного раза, то необходимо просмотреть даты получения баллов, выбрать актуальную (последнюю) и вернуть значение балла из строки с актуальной датой.. С коллегой пытались через индекс и поискпоз, но не смогли довести до конца Отработка.xlsx(8.98 КБ)