Вход | Регистрация



Разрезать большой Excel-файл с кучей типовых ТОРГ12 по одной

Разрезать большой Excel-файл с кучей типовых ТОРГ12 по одной
Я
   Злопчинский
 
18.06.18 - 16:19
Есть боольшущуий файл Эксель, в котором подряд "напечатаны" типовые ТОРГ12 без всяких разделеителей, все на одном листе.

Надо - нарезать каждую торг12 в отдельный файл, типа
1. Стать на верхнюю левую ячейку файла: Строка-Старт
2. Вниз на 1 строку.
2. Найти дальше (со второй строки) "Унифицир", стать на предыдущую строку: Строка-финиш
3. Вырезать со строк-старт до строки-финиш в отдельный файл, имя файла взять из ячейки СтрокаСтарт+19, Колонка=13 (номердок в торг12).
..повторитть пока файл не кончится.

допоможите, кому не в лом макросом, полагаю что достаточно просто, но не владею... а прим еры все мутные - режут по строкам..
 
 
   anatoly
 
1 - 18.06.18 - 16:22
а почему бы не загрузить в ТабДок и уже в нем порезать - и сохранить куда и как надобно?

или... тебе же это наверное еще и для 7.7 надо?? ))
   trdm
 
2 - 18.06.18 - 16:26
Обработай 1Сом. Делов то, пробежаться по экеловскому листу и настрогать новых.
   trdm
 
3 - 18.06.18 - 16:28
Имеется ввитду сам файл не трогать, а просто поскидывать в другие файлы.
   trdm
 
4 - 18.06.18 - 16:33
Чего не хватает?
   Злопчинский
 
5 - 18.06.18 - 16:33
(2) Если ты мне дашь 1Сные команды обрабьотки ЭКСЕЛЬНЫХ файлов - то не вопрос.
мне разницы нет - я ВБА не владею - поэтом что в 1Се, что в макросе - один хрен.
Владел бы - давно бы сделал...
   Злопчинский
 
6 - 18.06.18 - 16:35
Sub Макрос1()
'
' Макрос1 Макрос
' Макрос записан 18.06.2018 (progadmin)
'

'
    Range("A2").Select
    Cells.Find(What:="Унифи", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False).Activate
    Range("AN55").Select  //ВОТ ЗДЕСЬ КАК_ТО ЗАДАТЬ диапазон ДО НАЙДЕННОЙ СТРОКИ

    Range(Selection, Cells(1)).Select
    Selection.Cut
    Workbooks.Add
    ActiveSheet.Paste
    ActiveWorkbook.SaveAs Filename:="ЗдесьПуть"+ТУТСЧЕТЧИКНАКРАЙНИЙСЛУЧАЙ+".xls", _
        FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
        ReadOnlyRecommended:=False, CreateBackup:=False
    ActiveWindow.Close
    Selection.Delete Shift:=xlUp
End Sub
   Злопчинский
 
7 - 18.06.18 - 16:59
Ап
   trdm
 
8 - 18.06.18 - 17:01
ну типа:
//==============================================================================

// ЗаполнитьЯчейкуЛиста( псЛист, псСтрока, псКолонка, псЯчейка ) © trdm 2018-04-30 11:15
Процедура ЗаполнитьЯчейкуЛиста( псЛист, псСтрока, псКолонка, псЗначение, псФормат = 0 )
    вЯчейка = псЛист.Cells(псСтрока, псКолонка);
    вЯчейка.value = псЗначение;
    вЯчейка.Borders.LineStyle = 1;
    Попытка
        вЯчейка.HorizontalAlignment=-4130;        //установить по ширине    

        вЯчейка.VerticalAlignment =-4108;        //xlHAlignCenter

    Исключение
    КонецПопытки;
    Попытка
        Если псФормат <> 0 Тогда
            вЯчейка.NumberFormat = псФормат;
            Если псФормат = "###0.00" Тогда

                // Надо прижать вправо.

                вЯчейка.HorizontalAlignment=-4152;        //xlRight

            КонецЕсли; 
        КонецЕсли;         
    Исключение
    КонецПопытки;
КонецПроцедуры// ЗаполнитьЯчейкуЛиста()


//==============================================================================

Функция вс( псЗнач )    Возврат СокрЛП(""+псЗнач); КонецФункции// вс()



//==============================================================================

// ЗаполнитьЛистЕксила( псЛист, псВариант = 0) © trdm 2018-04-30 11:03
Процедура ЗаполнитьЛистЕксила( псЛист, псВариант = 0)
    Если псВариант = 1 Тогда// Пропажи...

        псЛист.Columns(2).ColumnWidth = 45;
        псЛист.Columns(4).ColumnWidth = 80;
        ЗаполнитьЯчейкуЛиста(псЛист, 1, 1, "Дата");
        ЗаполнитьЯчейкуЛиста(псЛист, 1, 2, "Название клиента");
        ЗаполнитьЯчейкуЛиста(псЛист, 1, 3, "Код клиента");
        ЗаполнитьЯчейкуЛиста(псЛист, 1, 4, "Название продукта");
        ЗаполнитьЯчейкуЛиста(псЛист, 1, 5, "Код продукта");
        ЗаполнитьЯчейкуЛиста(псЛист, 1, 6, "Количество проданных и возвращенных единиц");
        ЗаполнитьЯчейкуЛиста(псЛист, 1, 7, "Сумма продажи без НДС");
        ЗаполнитьЯчейкуЛиста(псЛист, 1, 8, "Сумма продажи с НДС");
        
        вСохрСтрока = "";        
        вВсегоСтрок = гТаблаОборотов.КоличествоСтрок();
        
        гТаблаОборотов.ВыбратьСтроки();
        Пока гТаблаОборотов.ПолучитьСтроку() = 1 Цикл
            СЦ = гТаблаОборотов.НомерСтроки;
            глБегущийКурсор(вСохрСтрока,"Обр.(6): "+глПрогрессор(вВсегоСтрок, СЦ)+" ЗаполнитьЛистЕксила"+псВариант);
            вДата        = гТаблаОборотов.день;
            вКлиент        = гТаблаОборотов.Покупатель;
            вТовар        = гТаблаОборотов.Товар;
            вКолво        = гТаблаОборотов.КоличествоСумма;
            вСуммаБез    = гТаблаОборотов.СтоимостьСумма - гТаблаОборотов.НДССумма;
            вСуммаС        = гТаблаОборотов.СтоимостьСумма;
            вНомСтроки = гТаблаОборотов.НомерСтроки + 1;
            ЗаполнитьЯчейкуЛиста(псЛист, вНомСтроки, 1, вс(вДата));
            ЗаполнитьЯчейкуЛиста(псЛист, вНомСтроки, 2, вс(вКлиент.наименование));
            ЗаполнитьЯчейкуЛиста(псЛист, вНомСтроки, 3, вс(вКлиент.Код));//"Код клиента"

            ЗаполнитьЯчейкуЛиста(псЛист, вНомСтроки, 4, вс(вТовар.наименование));// "Название продукта"

            ЗаполнитьЯчейкуЛиста(псЛист, вНомСтроки, 5, вс(вТовар.Код));// "Код продукта"

            ЗаполнитьЯчейкуЛиста(псЛист, вНомСтроки, 6, ВС(вКолво),"###0.00");// "Количество проданных и возвращенных единиц"

            ЗаполнитьЯчейкуЛиста(псЛист, вНомСтроки, 7, вс(вСуммаБез),"###0.00");//   "Сумма продажи без НДС"

            ЗаполнитьЯчейкуЛиста(псЛист, вНомСтроки, 8, вс(вСуммаС),"###0.00" );// "Сумма продажи с НДС"

        КонецЦикла;
    
    ИначеЕсли псВариант = 2 Тогда
        псЛист.Columns(2).ColumnWidth = 80;
        ЗаполнитьЯчейкуЛиста(псЛист, 1, 1, "Дата остатка");
        ЗаполнитьЯчейкуЛиста(псЛист, 1, 2, "Название продукта");
        ЗаполнитьЯчейкуЛиста(псЛист, 1, 3, "Код продукта");
        ЗаполнитьЯчейкуЛиста(псЛист, 1, 4, "Остаток, шт");
        
        вВсегоСтрок = гТаблаОстатков.КоличествоСтрок();
        
        гТаблаОстатков.ВыбратьСтроки();
        Пока гТаблаОстатков.ПолучитьСтроку() = 1 Цикл
            СЦ = гТаблаОстатков.НомерСтроки;
            глБегущийКурсор(вСохрСтрока,"Обр.(7): "+глПрогрессор(вВсегоСтрок, СЦ)+" ЗаполнитьЛистЕксила-"+псВариант);
            вДата        = гТаблаОстатков.День;
            вТовар        = гТаблаОстатков.Товар;
            вОстаток    = гТаблаОстатков.КонОстаток;
            вНомСтроки    = гТаблаОстатков.НомерСтроки + 1;
            
            ЗаполнитьЯчейкуЛиста(псЛист, вНомСтроки, 1, вс(вДата));
            ЗаполнитьЯчейкуЛиста(псЛист, вНомСтроки, 2, вс(вТовар.Наименование)  )// "Название продукта"

            ЗаполнитьЯчейкуЛиста(псЛист, вНомСтроки, 3, вс(вТовар.Код));// "Код продукта"

            ЗаполнитьЯчейкуЛиста(псЛист, вНомСтроки, 4, вс(вОстаток), "###0.00");// "Остаток, шт"

        КонецЦикла;
        
    КонецЕсли; 
    
