Здравствуйте, уважаемые эксперты! Мне необходимо из двух столбцов в экселевском файле (офис 2016 проф плюс) сформировать массив Markdown файлов (.md), чтоб их мог прочесть Обсидиан (прога для ведения базы заметок). Макрос нашел в теме на форуме - немного скорректировал и он почти подошёл под мою задачу. Затруднение у меня вызвало то, что содержимое файлов в формате ".md" считывается Обсидианом некорректно - в неопределенные символы. Суть: 1. Если переношу созданные макросом фалы в хранилище Обсидиан - он видит файлы, но содержимое воспроизводит нечитаемо. Символы выглядят типа ��� �� �� 31 ������� 2021 �. 2. Если я меняю путь к хранилищу заметок на папку, в которой хранятся созданные макросом файлы ("...\downloads"), то Обсидиан их не видит вовсе. 3. Если открываю созданные макросом файлы и вручную переношу их содержимое в существующие Markdown файлы, то Обсидиан их считывает адекватно.
Подскажите, пожалуйста, как это поправить - сделать так чтобы созданные макросом файлы считывались верно?
P.S. Я пока размышляю о том, чтобы положить в папку пустой, но рабочий маркдаун-файл (образец), а затем для каждой будущей заметки скопировать его, переименовать (именем копируемой заметки) и скопировать в него содержимое созданных макросом файлов....... Но это выглядит громоздко, сомнительно и, полагаю, вы можете посоветовать более изящное решение.
Спасибо, за совет! Надеюсь, это решит мой вопрос. Подскажите, пожалуйста, как принудительно эту кодировку включить через макрос (если это возможно так сделать)?
Спасибо, за ответы. Я попытался обобщить приведенный ранее макрос и предложенную функцию, но, очевидно, я неверно её применяю, т.к. получаю в файле False, вместо текста в UTF-8. Подскажите, пожалуйста, как всё-таки добиться вписывания в конечный файл текста в нужной кодировке? (может пример использования SaveTextToFile(ByVal txt$, ByVal filename$, Optional ByVal encoding$ = windows-1251) )
написал: SERGEJ64 Для того чтобы помочь надо понять, что вы хотите
Коротко - есть файл, в первой колонке - Название заметки, во второй - ее содержание. Нужно на основе этих данных создать файлы .md. У которых название будет = Колонке 1, а содержание файла - колонка 2. UFT-8
SERGEJ64 Там видимо ошибка возникает из - за пути прописанного там, Я с FSO не работал надо справку читать, и файлы md не видел. Добавьте файл md в предыдущее сообщение,
написал: SERGEJ64 Там видимо ошибка возникает из - за пути прописанного там, Я с FSO не работал надо справку читать, и файлы md не видел. Добавьте файл md в предыдущее сообщение,
Путь я менял и даже файлы создавались. Вот один из примеров (кодировка не верная)
SERGEJ64 Этот пример из сообщения 6 наверно был немного под другую задачу. Не могу пока понять. Сначала FSO потом два раза открывают файл в режиме прямого доступа. В принципе с перекодировкой все правильно написано. Функция должна быть рабочая. Я просто не знаю, что такое md файл. Если это текстовый файл с другим расширением, то для вашей задачи надо немного не так.
Sub CreateMarkdown()
Dim Sh As Worksheet, FileName$, folder$, strUnicode$
Set Sh = ThisWorkbook.Worksheets("Лист1")
LastRow = Sh.Cells(Sh.Rows.Count, 2).End(xlUp).Row
folder$ = ThisWorkbook.Path & "\1"
dx = Sh.Range("B1").Resize(LastRow, 2)
With CreateObject("Scripting.FileSystemObject")
If Not .FolderExists(folder$) Then
.CreateFolder folder$
End If
For n = 1 To UBound(dx)
strUnicode$ = dx(n, 2)
FileName$ = dx(n, 1)
If FileName$ <> "" Then
FileName$ = .BuildPath(folder, FileName) & ".md"
Writer_To strUnicode, FileName
End If
Next
End With
End Sub
Sub Writer_To(strUnicode As String, FileName As String)
Const adTypeBinary = 1
Const adTypeText = 2
Dim oFS: Set oFS = CreateObject("Scripting.FileSystemObject")
Dim oTo: Set oTo = CreateObject("ADODB.Stream")
Dim sTo: sTo = "utf-8"
Dim sTFSpec: sTFSpec = oFS.GetAbsolutePathName(FileName)
If oFS.FileExists(sTFSpec) Then oFS.DeleteFile sTFSpec
oTo.Type = adTypeText
oTo.Charset = sTo
oTo.Open
oTo.WriteText strUnicode
oTo.SaveToFile sTFSpec
oTo.Close
Set oFS = Nothing
Set oTo = Nothing
End Sub
' Writer_SkipBOM запись без BOM , выберите нужную процедуру
Sub Writer_SkipBOM(strUnicode As String, FileName As String)
Const adTypeBinary = 1
Const adTypeText = 2
Dim oFS: Set oFS = CreateObject("Scripting.FileSystemObject")
Dim oTo: Set oTo = CreateObject("ADODB.Stream")
Dim sTo: sTo = "utf-8"
Dim sTFSpec: sTFSpec = oFS.GetAbsolutePathName(FileName)
If oFS.FileExists(sTFSpec) Then oFS.DeleteFile sTFSpec
oTo.Type = adTypeText
oTo.Charset = sTo
oTo.Open
oTo.WriteText strUnicode
oTo.Position = 3
Dim BinaryStream As Object
Set BinaryStream = CreateObject("ADODB.Stream")
BinaryStream.Type = 1
BinaryStream.Mode = 3
BinaryStream.Open
oTo.CopyTo BinaryStream
oTo.Flush
oTo.Close
BinaryStream.SaveToFile sTFSpec, 2
BinaryStream.Close
Set oTo = Nothing
Set BinaryStream = Nothing
End Sub