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

Вход

Регистрация

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

 

= Мир MS Excel/Экспорт в текстовый файл и обратная задача - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Экспорт в текстовый файл и обратная задача (Макросы/Sub)
Экспорт в текстовый файл и обратная задача
DmitriyGen Дата: Суббота, 28.03.2015, 15:21 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Есть следующая задача. Из данных в таблице необходимо сделать текстовые файлы ANSI 1251 с расширением .qvd (пример таблицы приложен в реальной таблице более 12 тыс. записей). Из каждой строки таблицы необходимо сформировать отдельный файл с нумерацией 99900001, где последние 5 цифр номер строки таблицы (причем именно 5 т.е. необходимо дополнять впереди нулями если номер строки 1,2,3 или 4 цифры). Файл состоит из 2-х строк первая заголовок (который всегда одинаковый) во второй строке все данные постоянные кроме несколько раз используемых ФИО из таблицы, причем Фамилия Имя и Отчество отдельно (т.е. необходимо ФИО из таблицы разделить на 3 реквизита, можно это сделать предварительно в самой таблице), даты рождения в формате ДД.ММ.ГГГГ, даты рождения в цифровом формате (колонка C) и последних реквизитов в строке §52=99900003.qvd§55=0003, где после §52= имя формируемого файла, а после §55= 4 последние цифры от имени файла. Как видно из содержимого файла .qvd, это SQL который будет обработан и получены файлы ответа.
И соответственно обратная задача необходимо данные из файлов ответа импортировать в Excel. Файлы сложу в одну папку и только те, в которых есть данные, т.е. необходимо обработать все файлы в папке. Файл ответа состоит из 2 и более строк. Первая строка заголовок, который обрабатывать не нужно, а вторая и возможно больше состоит из § - разделитель 1= - поле далее значение и следующий разделитель. Набор полей не постоянный, т.е. если у одной записи поле 5 пустое §5= в файле не будет, а у другой записи поле не пусто §5= будет присутствовать в файле.
Все поля обрабатывать нет необходимости, а необходимо сделать что-то типа значение после §19= записать в колонку A если §19= нет колонку оставить пустую и т.д. набор обрабатываемых полей определю сам. Если в файле более 2 строк каждая строчка обрабатывается в новую строку таблицы. И так из всех файлов каждая строка новая добавляемая строка в таблицу.
С VBA не знаком вообще но есть опыт программирования в других языках поэтому просьба в примере добавить комментарии, чтобы я мог самостоятельно допилить.
К сообщению приложен файл: 7141057.xls (16.0 Kb) · 09300003.qvd (0.7 Kb)


Сообщение отредактировал DmitriyGen - Суббота, 28.03.2015, 19:10
 
Ответить
СообщениеЕсть следующая задача. Из данных в таблице необходимо сделать текстовые файлы ANSI 1251 с расширением .qvd (пример таблицы приложен в реальной таблице более 12 тыс. записей). Из каждой строки таблицы необходимо сформировать отдельный файл с нумерацией 99900001, где последние 5 цифр номер строки таблицы (причем именно 5 т.е. необходимо дополнять впереди нулями если номер строки 1,2,3 или 4 цифры). Файл состоит из 2-х строк первая заголовок (который всегда одинаковый) во второй строке все данные постоянные кроме несколько раз используемых ФИО из таблицы, причем Фамилия Имя и Отчество отдельно (т.е. необходимо ФИО из таблицы разделить на 3 реквизита, можно это сделать предварительно в самой таблице), даты рождения в формате ДД.ММ.ГГГГ, даты рождения в цифровом формате (колонка C) и последних реквизитов в строке §52=99900003.qvd§55=0003, где после §52= имя формируемого файла, а после §55= 4 последние цифры от имени файла. Как видно из содержимого файла .qvd, это SQL который будет обработан и получены файлы ответа.
И соответственно обратная задача необходимо данные из файлов ответа импортировать в Excel. Файлы сложу в одну папку и только те, в которых есть данные, т.е. необходимо обработать все файлы в папке. Файл ответа состоит из 2 и более строк. Первая строка заголовок, который обрабатывать не нужно, а вторая и возможно больше состоит из § - разделитель 1= - поле далее значение и следующий разделитель. Набор полей не постоянный, т.е. если у одной записи поле 5 пустое §5= в файле не будет, а у другой записи поле не пусто §5= будет присутствовать в файле.
Все поля обрабатывать нет необходимости, а необходимо сделать что-то типа значение после §19= записать в колонку A если §19= нет колонку оставить пустую и т.д. набор обрабатываемых полей определю сам. Если в файле более 2 строк каждая строчка обрабатывается в новую строку таблицы. И так из всех файлов каждая строка новая добавляемая строка в таблицу.
С VBA не знаком вообще но есть опыт программирования в других языках поэтому просьба в примере добавить комментарии, чтобы я мог самостоятельно допилить.

