Страница 2 из 3
Re: принудительный формат данных Excel
Добавлено: 16 май 2008, 00:03
VictorM
Serge_Bliznykov, огромное спасибо за совет. Ща буду пробовать и обязательно расскажу, что получится.
!!!!!!!
Есть!!!!
Спасибо!!!!
Нет слов!!!!
Вопрос решен!
Re: принудительный формат данных Excel
Добавлено: 16 май 2008, 00:18
Aent
Я бы сделал примерно так:
Код: Выделить всё
Public Sub ImportCSV(sFile As String, ws As Worksheet)
Dim f As Integer
Dim si As String
Dim i As Long, j As Long
Dim x As Long
Dim v1 As Variant
Dim v2 As Variant
On Error Resume Next
f = FreeFile
Open sFile For Binary As #f
If Err.Number <> 0 Then
'Сигнализируем об ошибке (если надо)
Exit Sub
End If
si = String(LOF(f), Chr(0))
Get #f, , si
Close #f
v1 = Split(si, vbCrLf)
x = 1
For i = LBound(v1) To UBound(v1) 'цикл по строкам CSV
v2 = Split(v1(i), ",")
ws.Cells(x, 1).Resize(1, UBound(v2) + 1) = v2
x = x+1
Next i
End Sub
не обращая внимания на установки системных разделителей
Re: принудительный формат данных Excel
Добавлено: 16 май 2008, 00:34
VictorM
Aent, здорово! Обязательно попробую. Тем более, что каждый раз выставлять установки разделителей как-то влом. Да и стоят на всех машинах по умолчанию "запятая".
Спасибо.
**
Чёт не получается у меня это все запустить.
Цикл вроде пробегается, но результатов нет.
Где-то, что-то не догоняю

Ладно, получится - отпишусь.
Re: принудительный формат данных Excel
Добавлено: 16 май 2008, 13:02
AlexZZZ
Вот решение проблемы от Игоря Акопяна, которое в своё время мне очень помогло:
Код: Выделить всё
Sub FixDateToFrac()
' Исправление ошибочной конвертации запятой в дату
Dim c As Range
Selection.NumberFormat = "@"
For Each c In Selection
If IsNumeric(c.Value) And (c.Value > 1000) Then
If Year(c.Value) = Year(Date) Then
c.Formula = "'" & Day(c.Value) & "," & Month(c.Value)
ElseIf Day(c.Value) = 1 Then
c.Formula = "'" & Month(c.Value) & "," & Format(c.Value, "yy")
End If
End If
Next
End Sub
Re: принудительный формат данных Excel
Добавлено: 16 май 2008, 13:49
VictorM
AlexZZZ, да интересное решение частного случая
При открытии в Excel некоторая часть данных принимает формат "дата". Если теперь эти данные все же преобразовать в формат "числовой" естественно получается полная лажа.
Спасибо, беру на заметку. И в копилку

Re: принудительный формат данных Excel
Добавлено: 16 май 2008, 14:04
AlexZZZ
" писал(а):AlexZZZ, да интересное решение частного случая
Попробовал на Вашем примере, вроде бы это решение для данного случая как раз подходит. Это же как раз не преобразование обратно в числовой формат (как Excel его понимает - "полная лажа"), а именно исправление в выделенном диапазоне ошибочно конвертированого.
Re: принудительный формат данных Excel
Добавлено: 16 май 2008, 14:10
VictorM
AlexZZZ,
Попробовал на Вашем примере, вроде бы это решение для Вашего случая как раз подходит.
прелесть этого решения как раз в том, что подобное преобразование числового значения в дату происходит довольно часто в силу "умничания" Excel, в разных документах. И вот здесь оно (это решение) - то, что нужно! И пригодится не только в данном случае. Потому и говорю - в копилку!
Еще раз спасибо.
Re: принудительный формат данных Excel
Добавлено: 16 май 2008, 22:24
Aent
VictorM писал(а):
Чёт не получается у меня это все запустить.
Цикл вроде пробегается, но результатов нет.
Cейчас протестировал у себя вроде бы всё работает.
У вас разделитель элементов строки в файле "," ?
Re: принудительный формат данных Excel
Добавлено: 16 май 2008, 23:15
VictorM
Aent,
У вас разделитель элементов строки в файле "," ?
нет, у меня - ";".
Попутный вопрос, если можно.
sFile - я задаю и все нормально, а вот при попытке указать
ws, VBE пишет ошибку. Или я что-то не так делаю?
Спасибо.
Re: принудительный формат данных Excel
Добавлено: 17 май 2008, 00:35
Aent
VictorM,
нет, у меня - ";"
Тогда понятно почему у вас не работает
В этом случае строка кода, формирующая массив для строки рабочего листа должна выглядеть так:
Код: Выделить всё
.............
v2 = Split(v1(i), ";")
..............
Что касается ws, то в вызывающей программе соответствующий аргумент должен быть
декларирован как worksheet. Пример вызова.
Код: Выделить всё
Dim w as Worksheet
Dim Fn as string
Fn = ThisWorkbook.Path &"\MyCsv.csv"
Set w = ActiveWorkbook.Worksheets("MySheet")
ImportCSV Fn,w
Кстати, вы тестировали исправленный код ? В первый раз когда я его публиковал cлучайно
пропустил x = x+1.
Если все строки одинаковой длины то код можно подсократить.