ВНИМАНИЕ! За задачу взялся конкретный исполнитель!
Приветствую всех! Есть сетевой диск с примерно 40-ка папками (условно -- диск "M"). Структура каждой папки неоднородна. Поэтому количество вложений не идентично и внутри именование подпапок также неоднородно и путь прописать невозможно. Есть также папки (10 шт.) в которых искать точно не нужно. Их можно прописать как исключения. Есть конкретная "маска имени файла" с расширением "xlsx". В "маске" имени помимо прочего обязательно присутствуют слова " *Роза ветров*". Поэтому нужно чтобы макрос искал по всем папкам, лежащим в корне диска "M", вложенным подкаталогам и найдя файлы с нужной маской и расширением, перемещал данные файлы ( с удалением из исходных папок) в конкретную папку на диске "D" ( к примеру "D:\Роза\Май 2025\") При этом месяц в имени папки "май") должен макросом определяться, как "текущая дата" в формате "мммм.гггг". Если папка "Май" уже существует, а файл перемещается сегодня и сегодня май, то новая папка не создаётся. Если при перемещении уже июнь, а папки "Июнь" нет, то она должна быть создана. При этом необходимо сопроводить код комментариями о том, какая чать кода чего выполняет. Комментарий требуется на русском языке ))) Готов обсудить предложения по стоимости. Срок не горит, но затягивать не хочется. Бюджет по задаче = 1,5К Спасибо!
Изменено: Konstanta - 24.06.2025 11:58:03(пометка о начале исполнения)
Я видел, спасибо за совет. Наверное это я сглупил, обратившись именно к Игорю. Кстати, очень жаль, что он давно не заходит. Я много раз именно с его помощью решал задачки. Что касается данной темы, я готов на платной основе посотрудничать с желающими, чтобы решить следующую задачу: Есть сетевой диск с примерно 40-ка папками. Структура каждой папки неоднородна. Поэтому количество вложений не идентично и внутри именование подпапок также неоднородно и путь прописать невозможно. Но есть конкретная "маска имени файла", ну и конечно есть расширение "xlsx". В "маске" имени помимо прочего присутствуют слова "Роза ветров". Поэтому нужно чтобы макрос искал по всем папкам, лежащим в корне, вложенным подкаталогам и найдя файлы с нужной маской и расширением, перемещал данные файлы ( с удалением из исходных папок) в конкретную папку на диске "D" ( к примеру "D:\Роза\Май 2025\") При этом месяц в имени папки "май") должен макросом определяться, как "текущая дата" в формате "мммм.гггг". Если папка "Май" уже существует, а файл перемещается сегодня и сегодня май, то новая папка не создаётся. Если при перемещении уже июнь, а папки "Июнь" нет, то она должна быть создана. Прошу администраторов разместить данную задачу в платной ветке. Я просто не могу её сам найти, но видел что по просьбе пользователей это делается. Спасибо!
написал: Sub MoveFiles() Dim fso, f, r: r = 1 Set fso = CreateObject("Scripting.FileSystemObject") Do While Not IsEmpty(Cells(r, 1)) Set f = fso.GetFile("d:\" & Cells(r, 1)) f.Move "d:\" & Cells(r, 2) & "\" & Cells(r, 1) r = r + 1 LoopEnd Sub
Iгор приветствую Вас! Как должен выглядеть данный код, если исходные файлы лежат не в корне диска, а раскиданы в разных подпапках (в разных уровнях вложений) конкретного сетевого диска с известной буквой (к примеру "L") ?
написал: Ну так возьмите из 1С отчёт в нужном виде только по этому менеджеру.
Была бы такая возможность, не было бы проблемы... Там предприятие по стране раскидано филиалами. Отчёт этот единый и его выгружают программисты, которые являются неприкосновенными недотрогами, которых даже никто не знает кто и где. А потом каждый из менеджеров по неделе тратит по вечерам, на то, чтобы сделать свои выборки из данной темы... .
New, приветствую Вас! Спасибо, что откликнулись так быстро! На первый взгляд всё работает. В файле-образце работает прям отлично. Число строк (строчной части таблицы) переносится в лист результатов и суммы по столбцам строчных значений идентичны исходному отчёту. Проблемы возникают в оригинальном рабочем файле (а он довольно большой). В лист "Result" странным образом не выгружается часть данных. Я пока не могу понять, почему именно.
Я готов оплатить Ваше участие в решении моей задачи и доведении её до логического завершения. Возьмётесь?
В целом задача у меня состоит в следующем: Есть большой файл xls, по структуре идентичный файлу примера, но порядка 20 тысяч строк (он очень трудно открывается и после открытия ещё до пяти минут моргает, выстраивая иерархическую структуру). Конечно в исходном файле отчёта нет никаких макросов. В нём иерархия по менеджерам.
Конечная задача -- получить в другой файл, в котором будет дальнейшая обработка данных, массив данных только по одному менеджеру, ФИО которого будет указано в ячейке итогового отчёта (условно "A1" листа Лист1). По-хорошему, исходный файл отчёта даже открывать не хочется. Но понятно, что при построении простого запроса (с чего и начинал) результат загружается без учёта иерархии, поэтому и пришлось в эту тему обращаться.
Приветствую всех! Как должен выглядеть этот код, если вместо текста типа "апельсин", в таблице числовые данные (и целые и нецелые числа), а удалить (ну или переместить) нужно строки, значения в которых меньше (или больше) заданной величины. К примеру если по тому же столбцу "C" значения меньше 500 ? Спасибо !
Option Private Module
Sub Удалить_Пустоты() ' перебор ячеек диапазона в поисках значения "ТекстДляПоиска"
Dim cell As Range, delra As Range, ТекстДляПоиска As String
Application.ScreenUpdating = False
ТекстДляПоиска = ""
For Each cell In Range("C1:C50000").Cells
If cell = ТекстДляПоиска Then
If delra Is Nothing Then Set delra = cell Else Set delra = Union(delra, cell)
End If
Next
'Это если подходящие строки найдены - удаляем их
If Not delra Is Nothing Then delra.EntireRow.Delete
End Sub
Sub дубли()
'
Range("A2:N50000").Select
ActiveSheet.Range("$A$3:$N$50000").RemoveDuplicates Columns:=3, Header:= _
xlYes
End Sub
Private Sub CommandButton1_Click()
If MsgBox("Напечатать загруженный диапазон?", vbYesNo) = vbNo Then
Exit Sub
Else
' Шрифт белый
Nav = [Строк] + 2
Range("L3", Cells(Nav, 14)).Select
With Selection.Font
.ThemeColor = xlThemeColorDark1
.TintAndShade = 0
End With
'
Application.Goto Reference:="Загружен"
Selection.PrintOut 'печать выделенного диапазона
' ' Шрифт чёрный
Nav = [Строк] + 2
Range("L3", Cells(Nav, 14)).Select
With Selection.Font
.ColorIndex = xlAutomatic
.TintAndShade = 0
End With
End If
End Sub
Sub Загрузить_остатки()
If Dir("C:\Ревизия\Импорт\*.*xls") = "" Then
MsgBox "нет файла"
Exit Sub
Else
Application.ScreenUpdating = False ' True
Sheets("Инвентаризационная_ведомость").Select
Columns("L:L").Select
With Selection.Font
.ThemeColor = xlThemeColorDark1
.TintAndShade = 0
End With
Range("L2").Select
With Selection.Font
.ColorIndex = xlAutomatic
.TintAndShade = 0
End With
'--------------------------
'' форматируем наименование, цену МХ
'---------------------
Const TargDir$ = "C:\Ревизия\Импорт\", Sht& = 1
Dim wb As Workbook, fn$
' Application.ScreenUpdating = False
With Workbooks.Add.Worksheets(1)
.Cells(1) = 1: fn = Dir(TargDir & "*.xls*")
Do While fn <> ""
Set wb = Workbooks.Open(TargDir & fn)
If wb.Worksheets.Count >= Sht Then _
wb.Worksheets(Sht).UsedRange.Copy .Cells(.UsedRange.Rows.Count + 1, 1)
wb.Close False: fn = Dir
Loop
End With
' УдалениеСтрокПо_Значению_в_диапазоне() ' перебор ячеек диапазона в поисках значения "da"
Dim cell As Range, delra As Range, ТекстДляПоиска As String
Application.ScreenUpdating = False
ТекстДляПоиска = ""
For Each cell In Range("F1:F30000").Cells
If cell = ТекстДляПоиска Then
If delra Is Nothing Then Set delra = cell Else Set delra = Union(delra, cell)
End If
Next
ТекстДляПоиска1 = "Ед."
For Each cell In Range("F1:F30000").Cells
If cell = ТекстДляПоиска1 Then
If delra Is Nothing Then Set delra = cell Else Set delra = Union(delra, cell)
End If
Next
If Not delra Is Nothing Then delra.EntireRow.Delete
'
Range("A" & Rows.Count).End(xlUp).Offset(0).Select 'Последняя строка +0
ActiveCell.Offset(0, 11).Select 'Перейти на X шагов вниз и на Y вправо
ActiveCell.FormulaR1C1 = "0"
ActiveCell.Offset(0, 2).Select
ActiveCell.FormulaR1C1 = "0"
Range("L1").FormulaR1C1 = "=RC[-5]"
Range("L1").Select
Selection.Copy
Range(Selection, Selection.End(xlDown)).Select
ActiveSheet.Paste
Application.CutCopyMode = False
book = ActiveWorkbook.Name
Columns("L:L").Select
With Selection.Font
.ThemeColor = xlThemeColorDark1
.TintAndShade = 0
End With
Range("L2").Select
With Selection.Font
.ColorIndex = xlAutomatic
.TintAndShade = 0
End With
ActiveSheet.UsedRange.Select 'Выделяет заполненную таблицу
Selection.Copy
ThisWorkbook.Activate
Sheets("Инвентаризационная_ведомость").Select
Range("A" & Rows.Count).End(xlUp).Offset(1).Select 'Последняя строка +1
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
' Создать_диапазон()
ActiveWorkbook.Names.Add Name:="Загружен", RefersToR1C1:="=" & Selection.Parent.Name & "!" & Selection.Address(ReferenceStyle:=xlR1C1)
Calculate
Windows(book).Activate
Application.CutCopyMode = False ' Очистить буфер памяти
ActiveWindow.Close False 'закрыть без запроса на сохранение
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
' Перемещаем файлы в другую папку
fso.MoveFile "C:\Ревизия\Импорт\*.xls", "C:\Ревизия\Загруженные\"
ThisWorkbook.Activate
Sheets("Инвентаризационная_ведомость").Select
End If
Range("A3:M3").Copy
Range("A4", Cells(Nav, 13)).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Nav = [Строк] + 2
Range("N3").FormulaR1C1 = "=RC[-2]-RC[-7]"
Range("N3").Copy
Range("N4", Cells(Nav, 14)).Select
ActiveSheet.Paste
Application.CutCopyMode = False ' Очистить буфер памяти
'
Call дубли
Call Удалить_Пустоты
Nav3 = [Строк] + 2
Range("A3", Cells(Nav3, 3)).Value = Range("A3", Cells(Nav3, 3)).Value ' Весь массив заменяем значениями
Columns("L:L").Select
With Selection.Font
.ColorIndex = xlAutomatic
.TintAndShade = 0
End With
Range("L2").Select
ActiveSheet.Range("$A$3:$N$50000").RemoveDuplicates Columns:=3, Header:= _
xlYes
' форматируем границы таблицы
Cells.Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
Selection.Borders(xlEdgeLeft).LineStyle = xlNone
Selection.Borders(xlEdgeTop).LineStyle = xlNone
Selection.Borders(xlEdgeBottom).LineStyle = xlNone
Selection.Borders(xlEdgeRight).LineStyle = xlNone
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Range("Загружен").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlHairline
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlHairline
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlHairline
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlHairline
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlHairline
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlHairline
End With
' Место хранения вправо
Nav = [Строк] + 2
Range("B2", Cells(Nav, 1)).Select
With Selection
.HorizontalAlignment = xlRight
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
' Цена с копейками
'
Nav = [Строк] + 2
Range("H3", Cells(Nav, 8)).Select
Selection.NumberFormat = "0.00"
With Selection
.HorizontalAlignment = xlRight
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
' Наименование переносить по словам
'
Nav = [Строк] + 2
Range("E3", Cells(Nav, 5)).Select
With Selection
.HorizontalAlignment = xlLeft
.VerticalAlignment = xlCenter
.WrapText = True
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
' Формат вправо
'
Nav = [Строк] + 2
Range("C3", Cells(Nav, 3)).Select
With Selection
.HorizontalAlignment = xlRight
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Nav = [Строк] + 2
Range("G3", Cells(Nav, 14)).Select
With Selection
.HorizontalAlignment = xlRight
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Calculate
' Application.Goto Reference:="Загружен"
' Call CommandButton1_Click
' Удалить_диапазон()
Application.Goto Reference:="Загружен"
ActiveWorkbook.Names("Загружен").Delete
' Call Valid
ActiveSheet.DisplayPageBreaks = False ' устраняет мерцание кнопок
Application.ScreenUpdating = True 'False ' True
''
' End If
End Sub
Sub Очистить_Рукописку()
'
'
Application.ScreenUpdating = False 'False ' True
Sheets("Инвентаризационная_ведомость").Select
If [Строк] < 2# Then
Exit Sub
End If
Nav = [Строк] + 3
Range("A3", Cells(Nav, 15)).Select
Selection.Delete Shift:=xlUp
Range("A3:N3").ClearContents
Range("A3").Select
' Call Valid
Application.ScreenUpdating = True 'False ' True
End Sub
Жители "планеты Excel "? приветствую Вас! Есть работающий макрос. Составлен из кучи решений и подсказок разных авторов Планеты Excel из разных времён. Макрос работает. При загрузке небольших массивов данных всё было хорошо (терпимо). Но при загрузке больших объёмов данных (50-60 листов) макрос тормозит. Я никогда не занимался "оптимизацией кода" и предполагаю что специалистам на "мой" код смотреть будет больно. Тем не менее, передо мной задача стоит и решать её как-то надо. Файл примера (только один макрос и только шапка таблицы, которую собственно макрос заполняет, данными из файлов (прописан путь)) данный ресурс не принимает, поскольку видимо только текст макроса (там более нет ничего) весит 971 КБ. Готов выслать сам файл и при необходимости, пару файлов с данными, тому кто возьмётся за данную задачку. Не хочу обидеть специалистов низкой суммой, но но так, навскидку скажу, что мне не жалко будет заплатить 1 000 руб. за реальную помощь в существенном ускорении работы макроса (с комментариями по тексту кода).
Добрый день Странное поведение проявил макрос: Исчезнувший на этапе тестирования недочёт вдруг появился опять, перед самым внедрением готового рабочего файла.
на 1 странице всего 62 строки. Строка "Итого по странице" идёт следующей строкой, но она не последняя на странице. Следующая строка продолжает таблицу (за номером 63) на этой же странице.
Начиная со следующей страницы (и до 16 включительно), к последней строке (после "Итого по странице) начинает прибавляться по одной строке, кратно числу страниц, а вставленная макросом строка с итогом соответственно смещается вверх. То есть на пятой странице, под строкой "Итого по странице", ещё пять строк продолжения таблицы и так до 16 страницы включительно. Интересно что после 16 страницы всё встало нормально (по строкам) и дальнейшая таблица нормально разбита постраничными итогами. Вот код, подскажите пожалуйста что исправить:
Код
Sub постраничные_итоги()
Application.ScreenUpdating = False 'False True
ActiveWindow.View = xlPageBreakPreview
Dim i&, hpb As HPageBreak, c1 As Range, c2 As Range
Set c1 = [A3] ' >>> первая ячейка суммируемого столбца <<<
For Each hpb In ActiveSheet.HPageBreaks
Set c2 = Cells(hpb.Location.Row - 1, c1.Column)
'c2.Select
c2.EntireRow.Insert
c2.Offset(-1, 2).Formula = "=""Итог по странице: Число порядковых номеров = ""&SUBTOTAL(3," & Range(c1, c2.Offset(-2, 0)).Address & ")& ""; Сумма фактического кол-ва штук = ""&SUBTOTAL(9," & Range(c1.Offset(0, 7), c2.Offset(-2, 7)).Address & ")"
Set c1 = c2
Next
Set c1 = Cells(Rows.Count, c1.Column).End(xlUp)
ActiveWindow.View = xlPageLayoutView
ActiveWindow.View = xlNormalView
ActiveWindow.SplitRow = 2
ActiveWindow.FreezePanes = True
Application.ScreenUpdating = True 'False True
End Sub
Я успешно нашёл причину смещения строк! Ввиду того, что промежуточный итог заполнялся в столбец А, каждая новая " С2" прибавляла не до конца предыдущей таблицы, а до уже заполненной ранее ячейки "С2" Переместив заполняемую ячейку из столбца А в другой столбец, проблема решилась. С размещением и постраничным итогом вопрос полностью решился. С форматированием строк ( по п. 3 исходного запроса) так ничего и не получилось пока, буду думать!
Ну с размещением формул и надписей я разобрался. Всё получилось как надо а вот с тем, что строка не последняя и смещается вверх с кажной страницей, пока не могу ничего сделать. Подскажите пожалуйста.
ну не всё так плохо. Я отвечаю за свои слова и предложение в силе ))) а уж в каком разделе оно будет решено, это на размеры моей благодарности не влияет!
Спасибо огромное, что откликнулись! Это уже многое. По работе макроса: запустил в массиве заполненных данных. наблюдение №1: на 1 странице всего 53 строки. Строка "Итого по странице" идёт следующей строкой, но она не последняя на странице. Следующая строка продолжает таблицу (за номером 54) и она является последней на этой странице. Начиная со следующей страницы (и до 17 включительно), к последней строке (после "Итого по странице) начинает прибавляться по одной строке, кратно числу страниц. То есть на пятой странице, под строкой "Итого по странице", ещё пять строк продолжения таблицы и так до 17 страницы включительно. Интересно что после 17 страницы всё встало нормально (по строкам).
Наблюдение 2: в ячейке по стоблцу "A" действительно становится сумма промежуточных итогов, которая охватывает диапазон от "-1 строка до "следующего итога". Например на странице 17 она показывает 74 строки (из них 54 на своей странице и остальные на предыдущей странице, то строки Итого) Но необходимо чтобы в крайней левой ячейке (как вариант по столбцу "B") было указано "Число порядковых номеров на странице:" а справа от этой записи уже эта формула, которая посчитает промежуточные итоги по столбцу "A". С текстом который сейчас пишется макросом как "Итого по странице", я уже примерно понимаю как его сдвинуть вправо и полагаю что сам это сделаю.
Добавлю необходимые элементы "ТЗ" 1. После окончания формирования описи необходимо макросом внизу на каждой печатной странице (под нижней строкой таблицы но сразу над колонититулом) вставить строку в которой: слева на странице: "Число порядковых номеров на странице:" и в соседней справа ячейке значение (счёт по столбцу A в пределах этой страницы) Отформатировать по левому краю. справа на странице: "Общий итог фактического кол-ва штук на странице:" и в соседней справа ячейке значение (сумма по столбцу H в пределах этой страницы). Отформатировать по правому краю. 2. Всё это необходимо сделать на всех страницах, кроме самой последней страницы. 3. На последней странице будет строка "итого". Я сам её сделаю и обработаю. Необходимо отформатировать высоту всех строк (включая добавленные по п. 1) чтобы выше последней строки на последней странице было как минимум три строки таблицы описи.
Уважаемые модераторы! В связи с отсутствием интереса к данной теме, прошу перенести её в платный раздел сайта. Надеюсь что там я смогу получить помощь. Спасибо !
Попытался я его применить к своему файлу с другой структурой, но ничего не вышло, а проблема остаётся. Помогите пожалуйста, кто сможет: В таблице на последней строке каждой печатной страницы необходимо указать Число порядковых номеров на странице (счёт по столбцу A) и Общий итог фактического кол-ва штук на странице (сумма по столбцу H). Я пытался менять код, но не получил нужного результата. Прикладываю файл. Спасибо всем кто откликнется.
Добрый день! В развитие темы вопрос: данный макрос (судя по примеру) отлично справляется с итогом по концу страницы.
А как реализовать такай вариант: В примере 44 строка таблицы является последней на листе. После выполнения операции постраничного итога, вставить пустую строку между 44 и 45 и в данную строку записать итоги непосредственно в структуре таблицы, по графам этой таблицы, а не справа, как сейчас?
Вот крайний Ваш код прям почти то, что мне нужно, но я не смог прикрутить к нему Ваше решение, которое Вы ранее подсказали мне в другой теме. Мне надо в исходной папке все обработанные файлы удалить, и перенести их в папку "C:\test\Отработка" и как указать параметр "пропустить нужное число строк сверху листа" ?
Ещё как работают. На либре несколько лет рабочие файлы, сделанные в Excel используем в 30-ти предприятиях. Но Либре имеет значительно более скудный функционал приложения и не может соперничать с Excel. И события также работают, в том числе на открытие. И макросы там запущены. И да, уважаемый bigorq, я знаю много людей, которые откроют xlsm файл в Либре, не отключая макросы, потому что просто привыкли запускать файлы данного типа в Либре, а у большинства из них вообще настроена ассоциация расширения xlsm на открытие Либре офисом. Дело в том, что для применения в Либре я делал подобие обфускации VBA кода. Но теперь рабочий файл будет работать в Excel и хочется обойтись стандартными для него методами.