Гуру, вновь нужна ваша помощь)) Задача проста - макросом делаю 5 столбцов данных и надо их сохранить в txt файл для загрузки в спец. софт. Можно и руками, конечно, но больно уж хочется красоту навести) Из рабочих у меня пока только такой вариант:
Наверное, этот код делает вам больно))) Хотя если добавить строку сохранения в *.xlsm то все будет, в принципе, хорошо) Пытался еще вот так, по найденному в гугле способу, но не получилось адаптировать под свои нужды:
Код
Set ra = Range("I1:M" & Cells(Rows.Count, 10).End(xlUp).Row) '.Resize(, 11)
arr = ra.Value
Open ActiveWorkbook.Path & "\test.txt" For Output As 1
Write #1, arr
Close #1
Open "c:\1.txt" For Output As #1
For i = LBound(arr) To UBound(arr)
For j = 1 To 5
Print #1, arr(i, j)
Next j
Next i
Close #1
Имеет) Должен выглядеть так же, как если бы эти ячейки в 5 столбцах были бы выделены, копированы и вставлены в пустой тхт. Собственно, рабочий вариант это и делает)
Должен выглядеть так же, как если бы эти ячейки в 5 столбцах были бы выделены, копированы и вставлены в пустой тхт
То есть вам нужен типа CSV с текстом без кавычек и с табом-разделителем? Можно пример исходных данных? И образец правильных данных (в текстовом виде) для этого вашего "спецсофта". А то я всё никак не соберусь доделать экспорт в CSV, хоть будет на ком потренироваться
AndreTM к сожалению, я сейчас не располагаю примером, будет только завтра) Но все верно - разделитель таб. про csv ничего сказать не могу, прога хавает либо .dat либо .txt, это гидродинамический симулятор, они все хавают подобные форматы. Заполните 5 столбцов любым содержанием, сохраните как тхт файл или копируйте все 5 столбцов - получите нужный мне тхт) Спасибо за ссылку, завтра проведу тесты со своими файлами.
Совсем забыл сказать - кавычек у меня там нет, разделитель целой и дробной части - точка. Мои файлы, наверное, не очень интересны вам для эксперимента т.к. просты аки 3 копейки))
CSV - это так, для обозначения вида вывода. Текст - он и в Африке текст. А расширение вы можете задать любое, если укажете имя выходного файла. В целом же, думаю, процедура вам подойдёт. Единственное - если в столбцах есть "дата-время", то надо бы провести предварительное преобразование в текст нужного формата. Поэтому я и спрашивал про пример реальных данных. Если что - пишите в ЛС здесь или там...
AndreTM что-то не очень корректно работает ваш код, к сожалению(( прикрепляю ваш файл с фрагментом данных, которые мне надо сохранить в тхт и прикрепляю тот тхт, который нужно мне получить. Ваш макрос по сути делает то же, что и мой - мой, правда, поступающую дату никак не обрабатывает)) Я думал, мб есть какой-то хитрющий способ записи целого например столбца в тхт, мб прям одной командой...Видимо, нет)
Sub Test()
' Заменяем даты их символьным представлением
r = 1
While Len(Cells(r, 1)) Or Len(Cells(r + 1, 1))
Cells(r, 1).Value = CStr(Cells(r, 1).Value)
r = r + 1
Wend
' Удаляем лишние строки
r2 = Sheets("Пример").UsedRange.Rows.Count
If r2 > r Then Cells(r, 1).Resize(r2 - r1 + 1).EntireRow.Delete
' Экспортируем: разделитель - табуляция, заголовка - нет
ExportSheet2CSV cFileName:=("Пример.txt"), cDelimiter:=vbTab, vCutHeader:=0
End Sub
Можно поступить проще - использовать одну готовую процедуру под нужный вам вид (предварительно даты можно не конвертировать - поменяются в ней):
Код
Sub Export2txt()
cOutAll = ""
nLastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
nLastCol = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1
For i = 1 To nLastRow
cOut = ""
For j = 1 To nLastCol
cOut = cOut & vbTab & CStr(Cells(i, j))
Next
cOutAll = cOutAll & Mid(cOut, 2) & vbCrLf
Next
On Error Resume Next: Err.Clear
Dim fso As Object, ts As Object
Set fso = CreateObject("scripting.filesystemobject")
Set ts = fso.CreateTextFile(ActiveWorkbook.Path & "\" & "Test.txt", True)
ts.Write cOutAll: ts.Close
Set ts = Nothing: Set fso = Nothing
End Sub
я, все-таки, поступил более проще и надежнее - но только для моего случая:
Код
Private Sub Copy_to_file_Click()
Application.ScreenUpdating = False
Range("I1:M" & Cells(Rows.Count, 10).End(xlUp).Row).Copy
copy_to_txt Filename:=(ActiveSheet.Name + "123.txt")
Application.ScreenUpdating = True
End Sub
Public Sub copy_to_txt(ByVal Filename As String)
Dim NewWB As Workbook
Set NewWB = Workbooks.Add
ActiveSheet.Paste
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & Filename, FileFormat:=xlText, CreateBackup:=False, Local:=True
Application.DisplayAlerts = True
NewWB.Close SaveChanges:=False
End Sub
Но вам огромное спасибо за помощь, узнал пару приемов и все такое) Вообще, меня интересовала как бы "технология" записи в тхт. Получается, что кроме
Вот эта программа работает на перенос с Excel в блокнот строк и столбцов скопировать строку в excel и вставить в txt через visual basic
Function Export2txt(fn As String, Rg As Range) cOutAll = ""
nLastRow = Rg.Rows.Count nLastCol = Rg.Columns.Count For i = 1 To nLastRow cOut = "" For j = 1 To nLastCol cOut = cOut & vbTab & CStr(Rg.Cells(i, j)) Next cOutAll = cOutAll & Mid(cOut, 2) & vbCrLf Next
On Error Resume Next: Err.Clear Dim fso As Object, ts As Object Set fso = CreateObject("scripting.filesystemobject") Set ts = fso.OpenTextFile(fn, 8, True)
ts.Write (cOutAll) ts.Close Set ts = Nothing Set fso = Nothing Return
End Function
Sub Ìàêðîñ1() ' ' Ìàêðîñ1 Ìàêðîñ '
'
Dim rg1 As Range, res, a As String a = CStr("D:\" & Worksheets("Exp").Cells(1, 1).Value) Set rg1 = Worksheets("Exp").Range(Worksheets("Exp").Cells(6, 4), Worksheets("Exp").Cells(10, 5))