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

Страницы: 1
Посчитать сумму месячных приходов по торговым точкам
 

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

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

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

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

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

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

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

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

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

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

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

Спасибо!
Вытащить год из текста ячейки
 
Здравствуйте!

Есть множество ячеек, в которых среди прочих данных содержится год (четыре цифры, например, 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))")
возвращает исходную ячейку без изменений.
Просто заменить разрыв строки на дефис (без фамилии) нельзя, т.к. в ячейках есть другие разрывы строк, которые надо сохранить.

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

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

Если не использовать подстановочные символы, все работает.
Код
            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

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

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

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

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

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

Как неискушенный человек не придумал ничего лучше, чем последовательно перебирать ячейки (через 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 задаваться не конкретным числом, а переменной или другой функцией?
Для функции 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
Наверх