Страницы: Пред. 1 2
RSS
Перенос макроса из 32 бит в 64 бит
 
Цитата
dennn написал:
в 32 все гуд работает, а в 64 - нет(
Работает и там и там, просто долго на таком количестве строк (лично у меня). У sokol92 отрабатывает быстрее, видимо и у вас - оттого и складывается такое впечатление, что на х64 не работает (не верное).
Вам нужно именно в .csv, с разделителем ";" и в UTF-8?
С кодировкой нужно заморачиватся, если будет время подумаю.
Вот интересная статья на эту тему, или воспользуйтесь информацией в сообщениях 10 и 22.
Изменено: bedvit - 22.11.2017 11:51:31
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
Вам нужно именно в .csv, с разделителем ";" и в UTF-8?
Да, именно так и нужно.
Буду очень признателен за помощь.
Вручную делать это не удобно - надо раз в 1 час это делать.
 
Код в сообщении 22 смотрели? чем не устроило?
Времени нет разбирать, один из вариантов:
Код
Sub uuu()
Dim a(), b(), c()
Dim i&, j&
Dim txt$, sFile$
'---------------------
sFile = "ваш_путь.csv"

a = ActiveSheet.UsedRange.Value

ReDim c(1 To UBound(a))

For i = 1 To UBound(a)
ReDim b(1 To UBound(a, 2))
For j = 1 To UBound(a, 2)
b(j) = Chr(34) & a(i, j) & Chr(34)
Next
c(i) = Join(b, ";")
Next

Writer_ToFile_SkipBOM sFile, Join(c, vbCrLf)

Beep
MsgBox "Готово"
End Sub

Function Writer_ToFile_SkipBOM(FileName As String, Text As String)
Const adTypeBinary = 1
Const adTypeText = 2
Const bOverwrite = True
Const bAsASCII = False
Dim oFS: Set oFS = CreateObject("Scripting.FileSystemObject")
Dim oFrom: Set oFrom = CreateObject("ADODB.Stream")
Dim sFrom: sFrom = "Windows-1251"
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
oFrom.Type = adTypeText
oFrom.Charset = sFrom
oFrom.Open
oTo.Type = adTypeText
oTo.Charset = sTo
oTo.Open
oTo.WriteText Text
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
oFrom.Close
BinaryStream.SaveToFile sTFSpec, 2
BinaryStream.Close

End Function

Код не мой, он отсюда.
Проверяйте по-моему то, что вам нужно.
Легко гуглится при желании (такие задачки).
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, ок. Спасибо!
 
Этот вариант вам подходит? Тестировали?
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, потестировал. Экспортирует. Надо еще будет импортировать в мою систему - если все будет ок, то гуд.
Изменено: dennn - 23.11.2017 12:41:32
 
bedvit, приветствую!
Есть ошибка.
Если там запускать макрос, что выше - то при открытии информация по столбцам отображается неправильно.
Ссылка на файл - https://yadi.sk/i/wsIBpQTV3Qj2i7
Буду признателен за помощь!
 
Добрый вечер, в xlsx макросы не живут сохраните в формате с поддержкой макросов - гляну.
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, сделал.
https://yadi.sk/i/EggDrRb13Qj3Vn
 
А в чем выражается неправильность отображения?
«Бритва Оккама» или «Принцип Калашникова»?
 
После макроса результат не тот, что нужен. Получается вот так - https://yadi.sk/i/FLObxcyY3Qj578
 
У вас в тексте есть дюймы, написанные как кавычки, к примеру {Характеристики|Диагональ дисплея|3.1 "}
Эти кавычки нужно то же обрабатывать (из заключают, как ни странно, в кавычки).
Погуглите, как правильно записать кавычки в тексте и поймете.
Можете проверить, убрать все кавычки в исходном тексте - макрос отрабатывает правильно.
В Коде (для одиночных кавычек) можно заменить строку с:
Код
b(j) = Chr(34) & a(i, j) & Chr(34)
на:
Код
b(j) = Chr(34) & Replace(a(i, j), """", Chr(34) & Chr(34)) & Chr(34)
Если будут двойные, тройные - по аналогии.
«Бритва Оккама» или «Принцип Калашникова»?
 
Возможно, народ подскажет более универсальный метод.
«Бритва Оккама» или «Принцип Калашникова»?
 
Уточнение к #42. В формате csv знак ограничителя поля (field) удваивается (а не заключается в кавычки), если встречается в поле. Так что, во фрагменте кода в #42 какой-либо дополнительной обработки идущих в поле подряд ограничителей не требуется.
На мой (субъективный) взгляд, понятнее так (не все повторяют перед сном таблицу умножения  ASCII):
Код
 Const q As String = """"         ' ограничитель полей
  ' ----------------------
  b(j) = q & Replace(a(i, j), q, q & q) & q
Владимир
Страницы: Пред. 1 2
Наверх