Страница 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, здорово! Обязательно попробую. Тем более, что каждый раз выставлять установки разделителей как-то влом. Да и стоят на всех машинах по умолчанию "запятая".
Спасибо.
**
Чёт не получается у меня это все запустить.
Цикл вроде пробегается, но результатов нет.
Где-то, что-то не догоняю :confused:
Ладно, получится - отпишусь.

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
&quot писал(а):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.
Если все строки одинаковой длины то код можно подсократить.