Как я могу экспортировать текстовый файл из листа Excel без пустой строки в конце?

Когда я экспортирую лист в виде txt, в конце появляется пустая строка.
incorrect txt file

То что мне нужно
enter image description here

Я использую этот код для определения используемого диапазона и экспортирую только его. Необходимо, чтобы рабочая книга с копируемыми данными была открыта.

Sub export_range_txt()
    
    Workbooks.Add
    y = ActiveWorkbook.Name
    'insert the name of the workbook were data is been copied and create  this sub there
    Windows("original.xlsm").Activate 
    ActiveSheet.Activate
    LastRow = Cells(Rows.Count, "A").End(xlUp).Row 
    Range("A1:Y" & LastRow).Copy
    Windows(y).Activate
    ActiveSheet.Activate
    Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
    
    Application.DisplayAlerts = False

    'change path to desired location of the txt file
    ActiveWorkbook.SaveAs Filename:= _
      "path\test.txt", FileFormat:=xlText, _
      CreateBackup:=False

    ActiveWindow.Close
    Application.DisplayAlerts = True

End Sub

Не могли бы вы поделиться кодом, который вы использовали для экспорта листа? Вы можете отредактируй свой пост в любое время.

VBasic2008 09.04.2022 08:02

@ VBasic2008 конечно, приношу свои извинения

Arturo0504 09.04.2022 08:31
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Следующая функция экспортирует диапазон в текстовый файл без пустой строки в конце.

Function exportRgToTxt(rg As Range, filename As String)

    ' use a semicolon as a column separator, adjust accordingly or use a parameter
    Const SEPARATOR = ";"

    Dim i As Long, j As Long
    Dim vdat As Variant, vRow As Variant
        
    ' Placing the values of the range into an array
    vdat = rg.Value

    Dim txtFile As Long
    txtFile = FreeFile
    Open filename For Output As txtFile
        
    ' Write each row of the range to the text file but the last one
    For i = LBound(vdat, 1) To UBound(vdat, 1) - 1
        vRow = Application.WorksheetFunction.Index(vdat, i, 0)  ' Get the i-th row of the array
        vRow = Join(vRow, SEPARATOR)
        Print #txtFile, vRow   ' This will add a CRLF at the end of the line
    Next i
    
    ' Write Last row without an CRLF
    vRow = Application.WorksheetFunction.Index(vdat, UBound(vdat, 1), 0)
    vRow = Join(vRow, SEPARATOR)
    Print #txtFile, vRow; ' the semicolon will avoid the CRLF at the end of the file
    Close txtFile

End Function

Имейте в виду, что функция не будет работать, если диапазон содержит только одну ячейку. Его можно было бы подкорректировать, но я оставляю это читателю.

Вот как вы можете проверить это

Sub testit()
    exportRgToTxt Range("A1").CurrentRegion, "D:\tmp\abc.txt"
End Sub

Дальнейшее чтение на Распечатать заявление. В частности, здесь нам нужен параметр чарпос.

чарпос
Определяет точку вставки для следующего символа. Используйте точку с запятой, чтобы поместить точку вставки сразу после последнего отображаемого символа. Используйте Tab(n), чтобы поместить точку вставки на абсолютный номер столбца. Используйте Tab без аргумента, чтобы поместить точку вставки в начало следующей зоны печати. Если charpos опущен, следующий символ печатается на следующей строке..

См. ниже, как можно использовать функцию в коде OP.

Sub export_range_txt()
    
    Workbooks.Add
    y = ActiveWorkbook.Name
    'insert the name of the workbook were data is been copied and create  this sub there
    Windows("original.xlsm").Activate
    ActiveSheet.Activate
    LastRow = Cells(Rows.Count, "A").End(xlUp).Row
    
    
    'Range("A1:Y" & LastRow).Copy  ' this line is not needed any longer
    
    ' Here you could use the exportRgToTxt instead
    exportRgToTxt Range("A1:Y" & LastRow), "<your file name>"
    
    
    ' the remaining code is not neccessary
'    Windows(y).Activate
'    ActiveSheet.Activate
'    Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
'
'
'
'    Application.DisplayAlerts = False
'    ActiveWorkbook.SaveAs Filename:= _
'   'change path to desired location of the txt file
'        "path\test.txt", FileFormat:=xlText, _
'    CreateBackup:=False
'    ActiveWindow.Close
'    Application.DisplayAlerts = True

End Sub

Большое тебе спасибо!! работает как шарм, я пробовал только с одной строкой и одним столбцом, и он также работал отлично, только один последний вопрос, должен ли я отредактировать свой вопрос, чтобы включить ответ? Я новичок в stackoverflow и хочу делать все правильно, чтобы помогать другим, спасибо!

Arturo0504 09.04.2022 10:06

Все хорошо, вы все сделали правильно, отметив ответ

Storax 09.04.2022 10:23

У меня другой вопрос по поводу более сложной интеграции этого кода, в таком виде он работает правильно, но при интеграции с другим выдает следующую ошибку: тип 13 типы не совпадают, следует задать другой вопрос? или просто обновить этот?

Arturo0504 09.04.2022 10:41

он появляется в строке vRow = Join(vRow, SEPARATOR). похоже, что у меня есть столбцы с общим форматом, датой, часом и текстом, так что это влияет на данные массива?

Arturo0504 09.04.2022 10:48

Извините, но я ничего не знаю о вашей "интеграции соответствия". Я предлагаю создать новый пост с соответствующей информацией.

Storax 09.04.2022 10:51

Спасибо, я уже создал сообщение stackoverflow.com/questions/71806957/…, если вы можете его проверить, это было бы здорово.

Arturo0504 09.04.2022 11:54

Другие вопросы по теме