принудительный формат данных Excel

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

Serge_Bliznykov, огромное спасибо за совет. Ща буду пробовать и обязательно расскажу, что получится.

!!!!!!!
Есть!!!!
Спасибо!!!!
Нет слов!!!!

Вопрос решен!
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Я бы сделал примерно так:

Код: Выделить всё

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
не обращая внимания на установки системных разделителей
Андрей Энтелис,
aentelis.livejournal.com
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

Aent, здорово! Обязательно попробую. Тем более, что каждый раз выставлять установки разделителей как-то влом. Да и стоят на всех машинах по умолчанию "запятая".
Спасибо.
**
Чёт не получается у меня это все запустить.
Цикл вроде пробегается, но результатов нет.
Где-то, что-то не догоняю :confused:
Ладно, получится - отпишусь.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Аватара пользователя
AlexZZZ
Сообщения: 237
Зарегистрирован: 01 июн 2007, 00:27
Откуда: Москва и область

Вот решение проблемы от Игоря Акопяна, которое в своё время мне очень помогло:

Код: Выделить всё

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
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

AlexZZZ, да интересное решение частного случая
При открытии в Excel некоторая часть данных принимает формат "дата". Если теперь эти данные все же преобразовать в формат "числовой" естественно получается полная лажа.
Спасибо, беру на заметку. И в копилку :)
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Аватара пользователя
AlexZZZ
Сообщения: 237
Зарегистрирован: 01 июн 2007, 00:27
Откуда: Москва и область

&quot писал(а):AlexZZZ, да интересное решение частного случая
Попробовал на Вашем примере, вроде бы это решение для данного случая как раз подходит. Это же как раз не преобразование обратно в числовой формат (как Excel его понимает - "полная лажа"), а именно исправление в выделенном диапазоне ошибочно конвертированого.
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

AlexZZZ,
Попробовал на Вашем примере, вроде бы это решение для Вашего случая как раз подходит.
прелесть этого решения как раз в том, что подобное преобразование числового значения в дату происходит довольно часто в силу "умничания" Excel, в разных документах. И вот здесь оно (это решение) - то, что нужно! И пригодится не только в данном случае. Потому и говорю - в копилку!
Еще раз спасибо.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

VictorM писал(а): Чёт не получается у меня это все запустить.
Цикл вроде пробегается, но результатов нет.

Cейчас протестировал у себя вроде бы всё работает.
У вас разделитель элементов строки в файле "," ?
Андрей Энтелис,
aentelis.livejournal.com
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

Aent,
У вас разделитель элементов строки в файле "," ?
нет, у меня - ";".
Попутный вопрос, если можно.
sFile - я задаю и все нормально, а вот при попытке указать ws, VBE пишет ошибку. Или я что-то не так делаю?
Спасибо.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

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.
Если все строки одинаковой длины то код можно подсократить.
Андрей Энтелис,
aentelis.livejournal.com
Ответить