КонецПроцедуры// ЗаполнитьЛистЕксила()


//==============================================================================

// СформироватьВыгрузкуОтчетов() © trdm 2018-04-29 16:49
Функция СформироватьВыгрузкуОтчетов()
    ЗначВозврата = 1;
    Если флНеФормироватьExcel = 1 Тогда
        Возврат ЗначВозврата;
    КонецЕсли; 
    вЕксил = "";
    Попытка        вЕксил = СоздатьОбъект("Excel.Application");
    Исключение
        вЕксил = "";
        вСтрокаПлохо = "Ошибка при попытке создания 'Excel.Application'";
        глСообщитьОбОшибке(вСтрокаПлохо);
        Возврат 0;
    КонецПопытки;
    вКниг = вЕксил.Workbooks.Count;// если вКниг = 0, значит Excel не запущен и можно будет скомандовать ему выход.    

    
    вИмяФайла = вернутьКаталогВыгрузкиВыбранный() + "otchet.xls";
    Если ФС.СуществуетФайл(вИмяФайла) = 1 Тогда
        ФС.УдалитьФайл(вИмяФайла);
        Если ФС.СуществуетФайл(вИмяФайла) = 1 Тогда
            вСтрокаПлохо = "Ошибка при удалении файла: "+вИмяФайла;
            глСообщитьОбОшибке(вСтрокаПлохо);
            Возврат 0;
        КонецЕсли; 
    КонецЕсли;  
    вScreenUpdating_олд = вЕксил.ScreenUpdating;
    //вЕксил.ScreenUpdating = 0;

    вЕксил.DisplayAlerts=0;
    Попытка
        вЕксил.Calculation = -4135;        
    Исключение
    КонецПопытки;
    
    вРабКнига = вЕксил.Workbooks.Add();
    вРабКнига.Sheets(1).name = "delivery";
    вЛист1 = вРабКнига.Sheets(1);
    ЗаполнитьЛистЕксила(вЛист1,1);
    
    вРабКнига.Sheets(2).name = "stocks";
    вЛист2 = вРабКнига.Sheets(2);
    ЗаполнитьЛистЕксила(вЛист2,2);
    
    //вЕксил.ScreenUpdating = вScreenUpdating_олд;    

    Попытка
        вРабКнига.SaveAs(вИмяФайла,-4143);
        вЕксил.DisplayAlerts=1;
    Исключение
        вСтрокаПлохо = "Ошибка при записи файла: "+вИмяФайла + " [20180429-1702]";
        глСообщитьОбОшибке(вСтрокаПлохо);
        Возврат 0;
    КонецПопытки;
    гСписокФайлов.ДобавитьЗначение(вИмяФайла,"xls");
    вРабКнига.Close();
    Если вКниг = 0 Тогда
        вЕксил.Quit();
    КонецЕсли; 
    Возврат ЗначВозврата;
КонецФункции// СформироватьВыгрузкуОтчетов()

   Garykom
 
9 - 18.06.18 - 17:15
(5) В 8-ке эти команды встроены прикинь!
   Злопчинский
 
10 - 18.06.18 - 17:21
(9) (8) не помогло. нарезки не вижу. разбираться мутно.
в (6) - два оператора поправить, блин...
 
 Рекламное место пустует
   trdm
 
11 - 18.06.18 - 18:11
(10) у тебя там нарушение технологии. не надо     Selection.Cut
нельзя трогать исходные данные. vba не моя стихия
   Djelf
 
12 - 18.06.18 - 18:16
(0) А почему не Йокселем?
   VS-1976
 
13 - 18.06.18 - 18:20
(6) Это нужно выкинуть :)
   VS-1976
 
14 - 18.06.18 - 20:03
(0) Сколько платит студент за решение? :)
   Злопчинский
 
15 - 18.06.18 - 20:14
(11) да пофиг исходные данные, файл в бэкапе есть
   Злопчинский
 
16 - 18.06.18 - 20:15
(14) тарелка супа. 500.
макрос в экселе.
   Злопчинский
 
17 - 18.06.18 - 20:47
(14) Ни - и что?
   VS-1976
 
18 - 18.06.18 - 21:29
(17) Давай свой файл, для тестов выложи куда нибудь сделаю
   Сияющий в темноте
 
19 - 18.06.18 - 22:23
делим задачу на две,поиск началп нскладной и копирование часли листа в другой со всем форматированием
   Злопчинский
 
20 - 18.06.18 - 22:38
(19) мне не нужно в другой лист. мне в отдельный файл.
   Злопчинский
 
21 - 18.06.18 - 22:39
(18) http://transfiles.ru/3fwhr
хочется поиметь три отдельных файлика (допустим в той же папке что и исходный файл), имена файликов - из НомерДок
   VS-1976
 
22 - 18.06.18 - 22:41
(21) Ок. Сейчас накидаю
   Tateossian
 
23 - 18.06.18 - 22:43
(0) Сохранить в xlsx, открыть как xml и прогнать через xslt.
   Злопчинский
 
24 - 18.06.18 - 23:12
(23) я даже такого умного слова как xslt не знаю...
   tesseract
 
25 - 18.06.18 - 23:16
(24) Ок тогда 2к.
   Злопчинский
 
26 - 18.06.18 - 23:26
(25) фиг вам, я уже переписал загрузку из одного большого файла... дорога ложка к обеду...
(соглашение с VS-1976 14-18 остается в силе)
   tesseract
 
27 - 18.06.18 - 23:28
(26) Вот как Бабло производительность повышает.
   VS-1976
 
28 - 18.06.18 - 23:41
(26) Куда скинуть результат?
   VS-1976
 
29 - 18.06.18 - 23:45
(28) Отправил на почту посмотри
   VS-1976
 
30 - 18.06.18 - 23:52
Забыл сохранение файла. Сейчас дорисую
   Злопчинский
 
31 - 18.06.18 - 23:56
Ага, и не открывать их - а то от тысячи открытых файликов\окошек - я думаю эксель сдохнет
   Злопчинский
 
32 - 18.06.18 - 23:56
(30) сохранение под НомерДок, ок?
   VS-1976
 
33 - 19.06.18 - 00:23
Все сделал. Каждая книга после сохранения закрывается. Лови в почте
 
 
   Злопчинский
 
34 - 19.06.18 - 01:30
Все конечно зашибись... Скрипт вроде как отработал... Но сервак после него лег... На тулбаре и на рабочем столе появилось кучу диалоговых окон\панелек свернутых от кучи программ которые висят на серваке, в т.ч. и которые в трее. Что-то не так с ресурсами окон. Видимо, моргание экселя - стопитьсот раз при создании\сохранении - привело к исчерпанию каки-то там виндявых ресурсов. так что сервак в ауте, работу забрать не могу, полная жпс.. ;-)
   Злопчинский
 
35 - 19.06.18 - 01:47
аааа, хрен вам а не побороть Сергея Михайловича... на сервак не достучаться по GUI, по RDP не коннектится, но залез с другого сервака через расшареную папку... работу стянул, сервак админ перегрузит... настучит по башке, конечно ;-)