Автор - DmitriyGen
Дата добавления - 28.03.2015 в 15:21
DmitriyGen Дата: Суббота, 28.03.2015, 15:22 | Сообщение № 2
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Прикладывая файл ответа.
К сообщению приложен файл: 99900386.rvd (0.8 Kb)
 
Ответить
СообщениеПрикладывая файл ответа.

Автор - DmitriyGen
Дата добавления - 28.03.2015 в 15:22
RAN Дата: Суббота, 28.03.2015, 16:20 | Сообщение № 3
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Очень много букав. Не читаются все, так что допиливайте.

[vba]
Код
Sub Мяу()
      Dim txtTmp$, sFileName$, sPath$, i&
      Dim FSO As Object, TextStream As Object
      Set FSO = CreateObject("Scripting.FileSystemObject")
      sPath = ThisWorkbook.Path & "\"
      For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
          txtTmp = "1251/1176039/1176093/1176093-21:ААААААА:0" & vbNewLine
          txtTmp = txtTmp & "Лень писать 1 §35=" & Split(Cells(i, 1))(0) & "§36=" & Split(Cells(i, 1))(1)
          txtTmp = txtTmp & "§37=" & Split(Cells(i, 1))(2) & "Лень писать 2"
          sFileName = CStr("999" & Format(i, "00000"))
          Set TextStream = FSO.CreateTextFile(sPath & sFileName & ".qvd", True)
          TextStream.Write txtTmp
          TextStream.Close
      Next
End Sub
[/vba]


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Суббота, 28.03.2015, 16:20
 
Ответить
СообщениеОчень много букав. Не читаются все, так что допиливайте.

[vba]
Код
Sub Мяу()
      Dim txtTmp$, sFileName$, sPath$, i&
      Dim FSO As Object, TextStream As Object
      Set FSO = CreateObject("Scripting.FileSystemObject")
      sPath = ThisWorkbook.Path & "\"
      For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
          txtTmp = "1251/1176039/1176093/1176093-21:ААААААА:0" & vbNewLine
          txtTmp = txtTmp & "Лень писать 1 §35=" & Split(Cells(i, 1))(0) & "§36=" & Split(Cells(i, 1))(1)
          txtTmp = txtTmp & "§37=" & Split(Cells(i, 1))(2) & "Лень писать 2"
          sFileName = CStr("999" & Format(i, "00000"))
          Set TextStream = FSO.CreateTextFile(sPath & sFileName & ".qvd", True)
          TextStream.Write txtTmp
          TextStream.Close
      Next
End Sub
[/vba]

Автор - RAN
Дата добавления - 28.03.2015 в 16:20
DmitriyGen Дата: Суббота, 28.03.2015, 18:41 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

RAN, Спасибо огромное все допилил. А по обратной задаче можете помочь?
 
Ответить
СообщениеRAN, Спасибо огромное все допилил. А по обратной задаче можете помочь?

Автор - DmitriyGen
Дата добавления - 28.03.2015 в 18:41
RAN Дата: Суббота, 28.03.2015, 18:53 | Сообщение № 5
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Многабукав. Разбираться что и куда извлечь муторно.
Выделите переносом строки, и сохраните.
Может будет понятнее.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеМногабукав. Разбираться что и куда извлечь муторно.
Выделите переносом строки, и сохраните.
Может будет понятнее.

Автор - RAN
Дата добавления - 28.03.2015 в 18:53
Hugo Дата: Суббота, 28.03.2015, 19:02 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3252
Репутация: 707 ±
Замечаний: 0% ±

