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

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

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

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

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

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

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