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

Страницы: 1
Посчитать сумму месячных приходов по торговым точкам
 
Цитата
domybest, вы бы удосужились показать готовый результат (ожидаемые вами)
Указал в 5-м столбце файла-примера
Посчитать сумму месячных приходов по торговым точкам
 
Спасибо за вариант. Дело в том, что описанный шаг - часть большого расчета, который уже написан в VB, поэтому не уверен, что смогу совместить решение на VB со сводной таблицей
Посчитать сумму месячных приходов по торговым точкам
 

Здравствуйте!

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

Нужно посчитать сумму месячных приходов по каждой торговой точке и добавить на каждую строку прихода соответствующей торговой точки соответствующего месяца.

Мне видится следующий алгоритм:

1. Выделение года и месяца из даты

2. Запись полученных пар год-месяц в словарь с контролем на уникальность

3. Перегон из словаря в массив

4. Проход циклом по всем значениям массива для первой и для второй точки с суммированием приходов в переменную

5. Проход циклом по всем строкам таблицы и запись суммы приходов из переменной в соответствующие ячейки

Получается громоздко, но по-другому не соображу. Поделитесь, пожалуйста, мыслями, есть ли путь проще и короче.

П.С. В какие-то месяцы одна из торговых точек может вообще не иметь приходов, соответственно ее строк не будет в таблице (если это имеет значение).

Заранее спасибо!

Добавление защиты от редактирования файла Word при его создании из Excel
 
Здравствуйте!

В теме https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=86680&T... приводится код, позволяющий по шаблону создавать файл(ы) Word из Excel.

Подскажите, пожалуйста, как нужно в этот код добавить защиту создаваемых документов Word?
По наивности думал, что надо добавить строки
Код
WD.ActiveDocument.Protect _                
    Password:="123456", _                
    NoReset:=False, _                
    Type:=wdAllowOnlyFormFields, _                
    UseIRM:=False, _                
    EnforceStyleLock:=False

перед сохранением файла, т.е. перед строкой
Код
WD.SaveAs Filename: WD.Close False: DoEvents

Но получаю ошибку 438 Object doesn't support this prorepty or method.

Думал, надо подключить библиотеку Microsoft Word 15.0 Object library и строку кода
Код
Dim WA As Object, WD As Object: Set WA = CreateObject("Word.Application") 'без подключения библиотеки Word

заменить на
Код
Dim WA As Word.Application, WD As Word.Document: Set WA = New Word.Application ' c подключением библиотеки Word

Но не помогло - та же ошибка.
Ощущение, что проблема в ActiveDocument. Надо на что-то заменить, но на что - не соображу.

Для удобства привожу код из вышеупомянутой темы здесь:
Код
Const ИмяФайлаШаблона = "шаблон.dot"
Const КоличествоОбрабатываемыхСтолбцов = 11
Const РасширениеСоздаваемыхФайлов = ".doc"
Sub СформироватьДоговоры2()
    ПутьШаблона = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблона)
    НоваяПапка = NewFolderName & Application.PathSeparator
    Dim row As Range, pi As New ProgressIndicator
    r = Cells(Rows.Count, "C").End(xlUp).row: rc = r - 2
    If rc < 1 Then MsgBox "Строк для обработки не найдено", vbCritical: Exit Sub
    pi.Show "Формирование договоров": pi.ShowPercents = True: s1 = 10: s2 = 90: p = s1: a = (s2 - s1) / rc
    pi.StartNewAction , s1, "Запуск приложения Microsoft Word"
    ' Dim WA As Word.Application, WD As Word.Document: Set WA = New Word.Application    ' c подключением библиотеки Word
    Dim WA As Object, WD As Object: Set WA = CreateObject("Word.Application")    ' без подключения библиотеки Word
    For Each row In ActiveSheet.Rows("3:" & r)
        With row
            ФИО = Trim$(.Cells(3)) & " " & Trim$(.Cells(4)) & " " & Trim$(.Cells(5))
            Filename = НоваяПапка & ФИО & РасширениеСоздаваемыхФайлов
            pi.StartNewAction p, p + a / 3, "Создание нового файла на основании шаблона", ФИО
            Set WD = WA.Documents.Add(ПутьШаблона): DoEvents
            pi.StartNewAction p + a / 3, p + a * 2 / 3, "Замена данных ...", ФИО
            For i = 1 To КоличествоОбрабатываемыхСтолбцов
                FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i))
                ' так почему-то заменяет не всё (не затрагивает таблицу)
                'WA.Selection.Find.Execute FindText, , , , , , , wdFindContinue, False, ReplaceText, True
                pi.line3 = "Заменяется поле " & FindText
                With WD.Range.Find
                    .Text = FindText
                    .Replacement.Text = ReplaceText
                    .Forward = True
                    .Wrap = 1
                    .Format = False: .MatchCase = False
                    .MatchWholeWord = False
                    .MatchWildcards = False
                    .MatchSoundsLike = False
                    .MatchAllWordForms = False
                    .Execute Replace:=2
                End With
                DoEvents
            Next i
            pi.StartNewAction p + a * 2 / 3, p + a, "Сохранение файла ...", ФИО, " "
            WD.SaveAs Filename: WD.Close False: DoEvents
            p = p + a
        End With
    Next row
    pi.StartNewAction s2, , "Завершение работы приложения Microsoft Word", " ", " "
    WA.Quit False: pi.Hide
    msg = "Сформировано " & rc & " договоров. Все они находятся в папке" & vbNewLine & НоваяПапка
    MsgBox msg, vbInformation, "Готово"
End Sub

Заранее спасибо!
Найти ближайшую заполненную ячейку в столбце
 
Андрей VG, _Igor_61, nbaengineer, большое спасибо за предложенные варианты!

Андрей VG, извините за слог, иногда, действительно, сложно получается...
Найти ближайшую заполненную ячейку в столбце
 
Здравствуйте!

Есть таблица с заголовками: дата, время, событие. Ячейки в колонках "время" и "событие" заполнены через несколько пустых строк от "даты", количество пустых строк может быть разным.

Надо перетащить значения из колонок "время" и "событие" на одну строку с "датой" (в одну дату может быть только одно время и соответствующее ему событие).

Думаю, что надо вставать в ячейку справа от даты и копировать туда ближайшую заполненную в этой колонке ячейку по направлению "вниз".

Подскажите, пожалуйста, как это написать в коде?

Пример прилагаю.

Спасибо!
Вытащить год из текста ячейки
 
Kuzmich, большое спасибо!
Пора учить регулярки...

небольшое дополнение, если вдруг у кого-то еще возникнет такая задача:
предложенное решение приведет к остановке выполнения кода, если в какой-то ячейке вдруг будет отсутствовать год
Вытащить год из текста ячейки
 
Прикладываю пример
Вытащить год из текста ячейки
 
Цитата
Попробуйте использовать Like
простите мое незнание, как можно использовать Like, чтобы вернуть номер нужного символа в ячейке? Или вы имеете в виду вообще другую логику решения этой задачи?

а если написать
Код
InStr(Cells(2, 1), like "*20##*")
то ругается...
Изменено: domybest - 17.06.2020 17:30:35
найти разрыв строки с фамилией и заменить на дефис с фамилией
 
Как правильно отметил vikttur, моя ошибка была в том, что не указал нужный элемент массива, когда исправил ошибку и получилось
Код
Cells(1, 3) = Replace((Cells(1, 2)), Chr(10) & Split(Cells(1, 1))(0), "-" & Split(Cells(1, 1))(0))
результат стал соответствовать моим ожиданиям!

Спасибо всем, кто откликнулся и следил на темой!
Вытащить год из текста ячейки
 
Уважаемый bigorq,

Цитата
А когда # стали подстановочными символами?
Не знаю, пропустят ли ссылку на внешний сайт (microsoft))), но вот тут
https://docs.microsoft.com/ru-ru/office/vba/language/reference/user-interface-help/wildcard-characte...
написано, что
#Любая цифра (09)
Вытащить год из текста ячейки
 
Уважаемый Kuzmich,, к сожалению, пришлось переключиться на другую задачу, к той теме хотел бы вернуться, но позже!
Вытащить год из текста ячейки
 
Здравствуйте!

Есть множество ячеек, в которых среди прочих данных содержится год (четыре цифры, например, 2015). Эти 4 цифры года надо вытащить в отдельную ячейку. Год разный, но больше 2000, поэтому думал использовать 20##, через instr найти позицию первой цифры, потом через mid вытащить 4 символа с полученной позиции.

Но
Код
InStr(Cells(2, 1), "20##")
возвращает 0. Если задать жестко, например, 2015, номер позиции возвращает корректно.

Как лучше поступить?

Спасибо!
найти разрыв строки с фамилией и заменить на дефис с фамилией
 
Спасибо!
Исправил !
найти разрыв строки с фамилией и заменить на дефис с фамилией
 
Здравствуйте!

Есть столбец с фио полностью, оттуда берется фамилия через Split(Cells(1, 2))
Есть другой столбец с библиографической ссылкой, где перед фамилиями есть разрыв строки chr(10)

Пытаюсь заменить разрыв строки chr(10) с фамилией Split(Cells(1, 2)) на дефис с той же фамилией через Replace
Код
Cells(1, 3) = Replace((Cells(1, 2)), Chr(10) & Split(Cells(1, 1)), "-" & Split(Cells(1, 2)))
Дает ошибку Type mismatch.
Если переставляю кавычки вот так
Код
Cells(1, 3) = Replace((Cells(1, 2)), "Chr(10) & Split(Cells(1, 1))", "- & Split(Cells(1, 2))")
возвращает исходную ячейку без изменений.
Просто заменить разрыв строки на дефис (без фамилии) нельзя, т.к. в ячейках есть другие разрывы строк, которые надо сохранить.