вот и урок заодно - нефиг экспериментировать...
а вба - вот вам и вба - макрос 30 строк, а гуй умер...
   Tateossian
 
36 - 19.06.18 - 02:07
(35) Скинь xlsx, чуть позже сделаю тебе через xslt.
   Tateossian
 
37 - 19.06.18 - 02:08
Можно текстовое содержимое, а не как файл. Только на отдельном листе напиши как разделять файло.
   Злопчинский
 
38 - 19.06.18 - 02:15
(36) тестовый файлик можно забрать в (21)
(в оригинальном файле под 50 тыс строк, под 800 отдельных тОРГ12)
   Tateossian
 
39 - 19.06.18 - 02:16
(38) Пофих, у меня i7 заряженный восьмого поколения:)
   Злопчинский
 
40 - 19.06.18 - 02:16
Админ бдит (хороший у меня админ!), сервак в норме.
   Злопчинский
 
41 - 19.06.18 - 02:17
(39) ну и фигли.. быстродействие оно конечно хорошо, но скрипт положил гуй... ;-) может и твоя приблуда аналогично...
   Tateossian
 
42 - 19.06.18 - 02:35
(41) Сделай файл, пожалуйста, где будет два торга. Или больше. Я разделители не вижу.
   Злопчинский
 
43 - 19.06.18 - 03:49
(42) смотри в (21) - это живой файл.
Никаких спецразделителей нет.
очередная ТОРГ12 начинается с шапки-надписи "Унифицированная форма"
   craxx
 
44 - 19.06.18 - 04:00
(0)Йокселем запросто
   Злопчинский
 
45 - 19.06.18 - 05:12
(44) запросто не запросто, а пока только более-менее рабочий макрос (после которого сервак перегружать надо) и куча советов йокселями всякими... было бы время - я бы не спрашивал.. ;-)

вообщем, пока тут пилили я выпилил чохом обработку большого файла... но разделение все равно надо... пусть будет...
   Вася Теркин
 
46 - 19.06.18 - 05:47
(10) "разбираться мутно." Ну ты и наглец...
   VS-1976
 
47 - 19.06.18 - 06:55
В скрипте отключается переоесовка экрана для быстродействия. Скрипт работает при этом.
   Злопчинский
 
48 - 27.06.18 - 22:56
вознаграждение остается за мной, то есть выплачу как только дома появлюсь.

решение по коду есть,
но есть вариант утечки ресурсов при исполнении скрипта, что ведет к неработоспособности гуя
   Кирпич
 
49 - 28.06.18 - 09:06
(45) можно exe запилить, который, никого не напрягая, будет за 5 секунд делать эту работу и без екселя
 
 Рекламное место пустует
   spectre1978
 
50 - 28.06.18 - 09:16
(48) может, там просто книгу очередную сохранённую не закрывают после сохранения? 800 открытых книг Эксель - это да,сурово. Не каждое железо выдержит
   bolder
 
51 - 28.06.18 - 09:25
(50) В (33) пишет что закрывает.
(49) Много что можно,если не все.
   VS-1976
 
52 - 28.06.18 - 09:26
(50) Я написал что сохраняется без вопросов замещая книгу с таким же наименованием. Скорее всего в конце не нужно включать диалоги ( чтобы не вывалил массу сообщений ). А так GUI не перерисовываются для ускорения работы, и если перерисовывать экран будет выглядеть как буд-то excel завис. Но на самом деле работает скрипт, просто GUI-вывод подавлен. перерисовка будет только по окончанию работы.
   spectre1978
 
53 - 28.06.18 - 18:15
(49) без екселя не факт, что удастся нормально перенести форматирование.
(51) по факту там могли ошибки не обработать. И в результате оно намусорило до падения сервака. Вообще такие вещи без проверки запускать на серваках - это экстрим, я бы сказал :)
   Сияющий в темноте
 
54 - 29.06.18 - 11:08
На момегт закрытия файла желательнл включатт гуи,так как при закрытии должен обновиться список файлов,а пока это не сделано,файл может оставаться в памяти даже если закрыт


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует