Страницы: 1
RSS
Редактирование текстовых файлов
 
Добрый день. Подскажите пожалуйста, можно ли посредством VBA редактировать ТХТ файлы?  
или же их в любом случае нужно экспортировать в эксель, редактировать и сохранять как ТХТ?  
в общем ситуация такая, нужно обрабатывать файлы ТХТ оборотной ведомости предприятия для спец программки. для этого берется файл, загоняется в эксель удаляются ненужные строки, меняется первая строчка на название специальное и потом сохраняется, и кидается куда нужно. следовательно вопрос ка кэто автоматизировать?  
 
запись макроса редактирования выдает примерно следующее,    
Sub ИмпортТекста()  
'записан как импорт баланса для показателей  
   ChDir "C:\Documents and Settings\Y\Рабочий стол"  
'  
   Workbooks.OpenText Filename:= _  
       "C:\Documents and Settings\Y\Рабочий стол\******.TXT", Origin:= _  
       xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote _  
       , ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False, Comma:=False _  
       , Space:=True, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), Array _  
       (3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array( _  
       10, 1), Array(11, 1), Array(12, 1)), TrailingMinusNumbers:=True  
End Sub  
 
и потом сохраняем.  
собственно вопрос  
1) как можно сделать так, что бы выбирать какие файлы редактировать через диалоговое окно?  
нашел такой код  
Sub Macro2()  
 
 
Dim strPath As String  
Dim fd As FileDialog  
Dim vrtSelectedItem As Variant  
     
   Set fd = Application.FileDialog(msoFileDialogFilePicker)  
 
   With fd  
       .AllowMultiSelect = True  
       .Filters.Clear  
       .Filters.Add "Âàøè ôàéëû", "*.CSV"  
       .Filters.Add "All Files", "*.*"  
         
       If .Show = -1 Then  
           For Each vrtSelectedItem In .SelectedItems  
               strPath = vrtSelectedItem  
           Next vrtSelectedItem  
       End If  
   End With  
     
   Set fd = Nothing  
   
но как его вставить например в предыдущем записанном макросе что бы он был частью единого программного кода?  
2) в файле есть строка "оборотная ведомость бла бла бла..." ниже идет строка    
"с 01/09/2011 по 30/09/2011" как можно использовать вот эти даты в таком ключе;  
раз в примере например по 30/09/2011 мы сохраняем файл с именем 011011  
а в начале файла вставляем строку "оборотная ведомость на 1 октября 2011г.(ну или на 01.10.2011)"  
 
приветсвуются любые советы, решения, любые подсказки и ссылки на любые ресурсы где обсуждалось, или приводились примеры подобных ситуаци и редактировение ТХТ вообще.  
Спасибо за уделенное внимание!
 
ну, если у вас форматированный текст, то лучше да, открывать его в иксель..  
 
как вставить? да так и вставляйте копипастом.. (только без заголовка и окончания)  
 
а можно с заголовком, тогда в первом макросе строку вызова - просто имя второго макроса  
 
есть конечно тонкости, но о них на конкретных примерах( ваших)
Живи и дай жить..
 
Можно сделать без загрузки на лист, только кодом.  
Можно и без Экселя, скриптом vbs.  
Принцип такой - читаем текстовый файл, анализируем строки, пишем нужное/изменённое в другой файл вместо исходного.  
Но чтоб сделать - мало данных.  
Но примеры тут были, я точно делал.  
Поищите по ReadAll например.
 
Загрузка текстового файла на лист Excel  
http://excelvba.ru/code/CSV2Excel  
 
Всё остальное тоже можно найти у меня на сайте.  
Например, здесь: http://excelvba.ru/code/text_files
 
собственно образец, но сильно подредактированный.
 
Ужасный образец...  
Это самая неудобная для обработки таблица, какая только может быть в текстовом формате.  
 
И что, вам надо подредактировать данные, и сохранить файл в том же, в текстовом, виде?  
 
Или результат (файл TXT) будет иметь не такую ужасную структуру?
 
Аноним,  
 
Может стоит улучшить выгрузку из первоисточника? А не пытаться приспособить отчет, для загрузки данных.
Спасибо
 
R Dmitry  
тут сложно сказать, под меня явно никто ничего подгонять не будет, есть стандартаня форма, она и есть стандартная, скорее правильно сказать что можно было бы мне улучшить работу с балансом, и не пользоваться той программой которая требудет данной переработки файла, НО пока у меня нет альтернативы, хотя искать я ее безусловно буду. Понятно что мне было бы удобнее подгружать данные в тот же МС Акцесс, и обрабатывать бы было их намного удобнее тогда, но боюсь пока эту сложную штуку мне не освоить. Хотя если есть что-то почитать про это для чайников буду весьма признателен.  
2 EducatedFool  
фактически сами данные редактировать не надо, нужно лишь изменить шапку и кодировку файла.(хотя на счет кодировки непонятный момент)  
и так я делаю следующее вручную, беру такие файлы, открываю, через мс эксель, ставлю разделители пробелы. далее удаляю все что сверху до слов    
А. Балансовые счета.(и пустой столбик слева удаляю, который образуется, хотя возможно этот столбик издержка моего способа)  
в начале файла пишу   "Оборотная ведомость по счетам бухгалтерского учета кредитной организации за октябрь 2011г."  
и все, сохраняю сделанные изменения.  
ах да, при открытие через эксель меняю кодировку на MS DOS PC-8  
 
получаю такое :
 
Да в общем несложно, работает такой несложный скрипт vbs:  
 
Option Explicit  
 
' FSO Constants  
   Const ForReading = 1  
   Const ForWriting = 2  
   Const TristateUseDefault = -2  
 
   ' Variables  
   Dim objFSO, objTS, objFile, a, nn  
 
   ' Instantiate the object  
   Set objFSO = CreateObject("Scripting.FileSystemObject")  
 
   ' open the text file read only  
   Set objTS = objFSO.OpenTextFile("C:\tmp\Baot\post_278093.TXT", ForReading, False, TristateUseDefault)  
 
   a = Split(objTS.ReadAll(), vbNewLine)  
   objTS.Close  
a(0) = "ОБОРОТНАЯ ВЕДОМОСТЬ НА " & Mid(a(11), 27, 10)  
nn = Replace(CStr(CDate(Mid(a(11), 41, 10)) + 1), ".", "")  
 
Set objFile = objFSO.CreateTextFile("C:\tmp\Baot\" & nn & ".txt")  
objFile.Close  
Set objFile = objFSO.OpenTextFile("C:\tmp\Baot\" & nn & ".txt", ForWriting)  
objFile.Write Join(a, vbNewLine)  
 
 
 
 
Анониму придумал имя Baot - от Банковская отчётность :)  
Только вот вопрос с кодировкой не решал - там фраза "ОБОРОТНАЯ ВЕДОМОСТЬ НА" пишется в другой кодировке.  
Ну и лень было имя файла Мидами корёжить - пока сохраняет как 01112011.txt
 
Hugo  
спасибо за код  
с VBS не сталкивался попробую разобраться.  
вопрос а можно сделать так что бы он удалял все что остается между добавленной строкой оборотная ведомть на  
и А. Балансовые счета,  
второй вопрос код выставляет оборотная ведомость на 01.10.2011 а сохраняет с именем 01.11.2011... то есть выходит сохраняет правильно а в строке ставит не тот месяц.
 
Да, с датой промахнулся (всё эти единицы, подслеповат стал наверное :) ) - думал, что Вам срок нужно следующим днём после отчёта выставить, т.е после 31/10/2011  
Это правится тут:  
nn = Replace(CStr(CDate(Mid(a(11), 41, 10)) + 1), ".", "")  
Берёте другую позицию строки в Mid() (с начальной датой, а не конечной) и не надо прибавлять день.  
Удалять тоже можно - тогда нужно правда код сильно изменить:  
1. не правим в этом массиве, а создаём для выгрузки другой.  
2а или создаём сразу под нужный размер (как-то высчитываем),    
2б или через Redim Preserve на каждой нужной строке увеличиваем созданный нулевой,    
2в или создаём пустой размером с исходный, а пишем в файл только заполненную часть  
3 т.е. выгрузку тоже нужно переделать исходя из п.2.  
 
Ну и вообще нужно посидеть, покрутить, ещё и кодировка... Некогда сейчас.
 
Да, и если не надо прибавлять день, то и в дату строку переводить не нужно (а потом назад в строку :) )
 
Hugo  
спасибо)  
попробую подразобраться с датой и скормить в виде такой таблицы файл,хотя уж очень там требовательная программа к виду файла)
 
Заготовка для работы с кодировкой - выводит перекодированную строку из текста-примера.  
Используется  
Library «OLEPRNLib» (%systemroot%\system32\oleprn.dll).  
 
это в vbs:  
 
Option Explicit  
 
' FSO Constants  
   Const ForReading = 1  
   Const ForWriting = 2  
   Const TristateUseDefault = -2  
 
   ' Variables  
   Dim objFSO, objTS, a  
 
   ' Instantiate the object  
   Set objFSO = CreateObject("Scripting.FileSystemObject")  
 
   ' open the text file read only  
   Set objTS = objFSO.OpenTextFile("C:\tmp\Baot\post_278093.TXT", ForReading, False, TristateUseDefault)  
 
   a = Split(objTS.ReadAll(), vbNewLine)  
   objTS.Close  
 
Dim objOleCvt  
Set objOleCvt = WScript.CreateObject("OlePrn.OleCvt.1")  
 
With objOleCvt  
   ' 866 - cp866  
   MsgBox Trim(.ToUnicode(a(30), 866))  
     
End With  
 
Set objOleCvt = Nothing
 
хорошо, возвращаясь к VBA например.  
 
получили такое:  
Sub ImportTXT()  
'создаем меню выбора файла  
Dim strPath As String  
Dim fd As FileDialog  
Dim vrtSelectedItem As Variant  
     
   Set fd = Application.FileDialog(msoFileDialogFilePicker)  
 
   With fd  
       .AllowMultiSelect = False  
       .Filters.Clear  
       .Filters.Add "Текстовые файлы", "*.txt"  
       .Filters.Add "All Files", "*.*"  
         
       If .Show = -1 Then  
           For Each vrtSelectedItem In .SelectedItems  
               strPath = vrtSelectedItem  
           Next vrtSelectedItem  
       End If  
   End With  
       Set fd = Nothing  
'редактируем файл и сохраням  
   Workbooks.OpenText Filename:=strPath, Origin:=xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _  
       xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False, _  
       Comma:=False, Space:=True, Other:=False, FieldInfo:=Array(Array(1, 1), _  
       Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), _  
       Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1)), TrailingMinusNumbers:=True  
   Rows("1:30").Select  
   Range("A30").Activate  
   Selection.Delete Shift:=xlUp  
   Columns("A:A").Select  
   Selection.Delete Shift:=xlToLeft  
   Range("A1").Select  
   ActiveCell.FormulaR1C1 = _  
       "Оборотная ведомость по счетам бухгалтерского учета за октябрь 2011г."  
   Range("A2").Select  
   ActiveWorkbook.SaveAs Filename:= _  
       "С:\011111.TXT" _  
       , FileFormat:=xlText, CreateBackup:=False  
   ActiveWorkbook.Close  
End Sub  
 
вот получается такая штука, вопрос соответственно в том как  
1) сделать даты меняющимися то есть, в тексте после за(* тут я соврал когда писал что нужно НА, прошу прощения) "октябрь 2011" ставилось исходя из дат в исходном файле  
2) то же и по дате, но уже НА дату, то есть на 011111 (много хочу наверно =) )  
3) когда книга закрывается спрашивает сохранять или нет, как сделать автоматически нет, или не спрашивать?  
4)и уже не критичный вопрос еще в том, если поставить MultiSelect True? то нужно ли менять код, для обработки нескольких файлов?
 
пока строчил мне уже ответили, попробую пееркодировку на вбс)
 
3) application.displayalerts=false  
в конце верните назад.  
 
4)Если MultiSelect True, то код нужно менять - в цикл  
 
For Each vrtSelectedItem In .SelectedItems  
strPath = vrtSelectedItem  
Next vrtSelectedItem  
End If  
 
нужно перенести всю обработку выбранного файла.
 
Hugo  
спасибо большое за помощь, но все таки про цикл не понял.  
вообщем методом проб и ошибок получаем такой код, который делает то что нужно, правда с одним файлом, а как с несколкью?  
 
Sub ImportTXT()  
'äèàëîã âûáîðà ôàéëà  
   Dim strPath As String  
Dim fd As FileDialog  
Dim vrtSelectedItem As Variant  
Dim MyDate As Date  
   Set fd = Application.FileDialog(msoFileDialogFilePicker)  
 
   With fd  
       .AllowMultiSelect = True  
       .Filters.Clear  
       .Filters.Add "Òåêñòîâûå ôàéëû", "*.txt"  
       .Filters.Add "All Files", "*.*"  
         
       If .Show = -1 Then  
           For Each vrtSelectedItem In .SelectedItems  
               strPath = vrtSelectedItem  
           Next vrtSelectedItem  
       End If  
   End With  
       Set fd = Nothing  
'ðåäàêòèðóåì âûáðàííûé ôàéë ïðè ïîìîùè çàïèñè äåéñòâèé ïðè ðåäàêòèðîâàíèè âðó÷íóþ  
   Workbooks.OpenText Filename:=strPath, Origin:=xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _  
       xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False, _  
       Comma:=False, Space:=True, Other:=False, FieldInfo:=Array(Array(1, 1), _  
       Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), _  
       Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1)), TrailingMinusNumbers:=True  
       MyDate = Range("E12")  
   Rows("1:30").Select  
   Range("A30").Activate  
   Selection.Delete Shift:=xlUp  
   Columns("A:A").Select  
   Selection.Delete Shift:=xlToLeft  
   Range("A1").Select  
   ActiveCell.FormulaR1C1 = _  
       "Îáîðîòíàÿ âåäîìîñòü ïî ñ÷åòàì áóõãàëòåðñêîãî ó÷åòà êðåäèòíîé îðãàíèçàöèè çà " & Format(MyDate, "mmmm yyyy")  
   Range("A2").Select  
   ActiveWorkbook.SaveAs Filename:=Format(MyDate + 1, "ddmmyy"), FileFormat:=xlText, CreateBackup:=False  
   ActiveWorkbook.Close SaveChanges = False  
End Sub
 
Ой прошу прощения, дошло как в цикл запустить.  
 
Sub ImportTXT()  
'Создаем меню выбора файла  
   Dim strPath As String  
Dim fd As FileDialog  
Dim vrtSelectedItem As Variant  
Dim MyDate As Date  
   Set fd = Application.FileDialog(msoFileDialogFilePicker)  
 
   With fd  
       .AllowMultiSelect = True  
       .Filters.Clear  
       .Filters.Add "Текстовые файлы", "*.txt"  
       .Filters.Add "All Files", "*.*"  
         
       If .Show = -1 Then  
           For Each vrtSelectedItem In .SelectedItems  
               strPath = vrtSelectedItem  
'редактируем выбранный файл  
   Workbooks.OpenText Filename:=strPath, Origin:=xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _  
       xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False, _  
       Comma:=False, Space:=True, Other:=False, FieldInfo:=Array(Array(1, 1), _  
       Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), _  
       Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1)), TrailingMinusNumbers:=True  
       MyDate = Range("E12")  
   Rows("1:30").Select  
   Range("A30").Activate  
   Selection.Delete Shift:=xlUp  
   Columns("A:A").Select  
   Selection.Delete Shift:=xlToLeft  
   Range("A1").Select  
   ActiveCell.FormulaR1C1 = _  
       "Оборотная ведомость по счетам бухгалтерского учета за " & Format(MyDate, "mmmm yyyy")  
   ActiveWorkbook.SaveAs Filename:=Format(MyDate + 1, "ddmmyy"), FileFormat:=xlText, CreateBackup:=False  
   ActiveWorkbook.Close SaveChanges = False  
           Next vrtSelectedItem  
       End If  
   End With  
       Set fd = Nothing  
End Sub
Страницы: 1
Читают тему
Наверх