2019
Заготовка на вторую задачу:
[vba]
Код
Sub tt()
     Dim a, b, i&, ii&
     Dim ind&: ind = 2

     a = Split(CreateObject("Scripting.FileSystemObject").Getfile("c:\Users\Igor\Downloads\99900386.rvd").OpenasTextStream(1).ReadAll, vbLf)
     For i = 1 To UBound(a)
         b = Split(a(i), "§")
         If UBound(b) > 0 Then
             For ii = 1 To UBound(b)
                 Cells(ind, --Split(b(ii), "=")(0)) = Split(b(ii), "=")(1)
             Next
         End If
     Next

End Sub
[/vba]


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеЗаготовка на вторую задачу:
[vba]
Код
Sub tt()
     Dim a, b, i&, ii&
     Dim ind&: ind = 2

     a = Split(CreateObject("Scripting.FileSystemObject").Getfile("c:\Users\Igor\Downloads\99900386.rvd").OpenasTextStream(1).ReadAll, vbLf)
     For i = 1 To UBound(a)
         b = Split(a(i), "§")
         If UBound(b) > 0 Then
             For ii = 1 To UBound(b)
                 Cells(ind, --Split(b(ii), "=")(0)) = Split(b(ii), "=")(1)
             Next
         End If
     Next

End Sub
[/vba]

Автор - Hugo
Дата добавления - 28.03.2015 в 19:02
DmitriyGen Дата: Воскресенье, 29.03.2015, 05:33 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Hugo, а как обработать все файлы в папке если их кол-во заранее не известно.
Как уже писал ранее строк в файле может быть несколко первая пропускается а последующие обрабатываються каждая с строка это новая строка таблицы.
И так из всех файлов в одну таблицу все строки исключая первые.
И импортировать не всю строку а по условию если есть поле §19= его значение записать в столбец 1 и т.д.
 
Ответить
СообщениеHugo, а как обработать все файлы в папке если их кол-во заранее не известно.
Как уже писал ранее строк в файле может быть несколко первая пропускается а последующие обрабатываються каждая с строка это новая строка таблицы.
И так из всех файлов в одну таблицу все строки исключая первые.
И импортировать не всю строку а по условию если есть поле §19= его значение записать в столбец 1 и т.д.

Автор - DmitriyGen
Дата добавления - 29.03.2015 в 05:33
DmitriyGen Дата: Воскресенье, 29.03.2015, 12:52 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Почти со всем разобрался остались две проблемы если в файле ответа более двух строк то в таблицу попадает только последняя строка файла. Видимо счетчик строк не там ставлю. И не могу преобразовать из текста ГГГГММДД в дату Cdate выдает ошибку.
[vba]
Код

Sub MyExp()
      Dim a, b, i&, ii&
      Dim ind&: ind = 1

      Set fso = CreateObject("Scripting.FileSystemObject")
      Set TheFolder = fso.GetFolder("g:\222\")
      Set TheFiles = TheFolder.Files

      For Each AFile In TheFiles
          If UCase(fso.GetExtensionName(AFile.Path)) = "RVD" Then
             Set ts = fso.OpenTextFile(AFile.Path, 1)
             ts.Close
             a = Split(fso.Getfile(AFile.Path).OpenasTextStream(1).ReadAll, vbLf)
                
             For i = 1 To UBound(a)
                 b = Split(a(i), "§")
                    
                 If UBound(b) > 0 Then
                    For ii = 1 To UBound(b)
          '         MsgBox "111: " & b(ii)
                        If Left(b(ii), 2) = "3=" Then
                           Cells(ind, 5) = Split(b(ii), "=")(1)
                        End If
                        If Left(b(ii), 2) = "5=" Then
                           Cells(ind, 6) = Split(b(ii), "=")(1)
                        End If
                        If Left(b(ii), 3) = "19=" Then
                           Cells(ind, 1) = Split(b(ii), "=")(1)
                        End If
                        If Left(b(ii), 3) = "20=" Then
                           Cells(ind, 2) = Split(b(ii), "=")(1)
                        End If
                        If Left(b(ii), 3) = "21=" Then
                           Cells(ind, 3) = Split(b(ii), "=")(1)
                        End If
                        If Left(b(ii), 3) = "25=" Then
                           Cells(ind, 4) = Split(b(ii), "=")(1)
                        End If
                        If Left(b(ii), 4) = "134=" Then
                           Cells(ind, 7) = Split(b(ii), "=")(1)
                        End If
                        If Left(b(ii), 4) = "135=" Then
                           Cells(ind, 8) = Split(b(ii), "=")(1)
                        End If
                    Next
                 End If
             Next
          End If
          ind = ind + 1
       Next
End Sub

[/vba]
 
Ответить
СообщениеПочти со всем разобрался остались две проблемы если в файле ответа более двух строк то в таблицу попадает только последняя строка файла. Видимо счетчик строк не там ставлю. И не могу преобразовать из текста ГГГГММДД в дату Cdate выдает ошибку.
[vba]
Код

Sub MyExp()
      Dim a, b, i&, ii&
      Dim ind&: ind = 1

      Set fso = CreateObject("Scripting.FileSystemObject")
      Set TheFolder = fso.GetFolder("g:\222\")
      Set TheFiles = TheFolder.Files

      For Each AFile In TheFiles
          If UCase(fso.GetExtensionName(AFile.Path)) = "RVD" Then
             Set ts = fso.OpenTextFile(AFile.Path, 1)
             ts.Close
             a = Split(fso.Getfile(AFile.Path).OpenasTextStream(1).ReadAll, vbLf)
                
             For i = 1 To UBound(a)
                 b = Split(a(i), "§")
                    
                 If UBound(b) > 0 Then
                    For ii = 1 To UBound(b)
          '         MsgBox "111: " & b(ii)
                        If Left(b(ii), 2) = "3=" Then
                           Cells(ind, 5) = Split(b(ii), "=")(1)
                        End If
                        If Left(b(ii), 2) = "5=" Then
                           Cells(ind, 6) = Split(b(ii), "=")(1)
                        End If
                        If Left(b(ii), 3) = "19=" Then
                           Cells(ind, 1) = Split(b(ii), "=")(1)
                        End If
                        If Left(b(ii), 3) = "20=" Then
                           Cells(ind, 2) = Split(b(ii), "=")(1)
                        End If
                        If Left(b(ii), 3) = "21=" Then
                           Cells(ind, 3) = Split(b(ii), "=")(1)
                        End If
                        If Left(b(ii), 3) = "25=" Then
                           Cells(ind, 4) = Split(b(ii), "=")(1)
                        End If
                        If Left(b(ii), 4) = "134=" Then
                           Cells(ind, 7) = Split(b(ii), "=")(1)
                        End If
                        If Left(b(ii), 4) = "135=" Then
                           Cells(ind, 8) = Split(b(ii), "=")(1)
                        End If
                    Next
                 End If
             Next
          End If
          ind = ind + 1
       Next
End Sub

[/vba]

Автор - DmitriyGen
Дата добавления - 29.03.2015 в 12:52
Hugo Дата: Воскресенье, 29.03.2015, 12:53 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3252
Репутация: 707 ±
Замечаний: 0% ±

2019
1 строка - на форуме полно кодов перебора файлов, берите и работайте.
2 строка - сделал
3 строка - см. 1 строка
4 строка - сделал, но только почему 19в1? Сделал 19в19, так логичнее :) Ведь не сделано "набор обрабатываемых полей определю сам."
Когда будет список соответствий - его можно подключить в процесс раскладки. Я бы делал через словарь, но можно делать и иначе, медленнее.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
Сообщение1 строка - на форуме полно кодов перебора файлов, берите и работайте.
2 строка - сделал
3 строка - см. 1 строка
4 строка - сделал, но только почему 19в1? Сделал 19в19, так логичнее :) Ведь не сделано "набор обрабатываемых полей определю сам."
Когда будет список соответствий - его можно подключить в процесс раскладки. Я бы делал через словарь, но можно делать и иначе, медленнее.

Автор - Hugo
Дата добавления - 29.03.2015 в 12:53
DmitriyGen Дата: Воскресенье, 29.03.2015, 13:01 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Hugo, это мой первый опыт работы с VBA практически на угад делал.
 
Ответить
СообщениеHugo, это мой первый опыт работы с VBA практически на угад делал.

Автор - DmitriyGen
Дата добавления - 29.03.2015 в 13:01
Hugo Дата: Воскресенье, 29.03.2015, 13:06 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3252
Репутация: 707 ±
Замечаний: 0% ±

2019
Перебор файлов вижу уже есть.
Да, счётчик строк не там (а я вообще про него забыл) - ставьте его увеличение сразу после If UBound(b) > 0 Then
Т.е. при обработке очередной строки текста, которую есть смысл обрабатывать (там в конце пустая строка, а вдруг могу попасться и без "§") увеличиваем счётчик строк.
Ещё замечание - проверять If Left(b(ii), 2) = "3=" Then очень расточительно по всем ресурсам - и по написанию кода (сколько там вариантов?) и по нагрузке на процессор (сколько проверок будете делать на каждом шаге).


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Воскресенье, 29.03.2015, 13:35
 
Ответить
СообщениеПеребор файлов вижу уже есть.
Да, счётчик строк не там (а я вообще про него забыл) - ставьте его увеличение сразу после If UBound(b) > 0 Then
Т.е. при обработке очередной строки текста, которую есть смысл обрабатывать (там в конце пустая строка, а вдруг могу попасться и без "§") увеличиваем счётчик строк.
Ещё замечание - проверять If Left(b(ii), 2) = "3=" Then очень расточительно по всем ресурсам - и по написанию кода (сколько там вариантов?) и по нагрузке на процессор (сколько проверок будете делать на каждом шаге).

Автор - Hugo
Дата добавления - 29.03.2015 в 13:06
DmitriyGen Дата: Воскресенье, 29.03.2015, 13:10 | Сообщение № 12
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Hugo, а на что заменить лучше If Left(b(ii), 2) = "3=" Then, пробовал Select Case не пулочилось.
 
Ответить
СообщениеHugo, а на что заменить лучше If Left(b(ii), 2) = "3=" Then, пробовал Select Case не пулочилось.

Автор - DmitriyGen
Дата добавления - 29.03.2015 в 13:10
Hugo Дата: Воскресенье, 29.03.2015, 13:19 | Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3252
Репутация: 707 ±
Замечаний: 0% ±

2019
Конечно select case лучше - в Вашем варианте проверки идут до конца, с select case только пока не найдётся искомое.
И код проще.
А как выбрать число до "=" я ведь выше показал: --Split(b(ii), "=")(0)
Вот далее ищите его в списке соответствий, получаете нужный столбец.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеКонечно select case лучше - в Вашем варианте проверки идут до конца, с select case только пока не найдётся искомое.
И код проще.
А как выбрать число до "=" я ведь выше показал: --Split(b(ii), "=")(0)
Вот далее ищите его в списке соответствий, получаете нужный столбец.

Автор - Hugo
Дата добавления - 29.03.2015 в 13:19
Hugo Дата: Воскресенье, 29.03.2015, 13:33 | Сообщение № 14
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3252
Репутация: 707 ±
Замечаний: 0% ±

2019
Вот вариант с списком соответствия в словаре (мой первый доработанный, под Ваш подгонять некогда, убегаю):
[vba]
Код
Sub tt()
      Dim a, b, i&, ii&, ind&, t$
      Dim sp1, sp2

      sp1 = Split("3 5 19 20 21 25 134 135")
      sp2 = Split("5 6 1 2 3 4 7 8")

      With CreateObject("scripting.dictionary")
          For i = 0 To UBound(sp1): .Item(sp1(i)) = sp2(i): Next

          a = Split(CreateObject("Scripting.FileSystemObject").Getfile("c:\Users\Igor\Downloads\99900386.rvd").OpenasTextStream(1).ReadAll, vbLf)

          For i = 1 To UBound(a)
              b = Split(a(i), "§")
              If UBound(b) > 0 Then
                  ind = ind + 1
                  For ii = 1 To UBound(b)
                      t = Split(b(ii), "=")(0)
                      If .exists(t) Then Cells(ind, --.Item(t)) = Split(b(ii), "=")(1)
                  Next
              End If
          Next

      End With

End Sub
[/vba]


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Воскресенье, 29.03.2015, 13:34
 
Ответить
СообщениеВот вариант с списком соответствия в словаре (мой первый доработанный, под Ваш подгонять некогда, убегаю):
[vba]
Код
Sub tt()
      Dim a, b, i&, ii&, ind&, t$
      Dim sp1, sp2

      sp1 = Split("3 5 19 20 21 25 134 135")
      sp2 = Split("5 6 1 2 3 4 7 8")

      With CreateObject("scripting.dictionary")
          For i = 0 To UBound(sp1): .Item(sp1(i)) = sp2(i): Next

          a = Split(CreateObject("Scripting.FileSystemObject").Getfile("c:\Users\Igor\Downloads\99900386.rvd").OpenasTextStream(1).ReadAll, vbLf)

          For i = 1 To UBound(a)
              b = Split(a(i), "§")
              If UBound(b) > 0 Then
                  ind = ind + 1
                  For ii = 1 To UBound(b)
                      t = Split(b(ii), "=")(0)
                      If .exists(t) Then Cells(ind, --.Item(t)) = Split(b(ii), "=")(1)
                  Next
              End If
          Next

      End With

End Sub
[/vba]

Автор - Hugo
Дата добавления - 29.03.2015 в 13:33
RAN Дата: Воскресенье, 29.03.2015, 14:29 | Сообщение № 15
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
[vba]
Код
Sub Мяв()

     Dim fso As Object, TheFolder As Object, AFile As Object, TextStream As Object
     Dim objRegExp As Object
     Dim arrCell(), arrPat(), arrTmp
     Dim i&, j&
      
     arrCell = Array(1, 2, 3, 4, 5, 6, 7, 8)
     arrPat = Array(19, 20, 21, 25, 3, 5, 134, 135)

     Set objRegExp = CreateObject("VBScript.RegExp")
     Set fso = CreateObject("Scripting.FileSystemObject")
     Set TheFolder = fso.GetFolder(ThisWorkbook.Path)
     Set TheFiles = TheFolder.Files

     For Each AFile In TheFolder.Files
         If LCase$(fso.GetExtensionName(AFile.Name)) = "rvd" Then
             Set TextStream = AFile.OpenAsTextStream(1)
             stmp = TextStream.ReadAll
             TextStream.Close
             arrTmp = Split(stmp, vbLf)
             With ThisWorkbook.Sheets(3)
                 For i = 1 To UBound(arrTmp)
                     If Len(arrPat(i)) Then
                         lr = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                         For j = LBound(arrPat) To UBound(arrPat)
                             objRegExp.Pattern = "§" & arrPat(j) & "=(.*?)?§"
                             If objRegExp.Test(arrTmp(i)) Then
                    If j = 3 Or j = 5 Then
                    sDate = objRegExp.Execute(arrTmp(i))(0).submatches(0)
                    sDate = Mid$(sDate, 7, 2) & "." & Mid$(sDate, 5, 2) & "." & Mid$(sDate, 1, 4)
'                    .Cells(lr, arrCell(j)) = sDate ' текст
                    .Cells(lr, arrCell(j)) = CDate(sDate) ' дата
                    Else
                    .Cells(lr, arrCell(j)) = objRegExp.Execute(arrTmp(i))(0).submatches(0)
                    End If
                    End If
                             Next
                         End If
                     Next
                 End With
             End If
         Next
     End Sub
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение[vba]
Код
Sub Мяв()

     Dim fso As Object, TheFolder As Object, AFile As Object, TextStream As Object
     Dim objRegExp As Object
     Dim arrCell(), arrPat(), arrTmp
     Dim i&, j&
      
     arrCell = Array(1, 2, 3, 4, 5, 6, 7, 8)
     arrPat = Array(19, 20, 21, 25, 3, 5, 134, 135)

     Set objRegExp = CreateObject("VBScript.RegExp")
     Set fso = CreateObject("Scripting.FileSystemObject")
     Set TheFolder = fso.GetFolder(ThisWorkbook.Path)
     Set TheFiles = TheFolder.Files

     For Each AFile In TheFolder.Files
         If LCase$(fso.GetExtensionName(AFile.Name)) = "rvd" Then
             Set TextStream = AFile.OpenAsTextStream(1)
             stmp = TextStream.ReadAll
             TextStream.Close
             arrTmp = Split(stmp, vbLf)
             With ThisWorkbook.Sheets(3)
                 For i = 1 To UBound(arrTmp)
                     If Len(arrPat(i)) Then
                         lr = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                         For j = LBound(arrPat) To UBound(arrPat)
                             objRegExp.Pattern = "§" & arrPat(j) & "=(.*?)?§"
                             If objRegExp.Test(arrTmp(i)) Then
                    If j = 3 Or j = 5 Then
                    sDate = objRegExp.Execute(arrTmp(i))(0).submatches(0)
                    sDate = Mid$(sDate, 7, 2) & "." & Mid$(sDate, 5, 2) & "." & Mid$(sDate, 1, 4)
'                    .Cells(lr, arrCell(j)) = sDate ' текст
                    .Cells(lr, arrCell(j)) = CDate(sDate) ' дата
                    Else
                    .Cells(lr, arrCell(j)) = objRegExp.Execute(arrTmp(i))(0).submatches(0)
                    End If
                    End If
                             Next
                         End If
                     Next
                 End With
             End If
         Next
     End Sub
[/vba]

Автор - RAN
Дата добавления - 29.03.2015 в 14:29
DmitriyGen Дата: Воскресенье, 29.03.2015, 15:27 | Сообщение № 16
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Всем огромное спасибо за помощь. Вот что у меня в итоге получилось.
[vba]
Код

Sub MyExp()
      Dim a, b, i&, ii&, t$
      Dim ind&: ind = 0
      Dim sp1, sp2

      sp1 = Split("3 5 19 20 21 25 134 135")
      sp2 = Split("5 6 1 2 3 4 7 8")

      With CreateObject("scripting.dictionary")
       
      Set fso = CreateObject("Scripting.FileSystemObject")
      Set TheFolder = fso.GetFolder("g:\222\")
      Set TheFiles = TheFolder.Files

      For Each AFile In TheFiles
          If UCase(fso.GetExtensionName(AFile.Path)) = "RVD" Then
             Set ts = fso.OpenTextFile(AFile.Path, 1)
             ts.Close
              
             For i = 0 To UBound(sp1): .Item(sp1(i)) = sp2(i): Next
              
             a = Split(fso.Getfile(AFile.Path).OpenasTextStream(1).ReadAll, vbLf)
              
              For i = 1 To UBound(a)
              b = Split(a(i), "§")
              If UBound(b) > 0 Then
                  ind = ind + 1
                  For ii = 1 To UBound(b)
                      t = Split(b(ii), "=")(0)
                   '   MsgBox "111: " & t
                      If .exists(t) Then Cells(ind, --.Item(t)) = Split(b(ii), "=")(1)
                      If t = "5" Then Cells(ind, --.Item(t)) = Right(Split(b(ii), "=")(1), 2) & "." & Mid(Split(b(ii), "=")(1), 5, 2) & "." & Left(Split(b(ii), "=")(1), 4)
                      If t = "25" Then Cells(ind, --.Item(t)) = Right(Split(b(ii), "=")(1), 2) & "." & Mid(Split(b(ii), "=")(1), 5, 2) & "." & Left(Split(b(ii), "=")(1), 4)
                  Next
              End If
              Next
           End If
      Next
      End With
           
End Sub
[/vba]
Вроде все работает.
 
Ответить
СообщениеВсем огромное спасибо за помощь. Вот что у меня в итоге получилось.
[vba]
Код

Sub MyExp()
      Dim a, b, i&, ii&, t$
      Dim ind&: ind = 0
      Dim sp1, sp2

      sp1 = Split("3 5 19 20 21 25 134 135")
      sp2 = Split("5 6 1 2 3 4 7 8")

      With CreateObject("scripting.dictionary")
       
      Set fso = CreateObject("Scripting.FileSystemObject")
      Set TheFolder = fso.GetFolder("g:\222\")
      Set TheFiles = TheFolder.Files

      For Each AFile In TheFiles
          If UCase(fso.GetExtensionName(AFile.Path)) = "RVD" Then
             Set ts = fso.OpenTextFile(AFile.Path, 1)
             ts.Close
              
             For i = 0 To UBound(sp1): .Item(sp1(i)) = sp2(i): Next
              
             a = Split(fso.Getfile(AFile.Path).OpenasTextStream(1).ReadAll, vbLf)
              
              For i = 1 To UBound(a)
              b = Split(a(i), "§")
              If UBound(b) > 0 Then
                  ind = ind + 1
                  For ii = 1 To UBound(b)
                      t = Split(b(ii), "=")(0)
                   '   MsgBox "111: " & t
                      If .exists(t) Then Cells(ind, --.Item(t)) = Split(b(ii), "=")(1)
                      If t = "5" Then Cells(ind, --.Item(t)) = Right(Split(b(ii), "=")(1), 2) & "." & Mid(Split(b(ii), "=")(1), 5, 2) & "." & Left(Split(b(ii), "=")(1), 4)
                      If t = "25" Then Cells(ind, --.Item(t)) = Right(Split(b(ii), "=")(1), 2) & "." & Mid(Split(b(ii), "=")(1), 5, 2) & "." & Left(Split(b(ii), "=")(1), 4)
                  Next
              End If
              Next
           End If
      Next
      End With
           
End Sub
[/vba]
Вроде все работает.

Автор - DmitriyGen
Дата добавления - 29.03.2015 в 15:27
DmitriyGen Дата: Воскресенье, 29.03.2015, 15:36 | Сообщение № 17
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

RAN, Ваш метод тоже работает только я там в циклах наглуху заблудился, что и для чего. Спасибо за помощь.
 
Ответить
СообщениеRAN, Ваш метод тоже работает только я там в циклах наглуху заблудился, что и для чего. Спасибо за помощь.

Автор - DmitriyGen
Дата добавления - 29.03.2015 в 15:36
Hugo Дата: Воскресенье, 29.03.2015, 15:46 | Сообщение № 18
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3252
Репутация: 707 ±
Замечаний: 0% ±

2019
Да, что-то я там с сплитом зря связался, сразу делать array лучше.
Только первый массив делать из чисел текстом, второй из чисел, т.к. ключ нужен текстом, а номер столбца числом - тогда отпадают лишние преобразования в дальнейшем.
И проверки на t = "5" и t ="25" целесообразно поместить внутрь проверки на наличие в словаре - чтоб не проверять на все другие 300+ ненужных вариантов.
И с select case чуть меньше букв будет.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеДа, что-то я там с сплитом зря связался, сразу делать array лучше.
Только первый массив делать из чисел текстом, второй из чисел, т.к. ключ нужен текстом, а номер столбца числом - тогда отпадают лишние преобразования в дальнейшем.
И проверки на t = "5" и t ="25" целесообразно поместить внутрь проверки на наличие в словаре - чтоб не проверять на все другие 300+ ненужных вариантов.
И с select case чуть меньше букв будет.

Автор - Hugo
Дата добавления - 29.03.2015 в 15:46
DmitriyGen Дата: Воскресенье, 29.03.2015, 16:02 | Сообщение № 19
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Hugo, проверку на t = "5" и t ="25" поместил вот так
[vba]
Код

                       If .exists(t) Then
                          If t = "5" Or t = "25" Then
                             Cells(ind, --.Item(t)) = CDate(Right(Split(b(ii), "=")(1), 2) & "." & Mid(Split(b(ii), "=")(1), 5, 2) & "." & Left(Split(b(ii), "=")(1), 4))
                          Else
                             Cells(ind, --.Item(t)) = Split(b(ii), "=")(1)
                          End If
                       End If
[/vba]


Сообщение отредактировал DmitriyGen - Воскресенье, 29.03.2015, 16:12
 
Ответить
СообщениеHugo, проверку на t = "5" и t ="25" поместил вот так
[vba]
Код

                       If .exists(t) Then
                          If t = "5" Or t = "25" Then
                             Cells(ind, --.Item(t)) = CDate(Right(Split(b(ii), "=")(1), 2) & "." & Mid(Split(b(ii), "=")(1), 5, 2) & "." & Left(Split(b(ii), "=")(1), 4))
                          Else
                             Cells(ind, --.Item(t)) = Split(b(ii), "=")(1)
                          End If
                       End If
[/vba]

Автор - DmitriyGen
Дата добавления - 29.03.2015 в 16:02
Hugo Дата: Воскресенье, 29.03.2015, 16:25 | Сообщение № 20
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3252
Репутация: 707 ±
Замечаний: 0% ±

2019
Да, так неплохо. Мне просто OR не нравится как-то, поэтому предлжил select case :)


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеДа, так неплохо. Мне просто OR не нравится как-то, поэтому предлжил select case :)

Автор - Hugo
Дата добавления - 29.03.2015 в 16:25
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Экспорт в текстовый файл и обратная задача (Макросы/Sub)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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