Это не очень хороший вопрос. Хороший вопрос, вероятно, был бы получен в течение нескольких минут.
Вы можете предположить, что любой, кто посещает страницу Excel-VBA Stack Overflow с намерением ответить на вопросы, знаком с Excel VBA. Вы не должны предполагать, что они знакомы с чем-либо еще. Вы предполагаете, что потенциальный ответчик знаком со словом «тикер» и знает параметры загрузки Yahoo.
Ваше название: «CSV-текст, загружающий все в одну строку вместо новых строк». Вы говорите: «По какой-то причине CSV-файл загружается в той же строке, что и предполагалось, чтобы начать новую строку для повседневной работы в истории цен на акции». На самом деле название и заявление не соответствуют действительности.
Запустив код и посмотрев на сохраненный файл, проблема очевидна. Возможно, если бы я подумал о вашем желании использовать оператор Input #, я бы сразу догадался о причине.
Некоторые функции Windows возвращаются к дням MS-DOS. В частности, NotePad и Input # работают только с текстовыми файлами в стиле MS-DOS. В те дни устройства вывода работали как пишущие машинки: CR означало возврат к началу текущей строки, а LF означало продвижение на одну строку. Все текстовые файлы использовали CRLF (возврат каретки, а затем Line feed) в качестве разделителя строк, потому что это означало, что они могут выводиться непосредственно на принтеры, пульты и т. Д.
Большинство частей Windows по-прежнему используют CRLF в качестве разделителя строк по умолчанию, но будет принять LF, который является стандартом везде. NotePad и Input # нет.
Если вы открыли загруженный файл текстовым редактором, который принимает LF в качестве разделителя, вы бы увидели, что детали для каждого дня находятся в отдельной строке. Возможно, вы и не знали, почему, но вы не задали бы такой вводящий в заблуждение вопрос.
Что вы должны сделать?
Выбор 1
Добавить что-то вроде этого в рутину:
Dim InxLine As Long
Dim Line() As String
Line = Split(http.responseText, vbLf)
For InxLine = 0 To UBound(Line)
Debug.Print Line(InxLine)
Next
Этот код просто выходной каждую строку в окне Immediate. Вам нужно будет заменить Debug.Print Line(InxLine)
на соответствующий код для обработки строк.
Выбор 2
Если вы хотите сохранить файл CSV, вы можете сохранить существующую рутина без изменений и добавить что-то вроде этого:
Sub TestOpen()
Dim WbkThis As Workbook
Set WbkThis = ThisWorkbook
Workbooks.Open ("C:\Users\Tony\Desktop\goog.csv")
' goog.csv is now the active workbook which have a single worksheet named "goog"
Sheets("goog").Move After:=WbkThis.Sheets(WbkThis.Worksheets.Count)
' because the only sheet within workbook goog.csv has been removed, the workbook is
' automatically closed.
End Sub
Я скачал файл размером CSV для Google, чтобы мой рабочий стол. Этот макрос открывает этот CSV-файл в качестве рабочей книги и перемещает рабочий лист, содержащий данные, в книгу, содержащую макрос. Рабочий лист «goog» готов к обработке по мере необходимости.
Choice 3
Если это действительно важно, чтобы процедура создания файла, который использует CRLF в качестве терминатора строки:
Добавьте следующий к существующей процедуре после загрузки и перед записью в диск:
Dim FileText As String
FileText = Replace(http.responseText, vbLf, vbCr & vbLf)
Заменить:
ostream.Type = 1
ostream.Write http.responseBody
по:
ostream.Type = 2
ostream.Writetext FileText
Это даст файл, NotePad и другие древние программы могут разделить на линии.
Тони, я полностью согласен с тем, что вы упомянули. Оглядываясь назад, я должен был быть более явным. Я искренне благодарю вас за вашу помощь, и я буду помнить об этом в следующий раз. Re, ваш вариант кода 1: инструкция debug.print работает, и, как вы говорите, мне нужно поместить соответствующую строку для обработки строк. Единственный способ, которым я знаю, - использовать открытый файл для метода append; есть способ сделать это, не открывая/закрывая файл, который, очевидно, еще не был сохранен. Я предполагаю, что в основном эти строки должны быть добавлены в файл «в пути». Еще раз, спасибо заранее. – bp123
@ bp123 Я не понимаю. Вы можете создать новый текстовый файл или перезаписать существующий, если вы не хотите добавлять его. Моя проблема: какой файл? Возможно, если бы вы сказали мне свою цель, я мог бы предложить подход. –
Моя цель - загрузить новый файл csv, и код, который я написал выше, делает это, за исключением crlf. Я пытаюсь найти способ сделать это, так как каждый файл сохраняется кодом (сразу несколько файлов). Конечный результат, который я ищу, - это, по сути, загруженный файл csv, который может использоваться другим программным обеспечением с форматированием, которое отображает каждую строку на новой строке - если это имеет смысл. Как и предполагалось, прямо сейчас, когда файл сохраняется и открывается в текстовом редакторе, все это одна строка. – bp123