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

Страницы: 1
"Can't find project or library". Проблема при открытии и сохранение книги
 
Добрый день, нужна помощь с одной проблемой, действия:
Иногда при сохранение книги происходит ошибка.
"Can't find project or library" . После чего не могу никак сохранить книгу. Хотя я тулзы кроме базовых не использую. В чем может быть проблема. Книгу не могу приложить, к сожалению.
Ошибка при открытии и сохранение документа.
 
Добрый день, подскажите если кто сталкивался. При открытии файла, пишет «Can’t find project or library». Хотя я ничего не делал в vba уже давно. При попытке зайти в References ничего не открывается, и не показывает никакие ошибки. При попытке сохранить книгу, пишет «ошибка при сохранении, возможно сохранится, если внести исправления, нажимаю дальше, там опять выбор папки и так по кругу.
PQ. Обратить таблицу. поставить на голову
 
Добрый день, в Power Query есть кнока "обратить таблицу", тоесть перевенуть таблицу верх ногами ( не транспонировать). Как это сделать макросом на VBA. Подскажите, я такой кнопки в стандартном excel не нашел (хотел подсмотреть в макрекодере)
Проставить метку на группированные данные PQ
 
Добрый день, подскажите как проставить метки на группированные подсписки в PQ. У меня есть метод маркировки строк, как в примере снизу. Данные группируются по параметру, после чего из них находиться максимальное(самое новое по дате) и ставиться "да". Вопрос в другом, как сделать так, что-бы в полученой группе, находилась строка "а" и там ставилось "да"(в новом столбце), а в остальных "нет", если строки нет, то смотрит есть ли строка "б" и ставит "да", если такой нет, то проверяет есть ли строка "в" и ставит "да", а у всех других кроме найденной строки ставит "нет".
Код
let
    Source = Excel.CurrentWorkbook(){[Name="1sd"]}[Content],
    originalOrder = Table.AddIndexColumn(Source, "id"),
    local = Table.Group(originalOrder, {"OKRID"}, {"temp", (sub) =>
        Table.AddColumn(sub, "Маркер", each if [DATE_V] = List.Max(sub[DATE_V]) then "Да" else "Нет")
    })[temp],
    common = Table.Combine(local),
    #"Sorted Rows" = Table.Sort(common,{{"id", Order.Ascending}}),
    result = Table.RemoveColumns(#"Sorted Rows", {"id"})
in
    result
Изменено: Argo9 - 12.03.2020 17:47:01 (добавил пример)
Добавление строк в массив
 
Добрый день,подскажите как решить. Нахожу индексы нужных строк из массива, хотелось бы в конце цикла добавлять строку по определенному индексу в конец нового массива(заранее создавая пустой массив) и возвращать в конце массив функцией.
Вопрос: как добавить строку в конец массива?
Добавление в динамический массив по индексу строки.
 
Добрый день, подскажите как в динамический массив(пустой) добавлять строки из другого массива зная индекс этих строк. Или как обратиться к строке массива по индексу? Что-то вроде Arr(1,0) или Arr(1,). Есть что-то подобное?
Перенос не повторяющихся значений.
 
Добрый день, подскажите как можно реализвоать.

Есть два документа:
В документе 1 записанны значения в столбце в формате: "Текст - число". Например: "номер - 107"
В документе 2 такой же столбец с такими же значениями.
Нужно перенести не повторяющиеся строки из документа 2, в документ 1.
В документе 1 значений около 2-ух тысяч. В документе 2 их окоол 50, постоянно разные появляются(актуализируются).
Подскажите как реализовать перенос, то есть как найти эти строки которых еще нет в документе 1.
Прошу лишь концепцию, думал вытягивать цифры регулярками, потом по ним сравнивать. Но так все равно вложеные циклы делать и т.п. (опыта у меня мало в VBA)

P.S. Файлы к сожалению приложить не могу.
Быстродействие (скорость работы) в MS Excel
 
Добрый день, подскажите кто знает.

Есть документ, в нем формулы по 4 столбцах. Записей примерно 6000 и около 30 столбцов. Есть сводные таблицы на других листах, гистограммы, ссылки на сводные таблицы, вообщем полный фарш. Документ весит 4 мгб(вроде как немного)
Он как-то очень медленно работает, хочется его оптимизировать.
Просьба дать совет, если я напишу формулы как макросы в vba, этот метод будет эффективнее чем протягивать формулы для новых записей?
Сводные таблицы и форматирование ячеек\текста сильно влияет на производительность?
И есть ли какая нибудь масштабная статья по этому вопросу?

p.s. У книги1 есть запрос к бд oracle, к этой книге1 сделал запрос к таблице в  книге2. Если в книге 2 обновить все данные, в книгу1 подтянуться новые строки?
Изменено: Argo9 - 12.12.2019 11:19:38
PQ, Отмечать записи, после которіх значение не повторяется
 
Добрый день, прошу подсказать.
Выгружаю данный с бд на лист Excel. Нужно реализовать формулу для выгружаемых данных.
В столбце A уникальное значение. Если ключ не повторяется ниже по таблице, то написать "Да" , а у всех других с таким же ключом в таблице написать "Нет". Другими словами "Да" должен быть только у последней записи с таким ключом, у остальных нет.
Лучше сделать формулу, или макрос, или изменить запрос в PQ? Пробовал сделать после выгрузки на лист, но расчет идет долго очень. Да и формула вроде не правильна была)
Дай совет, пожалуйста.
[ Закрыто] Вопрос по синтаксису VBA
 
Подскажите в чем разница, пожалуйста.

Код
Cells(1,1) = "5"
Cells(1,1).Value = "5"
Вложенный цикл для другой книги
 
Добрый день, подскажите, знаю что может быть активна лишь одна книга в один момент, но вечные блики не нравятся, да и долго так, подскажите как реализовать работу вложенного цикла для другой книги.


Код
sub test()
Set prom = Workbooks.Open("C:\Users\Gumin-AA\Desktop\sever.xlsx")
Set svod = Workbooks.Open("C:\Users\Gumin-AA\Desktop\ugeas.xlsm")
Set reestr = svod.Sheets("jenk")
Set zakl = prom.Sheets("Лист1")
Set otkl = prom.Sheets("Лист3")

lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
data_now = InputBox("Введите нужную дату (полностью, в формате dd-mm-yyyy)", "Введите дату", Date)
data_now = CDate(data_now)

For j = 2 To lLastRow&
    zakl.Activate
    If Cells(j, 5) = data_now  Or Cells(i, 3) = DateAdd("d", -4, data_now)  And Cells(j, 4) = "принята" Then
        inn = Cells(j, 11)
        summ_deal = Cells(j, 31)
        reestr.Activate 'такой метод не устраивает
        For l = 2 To lLastRow&
            If Cells(l, 5) = inn And Cells(l, 12) = "все норм" Or Cells(l, 12) = "тоже норм" And Cells(l, 15) = "Да" Then
                Cells(l, 12).Value = "Пшено есть"
                Cells(l, 11).Value = data_now
                Cells(l, 20).Value = summ_deal  'If Cells(l, 20).Value = "" Then
                Exit For
            End If
        Next l
    End If
Next j
End sub
Изменено: Argo9 - 19.11.2019 14:39:11
Отправка письма заранее созданному контакту Outlook VBA
 
Добрый день, подскажите пожалуйста, как отправить письмо по outlook через vba, заранее созданному контакту. Имеется в контактах outlook контакт с массивом адресов, как в строку ".To" сказать взять этот контакт?(как в примере снизу) Нашел статью по этому поводу для 2003 экселя, но мой код что писал, не могу адаптировать под него, да и разобраться что там написано.(статья нечитаемая)

Код
Private Sub Send_Mail()
    Dim objOutlookApp As Object, objMail As Object

Application.ScreenUpdating = False

    On Error Resume Next
    Set objOutlookApp = CreateObject("Outlook.Application")
    objOutlookApp.Session.Logon
    Set objMail = objOutlookApp.CreateItem(0)   'создаем новое сообщение
    If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub
    On Error GoTo 0
    'создаем сообщение
    With objMail
        .To = "Ответственные"
        .CC = _
        "Ssdasf@mail.ru"
        .Subject = _
        "Инфо "
       .BodyFormat = 2  'olFormatHTML - формат HTML
        .HTMLBody = _
        "Lобрый день. <br>."
        .display 'отображаем сообщение
    End With

Set objOutlookApp = Nothing: Set objMail = Nothing
Application.ScreenUpdating = True
Application.CutCopyMode = False
End Sub

Посоветуйте информацию.
Изменено: Argo9 - 14.11.2019 11:40:48
Несколько регулярных выражений для одной строки.
 
Доброго времени суток. Подскажите кто сталкивался. Есть такой код.

Код
Sub XML_Replace()

    Dim s, Stroka2 As String
    Dim myRegExp As New RegExp  
    
With myRegExp
    .Global = True 
    .IgnoreCase = False 
    .MultiLine = False 
    .Pattern = ">\d{10}<|>\d{12}|>\d{13}<|>\d{15}<|>((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}<"
End With

Stroka2 = ">ПРАВЛЕНО<"

    Open "C:\Users\17620635\Desktop\testxml.txt" For Input As #1 'Открываем файл функцией Open() на чтение(Input)
    Open "C:\Users\17620635\Desktop\outputxml.txt" For Output As #4
    
    While Not EOF(1)
        Line Input #1, s
        s = myRegExp.Replace(s, Stroka2)
        Print #4, s
    Wend
    
    MsgBox vbInformation
    Close #1
    Close #4
End Sub


Вообщем есть большой XML файл и код убирает внутри тегов значения ИНН, ОГРН, Телефона. Проблема в том, что в документе, в том же формате что и телефон указанны даты. (xx-xx-xx). Как бы паттерн для всей строки одинаковый и заменяемое значение одно и то же для любого найденного значения. Если бы это был Python, я бы сделал список с строками для замены по условию содержания возвращаемой патерном строки. (типо если есть INN, то вернуть первую подстроку списка).

Подскажите, как для разных выражений возвращать разные строки? Если можно на примере. По следущей логике.

Код
If pat = ">\d{10}<|>\d{12}<" Then:
StrN = "INN>ПРАВЛЕНО<"
ElseIf pat = ">\d{13}<|>\d{15}<" Then:
StrN = "OGRN>ПРАВЛЕНО<"
ElseIf pat = ">((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}<" Then:
StrN = "Telephone>ПРАВЛЕНО<"
Изменено: Argo9 - 13.11.2019 11:54:01
Поиск и замена в XML через VBA
 
Добрый день, подскажите, с XML в VBA раньше не работал, есть вопрос. Как средствами VBA в конкретных тегах заменить значение на другое во всем документе? Вроде задача не сложная и я думаю уже решалась кем-то сто раз, но я хз с чего начать, помогите плз. Например есть тег: <aa:1>что-то</aa:1> и заменить на <aa:1>*другое*</aa:1>
Помогите плиз.
Изменено: Argo9 - 16.10.2019 13:38:28
Копирование диапазона в строку адреса outlook
 
Доброго дня, позвольте спросить. Написал небольшую функцию в VBA. Я только начал вариться в кодинге. Функция работает и копирует нужные диапазон, но почему то возвращает в строку адреса значений "-1" (при некоторых изменениях true ). Я так понял так как возвращается значение типа Range, а нужно string. Значение берутся из нескольких ячеек (адреса почты). Как мне вернуть в строку адреса аутлук значение из 2-5 ячеек?

хотелось бы в строку ".To = " вбивать значение из нескольких ячеек(конкретон то, которое я выделил функцией) или скопировал, преобразовал в массив, это не важно, просто я не понимаю как лучше. У меня есть вариант возвращаться функцией значение Range, а затем преобразовывать в строку или массив, как это сделать я правда не знаю. ужно передать в функцию строку, а получить обратно диапазон, который можно вставить в строку адреса в outlook.

Я пробовал так же переносить в хтмл, открывать как txt и переносить в строку, но там кеся меся из хтмл разметки, видимо надо формат определить как и для тела сообщения.
Так же пробовал создавать временный текстовый документ, переносить в него все. затем из него все копировать в нужную мне строку, но заблудился в синтаксисе и встал

итог: я функцией методом select или copy(как угодно) обозначил диапазон. Как мне его из функции вызвать в процедуре и засунуть в адрес получателя. Значение обычно от 3-6. Помогите пожалуйста.

Код
 
Private Sub Send_Mail()
    Dim objOutlookApp As Object, objMail As Object
    Application.ScreenUpdating = False
    On Error Resume Next
    Set objOutlookApp = CreateObject("Outlook.Application")
    objOutlookApp.Session.Logon
    Set objMail = objOutlookApp.CreateItem(0)   'создаем новое сообщение
    If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub
    On Error GoTo 0
    'создаем сообщение
    With objMail
        .To = otvetvstvenie("value")
        .CC = _
        "inbox@mail.ru; seraga@mail.ru"
        .Subject = _
        "тема сообщения"
       .BodyFormat = 2  'olFormatHTML - формат HTML
        .HTMLBody = _
        "Добрый день, направляю дедлайны." & "ConvertRngToHTM(Selection)"
        .display 'отображаем сообщение
    End With
 
    Set objOutlookApp = Nothing: Set objMail = Nothing
    Application.ScreenUpdating = True
End Sub
 
Function otvetvstvenie(bank As String) 
 
Dim lLastRow As Long, bank As String
lLastRow = Cells(Rows.Count, 4).End(xlUp).Row

Application.Workbooks("Ответственные.xlsx").Sheets("Лист1").Activate
Range("C4").AutoFilter Field:=2, Criteria1:=bank
Range("F5" & ":F" & lLastRow).Copy
End Function
Страницы: 1
Наверх