Подскажите, пожалуйста, как можно решить задачу!
Спасибо!
Поиск и автозамена из экселя в ворде с подстановочными символами
 
Ура, получилось!

Спасибо всем огромное!!!
Поиск и автозамена из экселя в ворде с подстановочными символами
 
pantel1987, спасибо!

Исправил на
Код
.MatchWildcards = True

Но компилятор стал ругаться на строку
Код
.Execute Replace:=2
со словами "Поле "Найти" содержит неверный шаблон поиска"...

Самое странное, пробую в ворде обычную автозамену (Ctrl+P, без макросов) {*} на пустоту - ничего не делает...

Гуглю сейчас, какой символ(ы) ворд понимает как любое количество любых символов...
Поиск и автозамена из экселя в ворде с подстановочными символами
 
pantel1987, спасибо! Но, к сожалению, Ваш вариант не помог.
Провел эксперимент: если в документ ворд добавить текст {*}, то следующий код удалит этот текст
Код
            FindText = "{*}": ReplaceText = ""
            
                With WD.Range.Find
                    .Text = FindText
                    .Replacement.Text = ReplaceText
                    .Forward = True
                    .Wrap = 1
                    .Format = False: .MatchCase = False
                    .MatchWholeWord = False
                    .MatchWildcards = False
                    .MatchSoundsLike = False
                    .MatchAllWordForms = False
                    .Execute Replace:=2
                End With

То есть, звездочка воспринимается кодом именно как звездочка, а не подстановочный символ!...
Поиск и автозамена из экселя в ворде с подстановочными символами
 
vikttur, спасибо!

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

А я пытаюсь выполнить замену в Word, соответственно "текстом" у меня является весь документ: не знаю, как это указать
Поиск и автозамена из экселя в ворде с подстановочными символами
 
Здравствуйте!

Есть макрос, который создает документы ворд по шаблону на основе данных с листа эксель.
Также нужно, чтобы в документе ворд удалялся весь текст, заключенный в фигурные скобки, и сами эти скобки. Пытаюсь использовать подстановочный символ *, но ничего не удаляется.

Если не использовать подстановочные символы, все работает.
Код
            FindText = "{*}": ReplaceText = ""
            
                With WD.Range.Find
                    .Text = FindText
                    .Replacement.Text = ReplaceText
                    .Forward = True
                    .Wrap = 1
                    .Format = False: .MatchCase = False
                    .MatchWholeWord = False
                    .MatchWildcards = False
                    .MatchSoundsLike = False
                    .MatchAllWordForms = False
                    .Execute Replace:=2
                End With

Подскажите, пожалуйста, что неправильно делаю?

Спасибо!
Формат даты - месяц прописью в родительном падеже
 
Огромное спасибо!

П.С. Второй вопрос перестал быть актуален в связи с решением первого)
Формат даты - месяц прописью в родительном падеже
 
Здравствуйте!

Столкнулся с двумя сложностями в связи с форматом даты.

1. Нужно, чтобы дата отображалась с месяцем прописью строчными буквами в родительном падеже (например, 15 сентября 2020 г.). Но при задании формата .NumberFormat = "dd mmmm yyyy г." месяц отображается в именительном падеже и с заглавной буквы (15 Сентябрь 2020 г.).

2. вопрос удален :)

Фрагмент кода, которым идет перенос в ворд:
Код
            For i = 1 To 15

                FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i))

                With WD.Range.Find
                    .Text = FindText
                    .Replacement.Text = ReplaceText
                    .Forward = True
                    .Wrap = 1
                    .Format = True: .MatchCase = False
                    .MatchWholeWord = False
                    .MatchWildcards = False
                    .MatchSoundsLike = False
                    .MatchAllWordForms = False
                    .Execute Replace:=2
                End With

                DoEvents
            Next i

Помогите, пожалуйста, что нужно сделать!

Заранее спасибо!
Задание шаблона через переменную в Like
 
Огромное спасибо, очень выручили!
Посчитать суммы значений для определенных категорий данных
 
Большое спасибо за замечания, советы и подсказки!!!

Буду разбираться со сводной таблицей, словарями и массивами!
Посчитать суммы значений для определенных категорий данных
 
Здравствуйте!

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

Есть таблица:
Дата
Фамилия
Филиал
Департамент
Обслужено клиентов на выезде
Обслужено клиентов в офисе

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

Как неискушенный человек не придумал ничего лучше, чем последовательно перебирать ячейки (через For) с проверкой соблюдения условий (через If, ElseIf).

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

