[/vba] есть модифицированный конвертер использовался раньше
для перевода этих же txt реестров СБРФ с разбиением в dbf, но после доработки софта (софт сторонний как и конвертер) теперь загрузка осуществляется не dbf а txt, т.е. готовый как приходит с СБРФ но т.к. в БД разбита по участкам, то импорт реетра без разбиения по участкам не возможен.
Прошу помочь исправить конвертер,
хотя склоняюсь проще написать новый, но по его работе хотя бы можно понять что мне нужно на выходе.
Приветствуется любая помощь, лучше с примерами и кометами, т.к. в VBA я ЧАЙНИК!
hi ALL Есть реестр СБ РФ в формате txt, нужно разбить файл txt на несколько (по участкам) в зависимости от лицевого счета. т.е.[vba]
[/vba] есть модифицированный конвертер использовался раньше
для перевода этих же txt реестров СБРФ с разбиением в dbf, но после доработки софта (софт сторонний как и конвертер) теперь загрузка осуществляется не dbf а txt, т.е. готовый как приходит с СБРФ но т.к. в БД разбита по участкам, то импорт реетра без разбиения по участкам не возможен.
Прошу помочь исправить конвертер,
хотя склоняюсь проще написать новый, но по его работе хотя бы можно понять что мне нужно на выходе.
Приветствуется любая помощь, лучше с примерами и кометами, т.к. в VBA я ЧАЙНИК!casper200
hi Hugo, вообще то Матрена уже отреагировала, могу выложить результат... требовалось следующее из одного (общего) реестра сделать несколько (т.е. отсортировать по участкам в зовисимости от л/сч. это второй столбец после кода 6700038: 20111 :) + в шапке поправить кол-во записей в реестре и сумму реестра соответственно # 397 ;Номер реестра # 15960.00 ;Сумма реестра # 0.00 ;В том числе пеня # 231.43 ;Удержанная сумма # 15960.00 ;Сумма к перечеслению # 9 ;Число записей # 670058 ;Код агента # 49 ;Номер услуги # 24/09/2012 00:00:00 ;Дата формирования реестра # 21/09/2012 08:08:31 ;Начало диапазона дат документов, входящих в реестр # 21/09/2012 17:35:34 ;Конец диапазона дат документов, входящих в реестр #21/09/2012:332720: 6700038:20111:029:01:21/09/2012:09.2012:11:0:0:БЕЗ АДРЕСА,БЕЗ АДРЕСА,БЕЗ АДРЕСА,БЕЗ АДРЕСА:10941:1110136;3000.00;21/09/2012;5408614
hi Hugo, вообще то Матрена уже отреагировала, могу выложить результат... требовалось следующее из одного (общего) реестра сделать несколько (т.е. отсортировать по участкам в зовисимости от л/сч. это второй столбец после кода 6700038: 20111 :) + в шапке поправить кол-во записей в реестре и сумму реестра соответственно # 397 ;Номер реестра # 15960.00 ;Сумма реестра # 0.00 ;В том числе пеня # 231.43 ;Удержанная сумма # 15960.00 ;Сумма к перечеслению # 9 ;Число записей # 670058 ;Код агента # 49 ;Номер услуги # 24/09/2012 00:00:00 ;Дата формирования реестра # 21/09/2012 08:08:31 ;Начало диапазона дат документов, входящих в реестр # 21/09/2012 17:35:34 ;Конец диапазона дат документов, входящих в реестр #21/09/2012:332720: 6700038:20111:029:01:21/09/2012:09.2012:11:0:0:БЕЗ АДРЕСА,БЕЗ АДРЕСА,БЕЗ АДРЕСА,БЕЗ АДРЕСА:10941:1110136;3000.00;21/09/2012;5408614
Hi, casper200! И всё равно в деталях непонятно. То, что нужно разложить строки в 3 кучки - это понятно, и это уже делал тот код. Непонятно было с шапкой - что-то там формировалось, что из чего и что конкретно нужно - самим придумывать/анализировать нужно, кому охота гадать? Хотя вероятно какой-то Матрёне была охота Да и сейчас непонятно с шапкой - 2 суммы и количество правим, остальное нет? Но ведь там тоже что-то может измениться, например "Удержанная сумма"? Ну ладно, раз сделано - можно не отвечать. Но тот код, что был в файле - я бы полностью сделал иначе, без копирования всяких листов и сохранения их в текст. Ну теперь уж ладно - раз работает, то сочинять другой вариант думаю нерационально.
Но мысль была такая - критерии в словарь, затем перебором строк (сравниваем с словарём) формируем 3 коллекции строк, и сразу 3 массива строк шапки (ну или их можно сделать потом перебором этих коллекций). Затем на основе собранного генерим 3 файла.
Hi, casper200! И всё равно в деталях непонятно. То, что нужно разложить строки в 3 кучки - это понятно, и это уже делал тот код. Непонятно было с шапкой - что-то там формировалось, что из чего и что конкретно нужно - самим придумывать/анализировать нужно, кому охота гадать? Хотя вероятно какой-то Матрёне была охота Да и сейчас непонятно с шапкой - 2 суммы и количество правим, остальное нет? Но ведь там тоже что-то может измениться, например "Удержанная сумма"? Ну ладно, раз сделано - можно не отвечать. Но тот код, что был в файле - я бы полностью сделал иначе, без копирования всяких листов и сохранения их в текст. Ну теперь уж ладно - раз работает, то сочинять другой вариант думаю нерационально.
Но мысль была такая - критерии в словарь, затем перебором строк (сравниваем с словарём) формируем 3 коллекции строк, и сразу 3 массива строк шапки (ну или их можно сделать потом перебором этих коллекций). Затем на основе собранного генерим 3 файла.Hugo
hi Hugo, Идея Ваша мне нравится, но как я писал выше в VBA - чайник!...
Quote (Hugo)
То, что нужно разложить строки в 3 кучки - это понятно, и это уже делал тот код.
- OK
Quote (Hugo)
Непонятно было с шапкой - что-то там формировалось, что из чего и что конкретно нужно - самим придумывать/анализировать нужно, кому охота гадать?
зачем гадать? в шапке будут меняться только ко-во строк, и сумма реестра, т.к. при экспорте сотф проверяет эти параметры. в остальном у всех реестров шапка идентична. Если общий реестр с №321 то все реестры (разбитые по участкам сколько бы их не получилось будут с № 321 и дата и абсолютно все параметры КРОМЕ)
# 15960.00 ;Сумма реестра # 15960.00 ;Сумма к перечислению # 9 ;Число записей эти параметры будут меняться, т.к. если из общего реестра для уч.1 будут выделены 3 записи на общую сумму 300 р. то эти данные в шапке реестра для 1 уч. и нужно указать # 300.00 ;Сумма реестра # 300.00 ;Сумма к перечислению # 3 ;Число записей Фсе... Я как мог конвертер переписал, т.к. при переводе в dbf там и сроки местами менялись и и поля другие были и т.д. на сколько смог разобрался строки склеил обратно, сумму считать научился, кол-во строк тоже... шапку корректно не могу сам, собрать для всех реестров формируемых.
Хотя бы накидайте скрипт формирования шапки, без описания постараюсь сам разобраться как работает... вот код Матрены, (надеюсь не обидеться, хотя разрешения не спрашивал...) Она почему то не весь массив целиком грузит (содержимое txt файла)а кусочками (разбивает на несколько столбцов)... в результате , при сохранении, получаются "съеденные" строки (МАТРЕНА СИЛЬНО ОБИДЕЛАСЬ, ЗА ТО ЧТО Я ВЫЛОЖИЛ МАКРОС И ЗА МОИ "РАЗБОРЫ" НА ФОРУМЕ ЕЕ МАКРОСА, В СВЯЗИ С ЧЕМ УБИРАЮ ЕЕ МАКРОС И ПРИНОШУ СВОИ ГЛУБОЧАЙШИЕ ИЗВИНЕНИЯ), для профи это может и пара пустяков, я не знаю как это побороть... ;(
hi Hugo, Идея Ваша мне нравится, но как я писал выше в VBA - чайник!...
Quote (Hugo)
То, что нужно разложить строки в 3 кучки - это понятно, и это уже делал тот код.
- OK
Quote (Hugo)
Непонятно было с шапкой - что-то там формировалось, что из чего и что конкретно нужно - самим придумывать/анализировать нужно, кому охота гадать?
зачем гадать? в шапке будут меняться только ко-во строк, и сумма реестра, т.к. при экспорте сотф проверяет эти параметры. в остальном у всех реестров шапка идентична. Если общий реестр с №321 то все реестры (разбитые по участкам сколько бы их не получилось будут с № 321 и дата и абсолютно все параметры КРОМЕ)
# 15960.00 ;Сумма реестра # 15960.00 ;Сумма к перечислению # 9 ;Число записей эти параметры будут меняться, т.к. если из общего реестра для уч.1 будут выделены 3 записи на общую сумму 300 р. то эти данные в шапке реестра для 1 уч. и нужно указать # 300.00 ;Сумма реестра # 300.00 ;Сумма к перечислению # 3 ;Число записей Фсе... Я как мог конвертер переписал, т.к. при переводе в dbf там и сроки местами менялись и и поля другие были и т.д. на сколько смог разобрался строки склеил обратно, сумму считать научился, кол-во строк тоже... шапку корректно не могу сам, собрать для всех реестров формируемых.
Хотя бы накидайте скрипт формирования шапки, без описания постараюсь сам разобраться как работает... вот код Матрены, (надеюсь не обидеться, хотя разрешения не спрашивал...) Она почему то не весь массив целиком грузит (содержимое txt файла)а кусочками (разбивает на несколько столбцов)... в результате , при сохранении, получаются "съеденные" строки (МАТРЕНА СИЛЬНО ОБИДЕЛАСЬ, ЗА ТО ЧТО Я ВЫЛОЖИЛ МАКРОС И ЗА МОИ "РАЗБОРЫ" НА ФОРУМЕ ЕЕ МАКРОСА, В СВЯЗИ С ЧЕМ УБИРАЮ ЕЕ МАКРОС И ПРИНОШУ СВОИ ГЛУБОЧАЙШИЕ ИЗВИНЕНИЯ), для профи это может и пара пустяков, я не знаю как это побороть... ;(casper200
Сообщение отредактировал casper200 - Среда, 07.11.2012, 11:57
Хорошо, на досуге посмотрю, если раньше не будет других ответов. Но Вы скажите, как формируется (или откуда берётся) # 231.43 ;Удержанная сумма Процент какой-то некруглый... Или всем ставить в шапку эту строку без изменений?
Ну и я так полагаю, что шапка всегда 12 строк и одного вида, т.е. всегда Сумма реестра, Сумма к перечеслению и Число записей в одних и тех же строках, нужно только заменить числа? Т.е. можно без доп.анализа брать первых 12 строк файла и в них менять 2, 5 и 6 строку? Ну и вопрос по строке 4 - её менять или нет? Ещё (не хочется изучать те коды) - что с "3-й участок"? К нему относить все строки, которые не отобрались в другие участки, или его нет вообще? Зачем тогда он упомянут в ad = Array()?
Хорошо, на досуге посмотрю, если раньше не будет других ответов. Но Вы скажите, как формируется (или откуда берётся) # 231.43 ;Удержанная сумма Процент какой-то некруглый... Или всем ставить в шапку эту строку без изменений?
Ну и я так полагаю, что шапка всегда 12 строк и одного вида, т.е. всегда Сумма реестра, Сумма к перечеслению и Число записей в одних и тех же строках, нужно только заменить числа? Т.е. можно без доп.анализа брать первых 12 строк файла и в них менять 2, 5 и 6 строку? Ну и вопрос по строке 4 - её менять или нет? Ещё (не хочется изучать те коды) - что с "3-й участок"? К нему относить все строки, которые не отобрались в другие участки, или его нет вообще? Зачем тогда он упомянут в ad = Array()?Hugo
Hugo, # 231.43 ;Удержанная сумма - это услуги банка они присутствуют не в каждом реестре и обработке не подлежат... менять ее не нужно. в остальном Все поняли правильно. по третьему участку именно все оставшиеся, т.е. не разобранные пихаем туда... (вообще то есть и диапазон, просто тот кто писал этот конвертер видимо посчитал что не целесообразно еще одно условие пихать и организовал таким образом... ) огромное спасибо за помощь.
Hugo, # 231.43 ;Удержанная сумма - это услуги банка они присутствуют не в каждом реестре и обработке не подлежат... менять ее не нужно. в остальном Все поняли правильно. по третьему участку именно все оставшиеся, т.е. не разобранные пихаем туда... (вообще то есть и диапазон, просто тот кто писал этот конвертер видимо посчитал что не целесообразно еще одно условие пихать и организовал таким образом... ) огромное спасибо за помощь.casper200
Ну вот пока так, сколько сегодня успел. Уже всё работает, но остались вопросы: 1. нужно ли генерить файлы, для которых нет строк? 2. куда собственно генерить файлы? 3. нужен ли диалог выбора файлов, или можно жёстко прописать путь? (как сейчас в коде, замените на свой) 4. в выходные файлы пишется лишний перевод строки в конце - если это критично, то можно усложнить код и это устранить.
5 строк позаимствовал, но чуть изменил Если бы прописать все номера 3-го участка - код был бы чуть короче и проще, ну да ладно Что где происходит - прописывать много, некогда, да и негде - это только сделает нечитаемым код Код писал в Экселе, но можно вероятно запустить и под Вордом, или на vbs переписать - но под Экселем думаю вполне неплохо, можно например поставить на автозапуск при открытии файла (и работает быстрее, чем как vbs, хотя если строк не миллион, то практически разницу не почувствуете).
[vba]
Code
Option Explicit
Sub RazborUcastkov() Dim nrDic As Object, ucDic As Object, fso As Object, ts As Object, outFile As Object Dim ad, arrstr, tArr, t$, tt$, i&, sep_$, el, elel
Set fso = CreateObject("Scripting.FileSystemObject")
Set nrDic = CreateObject("scripting.dictionary") nrDic.comparemode = 1 Set ucDic = CreateObject("scripting.dictionary") ucDic.comparemode = 1
sep_ = Mid(1 / 2, 2, 1)
For Each el In ad If Not ucDic.exists(el(0)) Then ucDic.Add el(0), Array(0, 0, New Collection) If IsArray(el) Then For i = 1 To UBound(el) nrDic.Item(el(i)) = el(0) Next End If Next
If Not ucDic.exists("3-й участок") Then ucDic.Add "3-й участок", Array(0, 0, New Collection)
Set ts = fso.OpenTextFile("c:\Temp\casper200\test.txt", 1) 'Подставьте свой путь к txt-файлу arrstr = Split(ts.ReadAll, vbCrLf) 'массив строк текста целиком ts.Close Set ts = Nothing
For Each el In ucDic Set outFile = fso.CreateTextFile("c:\Temp\casper200\test(" & el & ").txt") t = Format(ucDic.Item(el)(0), "0.00") t = Replace((t), sep_, ".") t = Left(t & String(25, " "), 25) Mid(arrstr(1), 3, 25) = t Mid(arrstr(4), 3, 25) = t t = ucDic.Item(el)(1) t = Left(t & String(25, " "), 25) Mid(arrstr(5), 3, 25) = t
For i = 0 To 11 outFile.WriteLine arrstr(i) Next
For Each elel In ucDic.Item(el)(2) outFile.WriteLine elel Next outFile.Close Next
Set outFile = Nothing Set fso = Nothing Set nrDic = Nothing Set ucDic = Nothing Erase arrstr End Sub
[/vba]
Да, изначальная идея чуть изменилась, но общее направление осталось.
Ну вот пока так, сколько сегодня успел. Уже всё работает, но остались вопросы: 1. нужно ли генерить файлы, для которых нет строк? 2. куда собственно генерить файлы? 3. нужен ли диалог выбора файлов, или можно жёстко прописать путь? (как сейчас в коде, замените на свой) 4. в выходные файлы пишется лишний перевод строки в конце - если это критично, то можно усложнить код и это устранить.
5 строк позаимствовал, но чуть изменил Если бы прописать все номера 3-го участка - код был бы чуть короче и проще, ну да ладно Что где происходит - прописывать много, некогда, да и негде - это только сделает нечитаемым код Код писал в Экселе, но можно вероятно запустить и под Вордом, или на vbs переписать - но под Экселем думаю вполне неплохо, можно например поставить на автозапуск при открытии файла (и работает быстрее, чем как vbs, хотя если строк не миллион, то практически разницу не почувствуете).
[vba]
Code
Option Explicit
Sub RazborUcastkov() Dim nrDic As Object, ucDic As Object, fso As Object, ts As Object, outFile As Object Dim ad, arrstr, tArr, t$, tt$, i&, sep_$, el, elel
Set fso = CreateObject("Scripting.FileSystemObject")
Set nrDic = CreateObject("scripting.dictionary") nrDic.comparemode = 1 Set ucDic = CreateObject("scripting.dictionary") ucDic.comparemode = 1
sep_ = Mid(1 / 2, 2, 1)
For Each el In ad If Not ucDic.exists(el(0)) Then ucDic.Add el(0), Array(0, 0, New Collection) If IsArray(el) Then For i = 1 To UBound(el) nrDic.Item(el(i)) = el(0) Next End If Next
If Not ucDic.exists("3-й участок") Then ucDic.Add "3-й участок", Array(0, 0, New Collection)
Set ts = fso.OpenTextFile("c:\Temp\casper200\test.txt", 1) 'Подставьте свой путь к txt-файлу arrstr = Split(ts.ReadAll, vbCrLf) 'массив строк текста целиком ts.Close Set ts = Nothing
For Each el In ucDic Set outFile = fso.CreateTextFile("c:\Temp\casper200\test(" & el & ").txt") t = Format(ucDic.Item(el)(0), "0.00") t = Replace((t), sep_, ".") t = Left(t & String(25, " "), 25) Mid(arrstr(1), 3, 25) = t Mid(arrstr(4), 3, 25) = t t = ucDic.Item(el)(1) t = Left(t & String(25, " "), 25) Mid(arrstr(5), 3, 25) = t
For i = 0 To 11 outFile.WriteLine arrstr(i) Next
For Each elel In ucDic.Item(el)(2) outFile.WriteLine elel Next outFile.Close Next
Set outFile = Nothing Set fso = Nothing Set nrDic = Nothing Set ucDic = Nothing Erase arrstr End Sub
[/vba]
Да, изначальная идея чуть изменилась, но общее направление осталось.Hugo
1. нужно ли генерить файлы, для которых нет строк?
НЕТ.
Quote (Hugo)
2. куда собственно генерить файлы?
туда же где лежит исходный файл
Quote (Hugo)
3. нужен ли диалог выбора файлов, или можно жёстко прописать путь? (как сейчас в коде, замените на свой)
да нужен. (т.к. само имя файла - реестра каждый раз новое... и пользователи меняются могут в разных местах выполнять)
Quote (Hugo)
4. в выходные файлы пишется лишний перевод строки в конце - если это критично, то можно усложнить код и это устранить.
нет - этот переход в конце как раз нужен.
Quote (Hugo)
Если бы прописать все номера 3-го участка - код был бы чуть короче и проще, ну да ладно
3-уч. 20600-20633,20637
Quote (Hugo)
Что где происходит - прописывать много, некогда, да и негде - это только сделает нечитаемым код Код писал в Экселе, но можно вероятно запустить и под Вордом, или на vbs переписать - но под Экселем думаю вполне неплохо, можно например поставить на автозапуск при открытии файла (и работает быстрее, чем как vbs, хотя если строк не миллион, то практически разницу не почувствуете).
понимаю ВАС, там для ВАС все понятно как Божий день. Скорость работы изумила, чувствуется рука МАСТЕРА!. сейчас пытаюсь разобраться с кодом,
есть один нюанс, где то "косяк" с условием реест 1 уч. не должен быть пустым!, его строки перекочевали в реестр 3 уч.
hi Hugo, огромное спасибо!
Quote (Hugo)
1. нужно ли генерить файлы, для которых нет строк?
НЕТ.
Quote (Hugo)
2. куда собственно генерить файлы?
туда же где лежит исходный файл
Quote (Hugo)
3. нужен ли диалог выбора файлов, или можно жёстко прописать путь? (как сейчас в коде, замените на свой)
да нужен. (т.к. само имя файла - реестра каждый раз новое... и пользователи меняются могут в разных местах выполнять)
Quote (Hugo)
4. в выходные файлы пишется лишний перевод строки в конце - если это критично, то можно усложнить код и это устранить.
нет - этот переход в конце как раз нужен.
Quote (Hugo)
Если бы прописать все номера 3-го участка - код был бы чуть короче и проще, ну да ладно
3-уч. 20600-20633,20637
Quote (Hugo)
Что где происходит - прописывать много, некогда, да и негде - это только сделает нечитаемым код Код писал в Экселе, но можно вероятно запустить и под Вордом, или на vbs переписать - но под Экселем думаю вполне неплохо, можно например поставить на автозапуск при открытии файла (и работает быстрее, чем как vbs, хотя если строк не миллион, то практически разницу не почувствуете).
понимаю ВАС, там для ВАС все понятно как Божий день. Скорость работы изумила, чувствуется рука МАСТЕРА!. сейчас пытаюсь разобраться с кодом,
есть один нюанс, где то "косяк" с условием реест 1 уч. не должен быть пустым!, его строки перекочевали в реестр 3 уч.
С вопросами понятно, разобрались - постараюсь за выходные сделать Но смотрю изменились условия (вернее я их изначально неверно понял, т.к. Вы ничего не пояснили) - номера оказывается в диапазоне, это меняет подход. Поэтому и косяк с первым участком. Придётся часть кода переработать...
Для ясности напишите диапазоны номеров - пока стало понятно с 3-уч. 20600-20633,20637 Что с остальными?
С вопросами понятно, разобрались - постараюсь за выходные сделать Но смотрю изменились условия (вернее я их изначально неверно понял, т.к. Вы ничего не пояснили) - номера оказывается в диапазоне, это меняет подход. Поэтому и косяк с первым участком. Придётся часть кода переработать...
Для ясности напишите диапазоны номеров - пока стало понятно с 3-уч. 20600-20633,20637 Что с остальными?Hugo
Для ясности напишите диапазоны номеров - пока стало понятно с 3-уч. 20600-20633,20637 Что с остальными?
О_о они же в коде есть.... "1-й участок", "20100-20216" "2-й участок", "20257-20514", "20634-20636" 3-уч. 20600-20633,20637 - только этого не було... "4-й участок", "20777" огромное спб. за помощь
Hugo,
Quote (Hugo)
Для ясности напишите диапазоны номеров - пока стало понятно с 3-уч. 20600-20633,20637 Что с остальными?
О_о они же в коде есть.... "1-й участок", "20100-20216" "2-й участок", "20257-20514", "20634-20636" 3-уч. 20600-20633,20637 - только этого не було... "4-й участок", "20777" огромное спб. за помощьcasper200
With CreateObject("scripting.dictionary"): .comparemode = 1
For Each el In ad If Not .exists(el(0)) Then .Add el(0), Array(0, 0, New Collection) Next: .Add "unknown", Array(0, 0, New Collection)
For i = 12 To UBound(arrstr) t = Split(arrstr(i), ":", 3)(1): tt = "unknown" For Each el In ad If --t >= el(1) Then If --t <= el(2) Then tt = el(0): Exit For End If Next
fp = Left(fp, Len(fp) - 4) For Each el In .keys If .Item(el)(1) > 0 Then cnt = cnt + 1 Set outFile = fso.CreateTextFile(fp & "(" & el & ").txt") t = Format(.Item(el)(0), "0.00"): t = Replace((t), sep_, "."): t = Left(t & String(25, " "), 25) Mid(arrstr(1), 3, 25) = t: Mid(arrstr(4), 3, 25) = t t = .Item(el)(1): t = Left(t & String(25, " "), 25) Mid(arrstr(5), 3, 25) = t For i = 0 To 11: outFile.WriteLine arrstr(i): Next For Each elel In .Item(el)(2): outFile.WriteLine elel: Next outFile.Close End If Next End With
Set outFile = Nothing Set fso = Nothing Erase arrstr If cnt > 0 Then MsgBox cnt & " файла/ов вида" & vbLf & fp & "(участок)" & vbLf & "созданы!", vbInformation Else MsgBox "Файлы не созданы!", vbExclamation End If End Sub
Function GetFilePath(Optional ByVal Title As String = "Выберите файл для загрузки", _ Optional ByVal InitialPath As String = "C:\Temp\", _ Optional ByVal FilterDescription As String = "txt реестр СБРФ", _ Optional ByVal FilterExtention As String = "*.txt") As String ' функция выводит диалоговое окно выбора файла с заголовком Title, ' начиная обзор диска с папки InitialPath ' возвращает полный путь к выбранному файлу, или пустую строку в случае отказа от выбора ' для фильтра можно указать описание и расширение выбираемых файлов On Error Resume Next With Application.FileDialog(msoFileDialogOpen) .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath .Filters.Clear: .Filters.Add FilterDescription, FilterExtention If .Show <> -1 Then Exit Function GetFilePath = .SelectedItems(1) End With End Function
[/vba]
Для выбора файла использовал готовую функцию неизвестного автора
P.S. Если кто-то ищет тут код vbs - не ищите, нету... Пытался сделать версию vbs - слишком много переделывать. В vbs нет коллекции, не работает так Mid... Ну разве что если очень нужно vbs, то можно заняться.
Получился такой код:
[vba]
Code
Option Explicit
Sub RazborUcastkov() Dim fso As Object, ts As Object, outFile As Object, fp$, cnt& Dim ad, arrstr, tArr, t$, tt$, i&, sep_$, el, elel
Set fso = CreateObject("Scripting.FileSystemObject")
fp = GetFilePath If fp = "" Then Exit Sub
Set ts = fso.OpenTextFile(fp, 1) arrstr = Split(ts.ReadAll, vbCrLf) 'массив строк текста целиком ts.Close: Set ts = Nothing
sep_ = Mid(1 / 2, 2, 1) 'десятичный разделитель системы
With CreateObject("scripting.dictionary"): .comparemode = 1
For Each el In ad If Not .exists(el(0)) Then .Add el(0), Array(0, 0, New Collection) Next: .Add "unknown", Array(0, 0, New Collection)
For i = 12 To UBound(arrstr) t = Split(arrstr(i), ":", 3)(1): tt = "unknown" For Each el In ad If --t >= el(1) Then If --t <= el(2) Then tt = el(0): Exit For End If Next
fp = Left(fp, Len(fp) - 4) For Each el In .keys If .Item(el)(1) > 0 Then cnt = cnt + 1 Set outFile = fso.CreateTextFile(fp & "(" & el & ").txt") t = Format(.Item(el)(0), "0.00"): t = Replace((t), sep_, "."): t = Left(t & String(25, " "), 25) Mid(arrstr(1), 3, 25) = t: Mid(arrstr(4), 3, 25) = t t = .Item(el)(1): t = Left(t & String(25, " "), 25) Mid(arrstr(5), 3, 25) = t For i = 0 To 11: outFile.WriteLine arrstr(i): Next For Each elel In .Item(el)(2): outFile.WriteLine elel: Next outFile.Close End If Next End With
Set outFile = Nothing Set fso = Nothing Erase arrstr If cnt > 0 Then MsgBox cnt & " файла/ов вида" & vbLf & fp & "(участок)" & vbLf & "созданы!", vbInformation Else MsgBox "Файлы не созданы!", vbExclamation End If End Sub
Function GetFilePath(Optional ByVal Title As String = "Выберите файл для загрузки", _ Optional ByVal InitialPath As String = "C:\Temp\", _ Optional ByVal FilterDescription As String = "txt реестр СБРФ", _ Optional ByVal FilterExtention As String = "*.txt") As String ' функция выводит диалоговое окно выбора файла с заголовком Title, ' начиная обзор диска с папки InitialPath ' возвращает полный путь к выбранному файлу, или пустую строку в случае отказа от выбора ' для фильтра можно указать описание и расширение выбираемых файлов On Error Resume Next With Application.FileDialog(msoFileDialogOpen) .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath .Filters.Clear: .Filters.Add FilterDescription, FilterExtention If .Show <> -1 Then Exit Function GetFilePath = .SelectedItems(1) End With End Function
[/vba]
Для выбора файла использовал готовую функцию неизвестного автора
P.S. Если кто-то ищет тут код vbs - не ищите, нету... Пытался сделать версию vbs - слишком много переделывать. В vbs нет коллекции, не работает так Mid... Ну разве что если очень нужно vbs, то можно заняться.Hugo
hi Hugo, Все устраивает код спрессован максимально, пошагово выполнил основные моменты понял. завтра проверю, на рабочих реестрах, думаю проблем быть не должно. еще раз огромное спасибо за помощь!, надо учить VBA - мощный язык.
hi Hugo, Все устраивает код спрессован максимально, пошагово выполнил основные моменты понял. завтра проверю, на рабочих реестрах, думаю проблем быть не должно. еще раз огромное спасибо за помощь!, надо учить VBA - мощный язык.casper200
hi Hugo, столкнулся с тем что в реестрах в конце файла переход строки, (в тестовом который я предоставлял. его нет...) поэтому при выполнении макроса происходит ошибка на строке [vba]
Code
t = Split(arrstr(i), ":", 3)(1): tt = "unknown"
[/vba] он видимо не понимает что конца достиг раз там переход на сл. строку, тут надо проверку как то сделать? пока сделал так [vba]
Code
For i = 12 To UBound(arrstr) - 1
[/vba] - работает, но не знаю достаточно ли этого?
hi Hugo, столкнулся с тем что в реестрах в конце файла переход строки, (в тестовом который я предоставлял. его нет...) поэтому при выполнении макроса происходит ошибка на строке [vba]
Code
t = Split(arrstr(i), ":", 3)(1): tt = "unknown"
[/vba] он видимо не понимает что конца достиг раз там переход на сл. строку, тут надо проверку как то сделать? пока сделал так [vba]
Code
For i = 12 To UBound(arrstr) - 1
[/vba] - работает, но не знаю достаточно ли этого?casper200