Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
10 / 9 / 1
Регистрация: 12.06.2014
Сообщений: 259

Разбить файл на кучу других файлов

17.11.2021, 17:28. Показов 1314. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня!
Прошу помощи, что то вообще запутался.
Есть файл заказа (во вложении) где в нескольких столбцах размещаются код адреса, наименование, номенклатура и т.д.
Основное это код адреса.

Уникальных кодов может быть более 200, при этом строк до 500-600.
Мне надо как то макросом разбить на несколько файлов по 25-30 уникальных кодов адреса и перенести туда данные из основной таблицы.
Как это сделать?
Сижу уже весь день, ничего не получается
Вложения
Тип файла: xlsx Пример.xlsx (17.8 Кб, 15 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.11.2021, 17:28
Ответы с готовыми решениями:

Разбить один m-файл на кучу маленьких m-файлов
Здравствуйте. Я не новичок в Matlab. Однако просто раньше такого не требовалось. У меня ну просто огромный программный код в m-файле. Можно...

Собрать кучу файлов в один файл Excel
Добрый день! И снова смиренно прошу советов гуру. Исходные данные: около 600 файлов формата csv(3 параметра в строчке) Задача: Собрать...

Вредоносная программа устанавливает кучу других
win7x64. Прилагаю логи. Помогите, пожалуйста

13
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
17.11.2021, 18:28
Там в примере всего 4 кода адреса, задача не актуальна!
Ну а так если коды не уникальны и нужно в один файл собрать все строки одного кода, то:
1. проходим циклом по всему диапазону и собираем в словарь с коллекцией номера строк для каждого кода.
2. создаём новый файл, копируем в него шапку
3. циклом по словарю смотрим сколько у очередного кода строк и если лезет в файл то их копируем любым способом (номера и количество строк в коллекции словаря).
Если нужен новый файл, то сохраняем текущий и п.2.
Как вариант если можно коды дробить по файлам, то даже проще - цикл в цикле по словарю, набиваем файлы.
0
10 / 9 / 1
Регистрация: 12.06.2014
Сообщений: 259
17.11.2021, 19:21  [ТС]
Цитата Сообщение от Hugo121 Посмотреть сообщение
Как вариант если можно коды дробить по файлам, то даже проще - цикл в цикле по словарю, набиваем файлы.
Вот это у меня получилось. Но тогда куча файлов образовывается.Тоже неудобно.
Я могу и все 200+ адресов втянуть в программу обработки заказов, но больше 30 адресов - все виснет и выдает "нехватка памяти"

Цитата Сообщение от Hugo121 Посмотреть сообщение
1. проходим циклом по всему диапазону и собираем в словарь с коллекцией номера строк для каждого кода.
2. создаём новый файл, копируем в него шапку
3. циклом по словарю смотрим сколько у очередного кода строк и если лезет в файл то их копируем любым способом (номера и количество строк в коллекции словаря).
2-3 пункт немного не понял
0
10 / 9 / 1
Регистрация: 12.06.2014
Сообщений: 259
17.11.2021, 19:26  [ТС]
Вот новый пример, для актуальности
Вложения
Тип файла: xls Пример новый.xls (646.5 Кб, 26 просмотров)
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
18.11.2021, 00:47
как вариант отсортировать сначала и обработать массив считая количество уникальных
насобиралось 25 - создать новый файл
0
 Аватар для anton-sf
128 / 64 / 14
Регистрация: 29.03.2015
Сообщений: 265
18.11.2021, 02:10
Авдей, мб так:
Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
'Папка должна существовать
Private Const Папка As String = "D:\ЭкспортТочек"
 
Public Sub Экспорт()
    Dim Индекс As Long
    Dim ЭкспортИндекс As Long
    Dim Область As Range
    Dim ЭкспортОбласть As Range
    Dim Точка As String
    Dim ПредыдущаяТочка As String
    Dim ЭкспортКнига As Workbook
    
    ПредыдущаяТочка = Empty
    Set Область = ThisWorkbook.Worksheets("Рабочий").UsedRange
    Application.ScreenUpdating = False
        Область.Sort Key1:=Область(1, 1), Order1:=xlAscending, _
                    Key2:=Область(1, 2), Order2:=xlAscending, _
                    Key3:=Область(1, 3), Order3:=xlAscending, _
                    Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
                    DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:=xlSortNormal
        For Индекс = 2 To Область.Rows.Count
            Точка = Trim(WorksheetFunction.Trim(Область(Индекс, 1).Value))
                If Точка <> ПредыдущаяТочка Then
                    If Not ЭкспортКнига Is Nothing Then
                        ЭкспортОбласть.Columns.AutoFit
                        ЭкспортКнига.SaveAs Filename:=Папка & "\" & ПредыдущаяТочка & ".xls", FileFormat:=xlNormal, CreateBackup:=False
                        ЭкспортКнига.Close
                    End If
                    Set ЭкспортКнига = Application.Workbooks.Add
                    Set ЭкспортОбласть = ЭкспортКнига.Worksheets(1).Cells
                    ЭкспортОбласть(1, 1) = Область(1, 1).Value
                    ЭкспортОбласть(1, 2) = Область(1, 2).Value
                    ЭкспортОбласть(1, 3) = Область(1, 3).Value
                    ЭкспортОбласть(1, 4) = Область(1, 4).Value
                    ЭкспортОбласть.Columns(1).NumberFormat = "General"
                    ЭкспортОбласть.Columns(2).NumberFormat = "#,##0"
                    ЭкспортОбласть.Columns(3).NumberFormat = "#,##0"
                    ЭкспортОбласть.Columns(4).NumberFormat = "#,##0.00"
                    ЭкспортИндекс = 2
                End If
                If IsNumeric(Точка) Then
                    ЭкспортОбласть(ЭкспортИндекс, 1).Value = "'" & Точка
                Else
                    ЭкспортОбласть(ЭкспортИндекс, 1).Value = Точка
                End If
                ЭкспортОбласть(ЭкспортИндекс, 2).Value = Область(Индекс, 2).Value
                ЭкспортОбласть(ЭкспортИндекс, 3).Value = Область(Индекс, 3).Value
                ЭкспортОбласть(ЭкспортИндекс, 4).Value = Область(Индекс, 4).Value
                ЭкспортИндекс = ЭкспортИндекс + 1
            ПредыдущаяТочка = Точка
    Next
    If Not ЭкспортКнига Is Nothing Then
        ЭкспортОбласть.Columns.AutoFit
        ЭкспортКнига.SaveAs Filename:=Папка & "\" & Точка & ".xls", FileFormat:=xlNormal, CreateBackup:=False
        ЭкспортКнига.Close
    End If
    Application.ScreenUpdating = True
    MsgBox "Экспорт завершен", vbOKOnly, "Сообщение макроса"
End Sub
0
 Аватар для anton-sf
128 / 64 / 14
Регистрация: 29.03.2015
Сообщений: 265
18.11.2021, 08:53
Цитата Сообщение от anton-sf Посмотреть сообщение
Авдей, мб так
Цитата Сообщение от Авдей Посмотреть сообщение
Мне надо как то макросом разбить на несколько файлов по 25-30 уникальных кодов адреса
вот это проглядел - макрос создаёт файлы на каждый адрес
0
10 / 9 / 1
Регистрация: 12.06.2014
Сообщений: 259
18.11.2021, 09:09  [ТС]
Цитата Сообщение от Alex77755 Посмотреть сообщение
как вариант отсортировать сначала и обработать массив считая количество уникальных
Ну у меня пока была мысль такая пронумеровать каждый уник от 1 до упора..и далее уже фильтровать от 1 до 25, от 26 до ...и т.д. и перекидывать в другой файл.
Буду пробовать так пока что..по другом не получается, запутываюсь в циклах и счетчиках

Добавлено через 2 минуты
Цитата Сообщение от anton-sf Посмотреть сообщение
макрос создаёт файлы на каждый адрес
На каждый файл у меня получилось
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
18.11.2021, 09:27
Visual Basic
1
 If Not ЭкспортКнига Is Nothing Then
Цитата Сообщение от Авдей Посмотреть сообщение
На каждый файл у меня получилось
Вот в этом условии разделить не отправлять а увеличивать счетчик уникумов
При достижении заданного формировать книгу и обнулять счетчик

Добавлено через 4 минуты
Visual Basic
1
2
3
4
5
6
7
                If Точка <> ПредыдущаяТочка Then
                    If num < 20 Then
                        num = num + 1
                    Else
                        'формирование книги
                        num = 0
                End If
1
малоболт
1328 / 510 / 213
Регистрация: 30.01.2020
Сообщений: 1,244
18.11.2021, 10:57
Авдей, Вот скрипт на VBS. Может подойдёт?
1. Сохранить код в файл с раcширением .vbs в кодировке WIN-1251 (она же ANSI) в отдельную папку
2. Класть исходный Excel-файл в ту же папку. Если в папке нет xls*-файлов или их там больше одного - скрипт не сработает и обругает.
3. Если файлы всё же надо обрабатывать не в той же папке - прописать полный путь в переменную OutDir в 4 строке
4. Число максимальных определяется константой MaxUniq = 25 во второй строке. Если надо - меняйте.
5. Запускать простым тычком по файлу скрипта или по иконке на рабочем столе, привязанной к файлу.
6. Скрипт сам запускает Excel, открывает исходный файл и создаёт в той же папке набор файлов с именами: ТекущаяДата_N, где N - порядковый номер файла.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 Dim FSO, shA, xFIles, outDir, aa, fNam, fNum, ii, iiMax, ii0, ii1, iUniq, preUniq, jj, jj2Max
 Const MaxUniq = 25
 Set FSO = CreateObject("Scripting.FileSystemObject")
 OutDir = FSO.GetAbsolutePathname("")
 Set shA = CreateObject("Shell.Application")
 Set xFiles = shA.NameSpace(outDir).Items() 'всё, что есть в этой папке
 xFiles.Filter 64,"*.xls*" 'смотрим только на файлы с такой маской
 if xFiles.Count > 1 Then wsh.echo "В папке рядом больше 1 файла *.xls*. "&vbCRLF&"Отказываюсь работать в такой давке!": wsh.quit
 if xFiles.Count < 1 Then wsh.echo "В папке рядом ни одного файла *.xls*.": wsh.quit
 Set xls=CreateObject("Excel.Application")
 xls.visible=True
 with xls.Workbooks.Open(xFiles.Item(0).Path)
   aa=.Sheets(1).UsedRange.Value
   .saved=True: .close
 end with
 Set xFiles=Nothing: Set shA=Nothing
 fNam = Replace(Cstr(date()),".",""): fNum = 0
 iUniq = 0: PreUniq="": ii0 = 2: iiMax = uBound(aa,1): jj2Max = uBound(aa,2)
 for ii = 2 to iiMax Step 1
   if aa(ii,1) <> PreUniq Then
     iUniq = iUniq + 1
     PreUniq = aa(ii,1)
     if iUniq > MaxUniq Then
       if ii0 > 2 Then
         for jj1 = ii0 to ii-1 step 1
           for jj2 = 1 to jj2Max step 1
             aa(jj1-ii0+2,jj2) = aa(jj1,jj2)
           next
         next
       end if
       fNum = fNum + 1
       with xls.WorkBooks.Add
 
         .Sheets(1).Cells(1,1).Resize(ii-ii0+1,jj2Max).Value = aa
         .SaveAs FSO.BuildPath(outDir,fNam & "_" & fNum),51
         .close
       end with
       ii0 = ii: iUniq = 1: PreUniq = aa(ii,1)
     end if
   end if
 next
 fNum = fNum + 1
 with xls.WorkBooks.Add
   .Sheets(1).Cells(1,1).Resize(ii-ii0+1,jj2Max).Value = aa
   .SaveAs FSO.BuildPath(outDir,fNam & "_" & fNum), 51
   .close
 end with
 xls.quit
 Set xls=Nothing: Set FSO=Nothing
1
 Аватар для anton-sf
128 / 64 / 14
Регистрация: 29.03.2015
Сообщений: 265
18.11.2021, 11:00
Лучший ответ Сообщение было отмечено Авдей как решение

Решение

Цитата Сообщение от Авдей Посмотреть сообщение
На каждый файл у меня получилось
Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Private Const Папка As String = "D:\ЭкспортТочек"
Private Const КоличествоТочекВКнигеДляЭкспорта = 25
 
Public Sub Экспорт()
    Dim ИндексИмпорт As Long
    Dim ИндексЭкспорт As Long
    Dim ОбластьИмпорт As Range
    Dim ОбластьЭкспорт As Range
    Dim Точка As String
    Dim КнигаЭкспорт As Workbook
    Dim СчетчикТочекНаЭкспорт As Integer
    Dim НазванияТочек As Collection
    Dim ПредыдущаяТочка As String
    
    Application.ScreenUpdating = False
        Set ОбластьИмпорт = ThisWorkbook.Worksheets("Рабочий").UsedRange
            ОбластьИмпорт.Sort Key1:=ОбластьИмпорт(1, 1), Order1:=xlAscending, _
                        Key2:=ОбластьИмпорт(1, 2), Order2:=xlAscending, _
                        Key3:=ОбластьИмпорт(1, 3), Order3:=xlAscending, _
                        Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
                        Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, _
                        DataOption2:=xlSortNormal, DataOption3:=xlSortNormal
        СоздатьКнигуЭкспорта КнигаЭкспорт, ОбластьЭкспорт, ИндексЭкспорт, ОбластьИмпорт
        Set НазванияТочек = New Collection
        СчетчикТочекНаЭкспорт = 0
        ПредыдущаяТочка = Empty
        For ИндексИмпорт = 2 To ОбластьИмпорт.Rows.Count
            Точка = Trim(WorksheetFunction.Trim(ОбластьИмпорт(ИндексИмпорт, 1).Value))
            If Точка <> ПредыдущаяТочка Then
                СчетчикТочекНаЭкспорт = СчетчикТочекНаЭкспорт + 1
            End If
            If СчетчикТочекНаЭкспорт > КоличествоТочекВКнигеДляЭкспорта Then
                ЗакрытьКнигуЭкспорта КнигаЭкспорт, ОбластьЭкспорт, НазванияТочек
                СоздатьКнигуЭкспорта КнигаЭкспорт, ОбластьЭкспорт, ИндексЭкспорт, ОбластьИмпорт
                Set НазванияТочек = New Collection
                СчетчикТочекНаЭкспорт = 1
            End If
            НазванияТочек.Add Точка
            If IsNumeric(Точка) Then
                ОбластьЭкспорт(ИндексЭкспорт, 1).Value = "'" & Точка
            Else
                ОбластьЭкспорт(ИндексЭкспорт, 1).Value = Точка
            End If
            ОбластьЭкспорт(ИндексЭкспорт, 2).Value = ОбластьИмпорт(ИндексИмпорт, 2).Value
            ОбластьЭкспорт(ИндексЭкспорт, 3).Value = ОбластьИмпорт(ИндексИмпорт, 3).Value
            ОбластьЭкспорт(ИндексЭкспорт, 4).Value = ОбластьИмпорт(ИндексИмпорт, 4).Value
            ИндексЭкспорт = ИндексЭкспорт + 1
            ПредыдущаяТочка = Точка
        Next
        ЗакрытьКнигуЭкспорта КнигаЭкспорт, ОбластьЭкспорт, НазванияТочек
    Application.ScreenUpdating = True
    MsgBox "Экспорт завершен", vbOKOnly, "Сообщение макроса"
End Sub
 
Sub СоздатьКнигуЭкспорта(ByRef КнигаЭкспорт As Workbook, ByRef ОбластьЭкспорт As Range, ByRef ИндексЭкспорт As Long, ByRef ОбластьИмпорт)
    Set КнигаЭкспорт = Application.Workbooks.Add
        Set ОбластьЭкспорт = КнигаЭкспорт.Worksheets(1).Cells
            ОбластьЭкспорт(1, 1) = ОбластьИмпорт(1, 1).Value
            ОбластьЭкспорт(1, 2) = ОбластьИмпорт(1, 2).Value
            ОбластьЭкспорт(1, 3) = ОбластьИмпорт(1, 3).Value
            ОбластьЭкспорт(1, 4) = ОбластьИмпорт(1, 4).Value
            ОбластьЭкспорт.Columns(1).NumberFormat = "General"
            ОбластьЭкспорт.Columns(2).NumberFormat = "#,##0"
            ОбластьЭкспорт.Columns(3).NumberFormat = "#,##0"
            ОбластьЭкспорт.Columns(4).NumberFormat = "#,##0.00"
    ИндексЭкспорт = 2
End Sub
 
Sub ЗакрытьКнигуЭкспорта(ByRef КнигаЭкспорт As Workbook, ByRef ОбластьЭкспорт As Range, ByRef НазванияТочек As Collection)
    ОбластьЭкспорт.Columns.AutoFit
    КнигаЭкспорт.SaveAs Filename:=Папка & "\" & НазванияТочек(1) & "-" & НазванияТочек(НазванияТочек.Count) & ".xls", FileFormat:=xlNormal, CreateBackup:=False
    КнигаЭкспорт.Close
End Sub

Проверил - вроде работает как надо

Цитата Сообщение от Punkt5 Посмотреть сообщение
Отказываюсь работать в такой давке!
Вложения
Тип файла: xls Пример новый.xls (93.5 Кб, 2 просмотров)
1
10 / 9 / 1
Регистрация: 12.06.2014
Сообщений: 259
18.11.2021, 14:35  [ТС]
Цитата Сообщение от anton-sf Посмотреть сообщение
Проверил - вроде работает как надо
Отлично, то что надо!!
Спасибо большое, буду разбираться и адаптировать под себя

Добавлено через 1 час 32 минуты
Еще бы понять как это все работает
0
 Аватар для anton-sf
128 / 64 / 14
Регистрация: 29.03.2015
Сообщений: 265
18.11.2021, 15:29
Цитата Сообщение от Авдей Посмотреть сообщение
Еще бы понять как это все работает
Добавил комментарии, как смог
Вложения
Тип файла: xls Пример новый.xls (96.5 Кб, 10 просмотров)
1
10 / 9 / 1
Регистрация: 12.06.2014
Сообщений: 259
19.11.2021, 16:41  [ТС]
Цитата Сообщение от anton-sf Посмотреть сообщение
Добавил комментарии, как смог
Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.11.2021, 16:41
Помогаю со студенческими работами здесь

Как можно разбить на группы кучу переменных?
пишу прогу которая высчитывает разную статистику и в ней переменных штук 30.. например int iOrdersLoss int iOrdersProfit int...

Разбить файл на n частей записать в n файлов
Разбить файл на n частей записать в n файлов. Например, файл весит 300 кб его разбить на 3 части и записать в 3 файла по 100 кб. Заранее...

Разбить файл с кодом на несколько файлов
Становится немного неудобно когда файл с кодом вырастает до определенных размеров. Появилась идея часть кода скинуть в другой файл. На с++...

Разбить файл слияния на несколько файлов
Добрый! Нужен макрос, который позволит файл слияния в Word разбить на отдельные файлы, количество которых будут определяться количеством...

Разбить текстовый файл на несколько файлов
Как разбить исходный текстовый файл на несколько файлов при заданом условии Пример входного файла... sobitia.txt 25-12-2009,11,512...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru