Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/При сохранении Uniсod теряются символы - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
При сохранении Uniсod теряются символы
Паштет Дата: Четверг, 20.03.2025, 16:51 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 176
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
В экселе формирую код для 3D модели, которая, должна быть сохранена в дальнейшем в Unicod.
Но открывая сохраненный файл, обнаруживаю, что первых ~60 символов просто нет. Причем, судя по экспериментам, именно эта длина пропадает.
Почему так происходит и что с этим можно сделать?

П.С. при запуске макроса, формируются файлы на каждую пару километров.
К сообщению приложен файл: stolby.xlsm (32.7 Kb)


Сообщение отредактировал Паштет - Четверг, 20.03.2025, 16:52
 
Ответить
СообщениеВ экселе формирую код для 3D модели, которая, должна быть сохранена в дальнейшем в Unicod.
Но открывая сохраненный файл, обнаруживаю, что первых ~60 символов просто нет. Причем, судя по экспериментам, именно эта длина пропадает.
Почему так происходит и что с этим можно сделать?

П.С. при запуске макроса, формируются файлы на каждую пару километров.

Автор - Паштет
Дата добавления - 20.03.2025 в 16:51
Паштет Дата: Пятница, 21.03.2025, 08:34 | Сообщение № 2
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 176
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Дополнительно поясню:
в 14 строке в вариантного столбца в ячейке собираю текст кода модели с помощью СЦЕПИТЬ. В ячейке текст отображается правильно. Далее с помощью нижеуказанного макроса сохраняю его в виде текстового файла с раcширением *.s в Unicode, но при открытии полученного файла блокнотом, нет первых ~60 символов. Я сейчас ради эксперимента добавил их в ячейку повтором и итоговый файл стал верным, но интересно почему так происходит.
[vba]
Код
Private Sub Start_Click()
Dim razmin, razmax, v As Byte, a, b As Long
Dim FileTxt, FullFileName As String, F As Integer

a = minkm.Value
b = maxkm.Value

razmin = Len(a)
razmax = Len(b)

For i = a To b - 1

'... пропущен кусок кода обработки вводных данных

100:
''' Формирование наименования файла и Запись данных в текстовый файл
  FileTxt = i & "-" & i + 1 & "km" & ".s"
  FullFileName = ThisWorkbook.Path & Application.PathSeparator & FileTxt
  ''' Стандартный способ записи текстового файла в VBA.
  F = FreeFile
  Open FullFileName For Output As #F: Print #1, Replace$(Cells(14, v).Value, vbLf, vbCrLf, vbUnicode): Close #F
Next i
Unload Me
End Sub
[/vba]
В итоговом файле не хватает следующего куска:
Код
SIMISA@@@@@@@@@@JINX0s1t______

