С Новым годом! Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 33

Проблемы с чтением и записью в файл в Юникоде

31.03.2012, 13:49. Показов 2056. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Есть код:
Запись в файл:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Option Explicit
 Sub SavingCaseAsUnicodeFile()
 Dim FileName, SheetName As String, SupportingSheet As String, Buffer As String
 Dim column As Integer, i As Integer
 'preferences
 FileName = Application.GetSaveAsFilename( _
 fileFilter:="Text Files (*.case), *.case")
 SheetName = "Лист1"
 SupportingSheet = "Лист2"
 column = 2
 If FileName <> False Then
 i = 1
 For i = 1 To 400
 Buffer = ThisWorkbook.Sheets(SheetName).Cell s(i, column).Value
 ThisWorkbook.Sheets(SupportingSheet ).Cells(i, 1).Value = Buffer
 Next i
 
 Sheets(SupportingSheet).Copy
 ActiveWorkbook.SaveAs FileName, xlUnicodeText
 ActiveWorkbook.Close False
 Sheets(SheetName).Select
 Else
 End If
 End Sub
Чтение из файла:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Option Explicit
 Function GetFilePath(Optional ByVal Title As String = "Choose File for work", _
 Optional ByVal InitialPath As String = "c:\", _
 Optional ByVal FilterDescription As String = "Case", _
 Optional ByVal FilterExtention As String = "*.*")
 Dim ps As String
 On Error Resume Next
 With Application.FileDialog(msoFileDialo gOpen)
 .ButtonName = "Choose": .Title = Title: .InitialFileName = InitialPath
 .Filters.Clear: .Filters.Add FilterDescription, FilterExtention
 If .Show <> -1 Then Exit Function
 GetFilePath = .SelectedItems(1): ps = Application.PathSeparator
 End With
 End Function
 Sub ImportCase()
 Dim Simv As String * 2, FileName As String, SheetName As String, s As String
 Dim i As Integer
 
 FileName = GetFilePath("Choose case for import", , "Case", "*.case")
 SheetName = "Ëèñò1"
 
 If FileName = "" Then Exit Sub ' exit in the case of refuse
 Open FileName For Random As #1 Len = 2
 i = 1
 Do While Not EOF(1)
 Get #1, , Simv
 s = StrConv(Simv, vbFromUnicode)
 If s = Chr(13) Then
 i = i + 1
 Get #1, , Simv
 Sheets(SheetName).Cells(i, 1) = ""
 Else
 Sheets(SheetName).Cells(i, 1) = Cells(i, 1) + s
 End If
 Loop
 Close #1
 End Sub
Причем как оказалось с обеими частями есть проблемы.
1)При сохранении в файл есть нежелательный промежуточный шаг записи нужного столбца на чистый лист, так как даннай код сохраняет только лист целиком.
2)Чтение оказывается выдает самые разные ошибки, иногда проглатывает кавычки, иногда раздваивает последнюю букву, иногда вместо 111111 или 222 возвращает 6(На снимке первый столбец - загружен из файла, второй исходный).Хотя если текст состоит из одних лишь букав без знаков, проблем никаких .
Выложил обе части потому как что то мне подсказывает если чуток изменить код записи, код чтения не будет работать всовсем.

Очень прошу помогите решить данные проблемы.
Миниатюры
Проблемы с чтением и записью в файл в Юникоде  
Вложения
Тип файла: xls 1.xls (58.0 Кб, 8 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.03.2012, 13:49
Ответы с готовыми решениями:

Проблемы с чтением и записью двух однонаправленных сокетов
Добрый день, прошу подсказать как решить проблемы с чтением и записью в сокет. У меня есть два однопоточных сервер-клиент, то есть клиент...

Не могу разобраться чтением и записью в файл
Тема моей курсовой работы &quot;разработка программы определения размера стихотворения&quot;. В краце мне нужно считать из текстового файла все...

Нужно написать программу с чтением/записью в файл (потоки)
Помогите пожалуйста, в изучении Java я новичок, задали задание (изучаем потоки) следующего характера: Написать программу, которая...

5
31.03.2012, 22:21

Не по теме:

Кому интересно - тема развивается на другом форуме

0
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
31.03.2012, 23:14
Казанский, пусть развивается, это не попадает под запрет. Лишь бы на этом форуме темы не дублировались
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
01.04.2012, 00:04
Возникшие проблемы:
1. использование символа chr(34) в строке символов.
2. при сохранении в таком формате кавычки записываются как """, при импорте они и восстанавливаются
3. по поводу 222 превращающегося в 6 изменить код в импорте:

Visual Basic
1
2
3
4
5
6
7
8
9
10
    Do While Not EOF(1)
        Get #1, , Simv
        s = s & StrConv(Simv, vbFromUnicode)
        If Right(s, 1) = Chr(13) Then
            Sheets(SheetName).Cells(i, 1) = s
            i = i + 1
            s = ""
            Get #1, , Simv
        End If
    Loop
1
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
01.04.2012, 00:55
Я бы посоветовал для начала озвучить задачу полностью.
А то смотрю и не понимаю: зачем всё это:

Visual Basic
1
2
3
4
For i = 1 To 400
 Buffer = ThisWorkbook.Sheets(SheetName).Cell s(i, column).Value
 ThisWorkbook.Sheets(SupportingSheet ).Cells(i, 1).Value = Buffer
 Next i
Зачем гнать через дополнительню переменную? Зачем вообще цикл?

Visual Basic
1
2
  Sub ImportCase
Sheets(SheetName).Cells(i, 1) = Cells(i, 1) + s
Неоднозначная запись. Конкретная ячейка на конкретном листе приравнивается к ячейке активного листа. Это так и должно? Какой лист должен быть активным при запуске процедуры. И второе: при каждом запуске данные дописыватся в ячейку? Или всё-таки записываются?
0
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 33
01.04.2012, 12:31  [ТС]
По порядку:
1) Да, сейчас заметил. Цикл и переменная это мои глупые ошибочки которые можно убрать и код ничуть не пострадает. Я еще и не такое бывает вытворяю. А копирую столбец на чистый лист, чтоб отделить его от остальной таблицы. Потому что функция которую я использовал записывает в файл лист целиком.
2)С листами у меня тоже путаница вышла. Записываться(не дописываться) данные должны в конкретный лист а не в активный.

Об изначальной задаче:

Нужно сохранить данные из конкретного столбца на конкретном листе в текстовый файл.Столбец изначально состоит из пустых ячеек в перемешку с полными(в них рус и анл текст, знаки, цифры). Затем когда нибудь позже загрузить их обратно в таком же виде в те же места. Как импорт и экспорт в софте

Но есть еще проблема с языками. К примеру запущу програмку на русской машине, столбец сохраню в файл. Затем на английской машине попробую загрузить этот столбец из текстового файла в програмку(Такая ситуация полюбому будет). В таком случае русские буквы превратятся в кракозябры. Для этого нужен Юникод

Вероятно данную задачу можно решить и подругому, сделать код лучше и короче. Но так как у меня пока почти нет опыта общения с VBA, я просто собирал его из того что получилось найти и из чужих советов. И вот что вышло

Добавлено через 8 минут
Кстати поправки сделанные Totai действительно убрали проблему с цифрами, уже за это большое спасибо.

Добавлено через 10 часов 47 минут
Кстати Казанский уже решил данную проблему:
В проблему не вникал, но может так сделать: сформировать строку из ячеек, переложить ее в байтовый массив, сохранить массив в файл (в двоичном виде).
Потом считать файл в байтовый массив, переложить в строку, разбить на ячейки?

Вот, попробуйте. Полученный файл открывается Блокнотом, причем Блокнот распознает его как Unicode файл.
Код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub Save1stColumn()
Dim s$, b() As Byte
s = Join(Application.Transpose(Range("A1", Cells(Rows.Count, 1).End(xlUp)).Value), vbCrLf)
b = s
Open ActiveWorkbook.FullName & ".case" For Binary As #1
Put 1, , b
Reset
End Sub
 
Sub ReadTo2ndColumn()
Dim s$, b() As Byte, v
Open ActiveWorkbook.FullName & ".case" For Binary As #1
ReDim b(1 To LOF(1))
Get 1, , b
Reset
s = b
v = Split(s, vbCrLf)
Range("B1").Resize(UBound(v) + 1) = Application.Transpose(v)
End Sub
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.04.2012, 12:31
Помогаю со студенческими работами здесь

STM32: FatFS & USB Host & Flash - проблемы с чтением/записью
Уважаемые гуру! Ломаю голову, но найти разумное объяснение симптомам не могу. Есть stm32f407. В Кубе создается проект с USB Host...

Задачка с записью и чтением из текстового файла с++
В текстовом файле «In.txt» сохраняются через пробел целые числа. Переписать в новый текстовый файл «Out.txt» каждое четное по номеру...

Шифрование. Проблема с чтением и записью файла.
Доброго времени суток. Программа шифрует и расшифровывает файлы с помощью сети Фейстеля. Только начал радоваться, что все работает, как...

Шифрование и расшифровка строки с записью/чтением из БД
Доброго времени суток. Необходимо реализовать шифрование строки, и затем ее расшифрование. Данная строка записывается в БД в...

Хранилище данных с быстрым чтением/записью
Добрый день! Подскажите пожалуйста, в чем лучше хранить данные (скажем коллекцию List&lt;T&gt;), чтобы была возможность быстро записывать и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru