Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Макрос для разделения большого файла на много маленьких - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос для разделения большого файла на много маленьких (Формулы/Formulas)
Макрос для разделения большого файла на много маленьких
JuliaPl Дата: Четверг, 06.11.2014, 22:58 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добрый день!
Помогите, пожалуйста, написать макрос в Exsel 2010. Имеется огромный файл с данными по поставщикам. Кол-во строк в файле доходит до сотен тысяч. Пример файла прилагаю, строк и столбцов в сотни раз больше, чем в примере.
В первом столбце содержится номер поставщика. Это ключевой показатель. Поставщиков около 400. Количество строк с данными по каждому поставщику разное. Необходимо написать макрос, который будет резать данный файл по номеру поставщика и создавать новые файлы, в каждом из которых будут оставаться данные только по одному поставщику. Имя каждого нового файла должно содержать номер конкретного поставщика, к которому относятся данные. Т.е., например, первый вновь созданный файл должен называться 1021184_ЗАО "ОЛИМП И К" и в нем должны быть только строчки с данными Олимпа, второй будет 1021317_ООО "Торговая Компания "Элис" и внутри строки по Элису и т.д.
Заранее спасибо за помощь!
К сообщению приложен файл: 6719087.rar (26.7 Kb)


Сообщение отредактировал JuliaPl - Четверг, 06.11.2014, 22:59
 
Ответить
СообщениеДобрый день!
Помогите, пожалуйста, написать макрос в Exsel 2010. Имеется огромный файл с данными по поставщикам. Кол-во строк в файле доходит до сотен тысяч. Пример файла прилагаю, строк и столбцов в сотни раз больше, чем в примере.
В первом столбце содержится номер поставщика. Это ключевой показатель. Поставщиков около 400. Количество строк с данными по каждому поставщику разное. Необходимо написать макрос, который будет резать данный файл по номеру поставщика и создавать новые файлы, в каждом из которых будут оставаться данные только по одному поставщику. Имя каждого нового файла должно содержать номер конкретного поставщика, к которому относятся данные. Т.е., например, первый вновь созданный файл должен называться 1021184_ЗАО "ОЛИМП И К" и в нем должны быть только строчки с данными Олимпа, второй будет 1021317_ООО "Торговая Компания "Элис" и внутри строки по Элису и т.д.
Заранее спасибо за помощь!

Автор - JuliaPl
Дата добавления - 06.11.2014 в 22:58
sorcerer Дата: Пятница, 07.11.2014, 10:13 | Сообщение № 2
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 6 ±
Замечаний: 0% ±

Excel 2010
JuliaPl, Помочь написать?
Или написать все за вас?
Или подсказать в каком направлении начать?
 
Ответить
СообщениеJuliaPl, Помочь написать?
Или написать все за вас?
Или подсказать в каком направлении начать?

Автор - sorcerer
Дата добавления - 07.11.2014 в 10:13
JuliaPl Дата: Пятница, 07.11.2014, 10:19 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Помочь написать :) Я писала макросы, но давно и самые простые. Или можно написать сам макрос и комментарии к нему :)) Я бы хотела понимать каждую строчку макроса, чтобы иметь возможность его изменить, т.к. предполагаю, что это понадобится.


Юлия
 
Ответить
СообщениеПомочь написать :) Я писала макросы, но давно и самые простые. Или можно написать сам макрос и комментарии к нему :)) Я бы хотела понимать каждую строчку макроса, чтобы иметь возможность его изменить, т.к. предполагаю, что это понадобится.

Автор - JuliaPl
Дата добавления - 07.11.2014 в 10:19
SkyPro Дата: Пятница, 07.11.2014, 13:05 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
[vba]
Код
Sub Example2()
off_ ' Отключаем пересчет формул, диалоги и обновление экрана
     Dim rngAdr$
     Dim ADO As New ADO
     Dim tResArr
     Dim i&, v&
          
     rngAdr = Range("A4:B" & [A1000000].End(xlUp).Row).Address(0, 0, 1, 0) ' определяем в переменную адрес диапазона
     ADO.DataSource = ThisWorkbook.Path & "\" & ThisWorkbook.Name ' Указываем источник
     ADO.Query ("SELECT DISTINCT F1, F2 FROM [СМ$" & rngAdr & "] WHERE F1 <> '' AND F2 <> ''") ' Собственно, сам запрос SQL к листу книги, который выбирает уникальные пары значений первых двух столбцов
     tResArr = ADO.ToArray() ' Результат выводим в массив
      
     For i = 1 To UBound(tResArr) 'проходим по массиву
         ' Следующий запрос берет уникальные пары значений и выбирает все записи с листа, соответствующие этим парам
         ADO.Query ("SELECT * FROM [СМ$" & rngAdr & "] WHERE F1 = '" & tResArr(i, 1) & "' AND F2 = '" & tResArr(i, 2) & "';") '
          
         Sheets.Add 'Добавляем новый лист
         With ActiveSheet
             .Name = tResArr(i, 1) ' обзываем его первым значением из пары
             .[a1].CopyFromRecordset ADO.Recordset ' выводим результат запроса на новый лист
             .Move 'перемещаем его в новую книгу
             ' Обзываем файл вторым значением из пары, предварительно заменив запрещенные символы и сохраняем его в папку с исходным файлом
             ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & tResArr(i, 1) & "_" & replPunct(tResArr(i, 2))
             ActiveWorkbook.Close False 'закрываем свежеиспеченную книгу
         End With
     Next
     
on_ 'Включаем пересчет формул, диалоги и обновление экрана
MsgBox "Все готово!", vbOKOnly
End Sub

Sub off_()
     With Application
         .DisplayAlerts = False
         .ScreenUpdating = False
         .Calculation = xlCalculationManual
     End With
End Sub

Sub on_()
     With Application
         .DisplayAlerts = True
         .ScreenUpdating = True
         .Calculation = xlCalculationAutomatic
     End With
End Sub

Function replPunct$(ByVal t$)
     t = Replace(t, """", "")
     t = Replace(t, "~*", "")
     t = Replace(t, "\", "")
     t = Replace(t, "/", "")
     t = Replace(t, ":", "")
     t = Replace(t, "<", "")
     t = Replace(t, ">", "")
     t = Replace(t, "~?", "")
     replPunct = t
End Function
[/vba]

Использовал класс ADO, написанный Nerv
К сообщению приложен файл: 7394433.xlsb (28.7 Kb)


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Пятница, 07.11.2014, 13:24
 
Ответить
Сообщение[vba]
Код
Sub Example2()
off_ ' Отключаем пересчет формул, диалоги и обновление экрана
     Dim rngAdr$
     Dim ADO As New ADO
     Dim tResArr
     Dim i&, v&
          
     rngAdr = Range("A4:B" & [A1000000].End(xlUp).Row).Address(0, 0, 1, 0) ' определяем в переменную адрес диапазона
     ADO.DataSource = ThisWorkbook.Path & "\" & ThisWorkbook.Name ' Указываем источник
     ADO.Query ("SELECT DISTINCT F1, F2 FROM [СМ$" & rngAdr & "] WHERE F1 <> '' AND F2 <> ''") ' Собственно, сам запрос SQL к листу книги, который выбирает уникальные пары значений первых двух столбцов
     tResArr = ADO.ToArray() ' Результат выводим в массив
      
     For i = 1 To UBound(tResArr) 'проходим по массиву
         ' Следующий запрос берет уникальные пары значений и выбирает все записи с листа, соответствующие этим парам
         ADO.Query ("SELECT * FROM [СМ$" & rngAdr & "] WHERE F1 = '" & tResArr(i, 1) & "' AND F2 = '" & tResArr(i, 2) & "';") '
          
         Sheets.Add 'Добавляем новый лист
         With ActiveSheet
             .Name = tResArr(i, 1) ' обзываем его первым значением из пары
             .[a1].CopyFromRecordset ADO.Recordset ' выводим результат запроса на новый лист
             .Move 'перемещаем его в новую книгу
             ' Обзываем файл вторым значением из пары, предварительно заменив запрещенные символы и сохраняем его в папку с исходным файлом
             ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & tResArr(i, 1) & "_" & replPunct(tResArr(i, 2))
             ActiveWorkbook.Close False 'закрываем свежеиспеченную книгу
         End With
     Next
     
on_ 'Включаем пересчет формул, диалоги и обновление экрана
MsgBox "Все готово!", vbOKOnly
End Sub

Sub off_()
     With Application
         .DisplayAlerts = False
         .ScreenUpdating = False
         .Calculation = xlCalculationManual
     End With
End Sub

Sub on_()
     With Application
         .DisplayAlerts = True
         .ScreenUpdating = True
         .Calculation = xlCalculationAutomatic
     End With
End Sub

Function replPunct$(ByVal t$)
     t = Replace(t, """", "")
     t = Replace(t, "~*", "")
     t = Replace(t, "\", "")
     t = Replace(t, "/", "")
     t = Replace(t, ":", "")
     t = Replace(t, "<", "")
     t = Replace(t, ">", "")
     t = Replace(t, "~?", "")
     replPunct = t
End Function
[/vba]

Использовал класс ADO, написанный Nerv

Автор - SkyPro
Дата добавления - 07.11.2014 в 13:05
JuliaPl Дата: Пятница, 07.11.2014, 14:54 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
SkyPro, спасибо! Буду разбираться :) А в вашем приложенном файле содержится этот макрос? У меня пишет при открытии, что макросы Visual Basic для приложений VBA повреждены и были удалены.


Юлия
 
Ответить
СообщениеSkyPro, спасибо! Буду разбираться :) А в вашем приложенном файле содержится этот макрос? У меня пишет при открытии, что макросы Visual Basic для приложений VBA повреждены и были удалены.

Автор - JuliaPl
Дата добавления - 07.11.2014 в 14:54
SkyPro Дата: Пятница, 07.11.2014, 17:17 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Содержится. Возможно у вас файл "ломает" антивирус, либо стоит английский системным языком.
Если все вышеперечисленное не верно, то добавьте макрос сами в файл и возьмите модуль класа из темы по ссылке.


skypro1111@gmail.com
 
Ответить
СообщениеСодержится. Возможно у вас файл "ломает" антивирус, либо стоит английский системным языком.
Если все вышеперечисленное не верно, то добавьте макрос сами в файл и возьмите модуль класа из темы по ссылке.

Автор - SkyPro
Дата добавления - 07.11.2014 в 17:17
JuliaPl Дата: Понедельник, 24.11.2014, 11:52 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добрый день!
Уважаемый SkyPro, я только сейчас добралась до этого макроса. Начала разбираться. Пока мало понятно....
Не могли бы вы пояснить, что такое Dim ADO As New ADO в самом начале макроса? Программа выдает в этом месте ошибку :((


Юлия
 
Ответить
СообщениеДобрый день!
Уважаемый SkyPro, я только сейчас добралась до этого макроса. Начала разбираться. Пока мало понятно....
Не могли бы вы пояснить, что такое Dim ADO As New ADO в самом начале макроса? Программа выдает в этом месте ошибку :((

Автор - JuliaPl
Дата добавления - 24.11.2014 в 11:52
JuliaPl Дата: Понедельник, 24.11.2014, 12:23 | Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
В маленьком файле работает, который вы вложили. А в моем большом выдает ошибку на строке Dim ADO As New ADO :(((( Что делать?


Юлия
 
Ответить
СообщениеВ маленьком файле работает, который вы вложили. А в моем большом выдает ошибку на строке Dim ADO As New ADO :(((( Что делать?

Автор - JuliaPl
Дата добавления - 24.11.2014 в 12:23
Karataev Дата: Четверг, 27.11.2014, 10:58 | Сообщение № 9
Группа: Проверенные
Ранг: Старожил
Сообщений: 1334
Репутация: 533 ±
Замечаний: 0% ±

Excel
нужно подключить библиотеку .это делается так
перейдите в VBE ,затем Tools - References- Microsoft ActiveX Data Object 6.1 Library
 
Ответить
Сообщениенужно подключить библиотеку .это делается так
перейдите в VBE ,затем Tools - References- Microsoft ActiveX Data Object 6.1 Library

Автор - Karataev
Дата добавления - 27.11.2014 в 10:58
SkyPro Дата: Четверг, 27.11.2014, 11:40 | Сообщение № 10
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Karataev, в разрезе этого конкретного решения ваш способ не поможет. Нужно импортировать модуль класса ADO, о чем я сообщил ранее.


skypro1111@gmail.com
 
Ответить
СообщениеKarataev, в разрезе этого конкретного решения ваш способ не поможет. Нужно импортировать модуль класса ADO, о чем я сообщил ранее.

Автор - SkyPro
Дата добавления - 27.11.2014 в 11:40
Karataev Дата: Четверг, 27.11.2014, 11:44 | Сообщение № 11
Группа: Проверенные
Ранг: Старожил
Сообщений: 1334
Репутация: 533 ±
Замечаний: 0% ±

Excel
я перепутал библиотеку Microsoft ActiveX Data Object 6.1 Library с классом,который создал программист.
 
Ответить
Сообщениея перепутал библиотеку Microsoft ActiveX Data Object 6.1 Library с классом,который создал программист.

Автор - Karataev
Дата добавления - 27.11.2014 в 11:44
Krechet1987 Дата: Четверг, 23.06.2016, 13:53 | Сообщение № 12
Группа: Пользователи
Ранг: Прохожий
Сообщений: 1
Репутация: 0 ±
Замечаний: 0% ±

.
Добрый день! Не могу разобраться в коде написанном SkyPro.
Как выводить результат запроса но новый лист с учетом форматирования ячеек из исходной таблицы?
Как сделать, чтобы книги сохранялись не в текущую папку, а в которую я ему укажу? Т.е перед выполнением макроса он спрашивает куда сохранять файлы и автоматом по заданной маске наименования сохраняет.


Сообщение отредактировал Krechet1987 - Четверг, 23.06.2016, 17:27
 
Ответить
СообщениеДобрый день! Не могу разобраться в коде написанном SkyPro.
Как выводить результат запроса но новый лист с учетом форматирования ячеек из исходной таблицы?
Как сделать, чтобы книги сохранялись не в текущую папку, а в которую я ему укажу? Т.е перед выполнением макроса он спрашивает куда сохранять файлы и автоматом по заданной маске наименования сохраняет.

Автор - Krechet1987
Дата добавления - 23.06.2016 в 13:53
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос для разделения большого файла на много маленьких (Формулы/Formulas)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!