shape (
shape_header ( 0000000
 
Ответить
СообщениеДополнительно поясню:
в 14 строке в вариантного столбца в ячейке собираю текст кода модели с помощью СЦЕПИТЬ. В ячейке текст отображается правильно. Далее с помощью нижеуказанного макроса сохраняю его в виде текстового файла с раcширением *.s в Unicode, но при открытии полученного файла блокнотом, нет первых ~60 символов. Я сейчас ради эксперимента добавил их в ячейку повтором и итоговый файл стал верным, но интересно почему так происходит.
[vba]
Код
Private Sub Start_Click()
Dim razmin, razmax, v As Byte, a, b As Long
Dim FileTxt, FullFileName As String, F As Integer

a = minkm.Value
b = maxkm.Value

razmin = Len(a)
razmax = Len(b)

For i = a To b - 1

'... пропущен кусок кода обработки вводных данных

100:
''' Формирование наименования файла и Запись данных в текстовый файл
  FileTxt = i & "-" & i + 1 & "km" & ".s"
  FullFileName = ThisWorkbook.Path & Application.PathSeparator & FileTxt
  ''' Стандартный способ записи текстового файла в VBA.
  F = FreeFile
  Open FullFileName For Output As #F: Print #1, Replace$(Cells(14, v).Value, vbLf, vbCrLf, vbUnicode): Close #F
Next i
Unload Me
End Sub
[/vba]
В итоговом файле не хватает следующего куска:
Код
SIMISA@@@@@@@@@@JINX0s1t______

shape (
shape_header ( 0000000

Автор - Паштет
Дата добавления - 21.03.2025 в 08:34
Pelena Дата: Пятница, 21.03.2025, 08:52 | Сообщение № 3
Группа: Админы
Ранг: Местный житель
Сообщений: 19475
Репутация: 4590 ±
Замечаний: ±

Excel 365 & Mac Excel
Насколько я помню в функции Replace четвертый аргумент - это начальная позиция для поиска. У вас это константа vbUnicode = 64. Вот эти 64 символа и отсекаются
Может, этот аргумент не нужен?
[vba]
Код
Replace(Cells(14, v).Value, vbLf, vbCrLf)
[/vba]


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеНасколько я помню в функции Replace четвертый аргумент - это начальная позиция для поиска. У вас это константа vbUnicode = 64. Вот эти 64 символа и отсекаются
Может, этот аргумент не нужен?
[vba]
Код
Replace(Cells(14, v).Value, vbLf, vbCrLf)
[/vba]

Автор - Pelena
Дата добавления - 21.03.2025 в 08:52
Паштет Дата: Пятница, 21.03.2025, 09:28 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 176
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Pelena, да, вы правы.
Теперь надо подумать, чем заменить Replace.
Брал этот кусок как готовое решение для сохранение текстового файла, но vbUnicod сам уже подставил, где-то подсмотрев. С данным аргументом сохранение верное в Unicode, а без него формируется ANSI.
 
Ответить
СообщениеPelena, да, вы правы.
Теперь надо подумать, чем заменить Replace.
Брал этот кусок как готовое решение для сохранение текстового файла, но vbUnicod сам уже подставил, где-то подсмотрев. С данным аргументом сохранение верное в Unicode, а без него формируется ANSI.

Автор - Паштет
Дата добавления - 21.03.2025 в 09:28
Pelena Дата: Пятница, 21.03.2025, 09:31 | Сообщение № 5
Группа: Админы
Ранг: Местный житель
Сообщений: 19475
Репутация: 4590 ±
Замечаний: ±

Excel 365 & Mac Excel
Тогда может так
[vba]
Код
Replace(Cells(14, v).Value, vbLf, vbCrLf, , , vbUnicode)
[/vba]
Не проверяла


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеТогда может так
[vba]
Код
Replace(Cells(14, v).Value, vbLf, vbCrLf, , , vbUnicode)
[/vba]
Не проверяла

Автор - Pelena
Дата добавления - 21.03.2025 в 09:31
Паштет Дата: Пятница, 21.03.2025, 09:42 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 176
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Да, вы как всегда на высоте. Заработало как надо. Спасибо!
 
Ответить
СообщениеДа, вы как всегда на высоте. Заработало как надо. Спасибо!

Автор - Паштет
Дата добавления - 21.03.2025 в 09:42
Паштет Дата: Воскресенье, 23.03.2025, 22:04 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 176
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
При дальнейшей работе, оказалось, что файл должен быть не UTF-8, а UTF-16. Как тут быть?
 
Ответить
СообщениеПри дальнейшей работе, оказалось, что файл должен быть не UTF-8, а UTF-16. Как тут быть?

Автор - Паштет
Дата добавления - 23.03.2025 в 22:04
doober Дата: Воскресенье, 23.03.2025, 23:32 | Сообщение № 8
Группа: Друзья
Ранг: Ветеран
Сообщений: 993
Репутация: 345 ±
Замечаний: 0% ±

Excel 2010
Вот так.[vba]
Код
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 sTFSpec: sTFSpec = oFS.GetAbsolutePathName(FileName)
    If oFS.FileExists(sTFSpec) Then oFS.DeleteFile sTFSpec
    oTo.Type = adTypeText
    oTo.Charset = "utf-16"
    oTo.Open
    oTo.WriteText strUnicode
    oTo.SaveToFile sTFSpec
    oTo.Close
    Set oFS = Nothing
    Set oTo = Nothing
End Sub
[/vba]




Сообщение отредактировал doober - Воскресенье, 23.03.2025, 23:32
 
Ответить
СообщениеВот так.[vba]
Код
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 sTFSpec: sTFSpec = oFS.GetAbsolutePathName(FileName)
    If oFS.FileExists(sTFSpec) Then oFS.DeleteFile sTFSpec
    oTo.Type = adTypeText
    oTo.Charset = "utf-16"
    oTo.Open
    oTo.WriteText strUnicode
    oTo.SaveToFile sTFSpec
    oTo.Close
    Set oFS = Nothing
    Set oTo = Nothing
End Sub
[/vba]

Автор - doober
Дата добавления - 23.03.2025 в 23:32
cmivadwot Дата: Понедельник, 24.03.2025, 00:03 | Сообщение № 9
Группа: Проверенные
Ранг: Ветеран
Сообщений: 599
Репутация: 115 ±
Замечаний: 0% ±

365
Паштет, вариант..
К сообщению приложен файл: stolby_1.xlsm (35.8 Kb)
 
Ответить
СообщениеПаштет, вариант..

Автор - cmivadwot
Дата добавления - 24.03.2025 в 00:03
Паштет Дата: Понедельник, 24.03.2025, 20:53 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 176
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Спасибо большое. Работает.
cmivadwot, очень творчески подошли к проблеме ))) Некоторые предложенные вещи обязательно использую в своем проекте, и работает вроде шустрее, чем у меня.


Сообщение отредактировал Паштет - Понедельник, 24.03.2025, 20:54
 
Ответить
СообщениеСпасибо большое. Работает.
cmivadwot, очень творчески подошли к проблеме ))) Некоторые предложенные вещи обязательно использую в своем проекте, и работает вроде шустрее, чем у меня.

Автор - Паштет
Дата добавления - 24.03.2025 в 20:53
Паштет Дата: Пятница, 28.03.2025, 14:13 | Сообщение № 11
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 176
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Для уменьшения объема файла требуется теперь перевести его в двоичный код. Дописал последние три строчки, но что-то эффекта я не увидел:
[vba]
Код
Function savebin()
Dim strUnicode, fileName, FullFileName, content As String, fileNo As Integer, testVar As Integer

strUnicode = Replace$(Cells(14, v), vbLf, vbCrLf)
fileName = ii & "-" & Y & "km" & ".s"
FullFileName = ThisWorkbook.Path & Application.PathSeparator & fileName

Const adTypeBinary = 1
Const adTypeText = 2
Dim oFS: Set oFS = CreateObject("Scripting.FileSystemObject")
Dim oTo: Set oTo = CreateObject("ADODB.Stream")
Dim sTFSpec: sTFSpec = oFS.GetAbsolutePathName(FullFileName)
If oFS.FileExists(sTFSpec) Then oFS.DeleteFile sTFSpec
oTo.Type = adTypeText
oTo.Charset = "utf-16"
oTo.Open
oTo.WriteText strUnicode
oTo.SaveToFile sTFSpec
oTo.Close
Set oFS = Nothing
Set oTo = Nothing

fileNo = FreeFile
Open FullFileName For Binary Lock Read Write As #fileNo
Close #fileNo

End Function
[/vba]


Сообщение отредактировал Паштет - Пятница, 28.03.2025, 14:13
 
Ответить
СообщениеДля уменьшения объема файла требуется теперь перевести его в двоичный код. Дописал последние три строчки, но что-то эффекта я не увидел:
[vba]
Код
Function savebin()
Dim strUnicode, fileName, FullFileName, content As String, fileNo As Integer, testVar As Integer

strUnicode = Replace$(Cells(14, v), vbLf, vbCrLf)
fileName = ii & "-" & Y & "km" & ".s"
FullFileName = ThisWorkbook.Path & Application.PathSeparator & fileName

Const adTypeBinary = 1
Const adTypeText = 2
Dim oFS: Set oFS = CreateObject("Scripting.FileSystemObject")
Dim oTo: Set oTo = CreateObject("ADODB.Stream")
Dim sTFSpec: sTFSpec = oFS.GetAbsolutePathName(FullFileName)
If oFS.FileExists(sTFSpec) Then oFS.DeleteFile sTFSpec
oTo.Type = adTypeText
oTo.Charset = "utf-16"
oTo.Open
oTo.WriteText strUnicode
oTo.SaveToFile sTFSpec
oTo.Close
Set oFS = Nothing
Set oTo = Nothing

fileNo = FreeFile
Open FullFileName For Binary Lock Read Write As #fileNo
Close #fileNo

End Function
[/vba]

Автор - Паштет
Дата добавления - 28.03.2025 в 14:13
Апострофф Дата: Пятница, 28.03.2025, 15:13 | Сообщение № 12
Группа: Проверенные
Ранг: Обитатель
Сообщений: 466
Репутация: 129 ±
Замечаний: 0% ±

Excel 1997
Паштет, для записи между открытием и закрытием файла должен быть оператор записи (типа PUT или PRINT)
 
Ответить
СообщениеПаштет, для записи между открытием и закрытием файла должен быть оператор записи (типа PUT или PRINT)

Автор - Апострофф
Дата добавления - 28.03.2025 в 15:13
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!