Файл с примером прилагаю.

Заранее спасибо!
Задание шаблона через переменную в Like
 
Здравствуйте!

Если указывать конкретный текст в звездочках (например, "*Яблоков*"), то Like обрабатывает ячейки, содержащие данный текст. Если вместо конкретного текста указывать переменную, то звездочки справа и слева уже не поставишь и Like начинает работать как =.

Как можно выйти из ситуации с наименьшим усложнением кода?

Задача: таблица (лист 2 в приложенном файле) с фамилиями, в соседней ячейке проставлено "да", если человек выполнил задание, и пустота, если не выполнил. Фамилии повторяются, в одной ячейке может быть несколько фамилий (в этом случае считать, что каждый выполнил условие).

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

Код
Sub test()

    Dim iLastRowA As Long
    iLastRowA = Worksheets("1").Cells(Rows.Count, 1).End(xlUp).Row

    Dim lLastRowB As Long
    iLastRowB = Worksheets("2").Cells(Rows.Count, 1).End(xlUp).Row

    Dim i As Long
    Dim j As Long
    Dim x As String

    For i = 2 To iLastRowA

        x = Worksheets("1").Cells(i, 1)

            For j = 2 To iLastRowB

                If Worksheets("2").Cells(j, 1) Like x And Worksheets("2").Cells(j, 2) = "да" Then

                   Worksheets("1").Cells(i, 2) = Worksheets("1").Cells(i, 2) + 1

                End If

            Next

    Next

End Sub

Заранее спасибо!
В функция Mid аргумент длина в виде переменной или функции
 
Благодарю, Ваш вариант, конечно, гораздо удобнее!

Что касается ответа на вопрос про аргумент Mid:
Цитата
чтобы использовать в функцие Mid аргумент длина в виде переменной или функции, пользуйтесь переменной или функцией в качестве аргумента длина функции Mid
я пользовался по аналогией с Left:
Код
Cells(i, 2) = Left(Cells(i, 1), InStrRev(Cells(i, 1), "///"))
но, видимо, не учел, что у
Код
Mid(строка, начало, [длина])
поэтому "///" воспринималась как длина, а не как аргумент InStrRev.

При этом так и не понимаю, можно ли использовать эту функцию в качестве аргумента. Если взять в скобки InStrRev
Код
Cells(i, 3) = Mid(Cells(i, 1), (InStrRev(Cells(i, 1), "///")))
тоже не работает...
В функция Mid аргумент длина в виде переменной или функции
 
Здравствуйте!

Может ли аргумент "длина" функции Mid задаваться не конкретным числом, а переменной или другой функцией?
Для функции Left длина может задаваться другой функцией, например: InStrRev, но для Mid ругается: Run-time error 5: Invalid procedure call or argument.
Код
Sub test()

Dim i As Long
Dim iLastRow As Long

iLastRow = Cells(Rows.Count, 1).End(xlUp).Row

For i = 1 To iLastRow    
    Cells(i, 2) = Left(Cells(i, 1), InStrRev(Cells(i, 1), "///"))
    Cells(i, 3) = Mid(Cells(i, 1), InStrRev(Cells(i, 1), "///"))   
Next

End Sub

Задача, которую хочу решить этим кодом: разделить содержимое ячейки в столбце А на соседние столбцы В и С по разделителю ///.
Ругается на
Код
Cells(i, 3) = Mid(Cells(i, 1), InStrRev(Cells(i, 1), "///")) 
ругается.
Если не через Mid, как еще можно решить эту задачу без сильного усложнения кода (совсем новичок).

Спасибо.
данные из полей форм Word в Excel
 
Здравствуйте!

Есть множество файлов .doc(x) в одной папке с одинаковой структурой, но разным содержанием. Файлы защищены от изменений за исключением возможности ввода данных в поля форм. Каждому полю присвоено уникальное имя f1, f2, f3 соответственно.

Как данными из полей форм ворд автоматически заполнить таблицу в эксель.

Примеры прилагаются.

Тут есть похожий случай
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=98430

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

Спасибо!
фамилии и инициалы авторов из библиографического описания в отдельную ячейку
 
Здравствуйте!

Подскажите, пожалуйста, как с помощью функции или макроса выцепить фамилии и инициалы автора из библиографической ссылки (одна библиографическая ссылка - одна ячейка эксель) в отдельную ячейку? Желательно справляться со случаями, когда авторов несколько.

Пример:
Иванов И.И., Петров П.П. Очень хорошая книга. М.: Просвещение, 2020.
Сидоров С.С. Тоже неплохая книга. СПб.: Аврора, 2019.

Надо:
Иванов И.И., Петров П.П.
Сидоров С.С.

Заранее спасибо!
Изменено: domybest - 13.04.2020 16:34:10
Страницы: 1
Наверх