принудительный формат данных Excel
Модератор: 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
aentelis.livejournal.com
- VictorM
- Сообщения: 794
- Зарегистрирован: 23 окт 2006, 01:44
- Откуда: Lugansk, Ukraine
- Контактная информация:
Aent, здорово! Обязательно попробую. Тем более, что каждый раз выставлять установки разделителей как-то влом. Да и стоят на всех машинах по умолчанию "запятая".
Спасибо.
**
Чёт не получается у меня это все запустить.
Цикл вроде пробегается, но результатов нет.
Где-то, что-то не догоняю
Ладно, получится - отпишусь.
Спасибо.
**
Чёт не получается у меня это все запустить.
Цикл вроде пробегается, но результатов нет.
Где-то, что-то не догоняю

Ладно, получится - отпишусь.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
научите их ловить рыбу - и вы накормите их на всю жизнь".
Вот решение проблемы от Игоря Акопяна, которое в своё время мне очень помогло:
Код: Выделить всё
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 некоторая часть данных принимает формат "дата". Если теперь эти данные все же преобразовать в формат "числовой" естественно получается полная лажа.

"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
научите их ловить рыбу - и вы накормите их на всю жизнь".
Попробовал на Вашем примере, вроде бы это решение для данного случая как раз подходит. Это же как раз не преобразование обратно в числовой формат (как Excel его понимает - "полная лажа"), а именно исправление в выделенном диапазоне ошибочно конвертированого." писал(а):AlexZZZ, да интересное решение частного случая
- VictorM
- Сообщения: 794
- Зарегистрирован: 23 окт 2006, 01:44
- Откуда: Lugansk, Ukraine
- Контактная информация:
AlexZZZ,
Еще раз спасибо.
прелесть этого решения как раз в том, что подобное преобразование числового значения в дату происходит довольно часто в силу "умничания" Excel, в разных документах. И вот здесь оно (это решение) - то, что нужно! И пригодится не только в данном случае. Потому и говорю - в копилку!Попробовал на Вашем примере, вроде бы это решение для Вашего случая как раз подходит.
Еще раз спасибо.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
научите их ловить рыбу - и вы накормите их на всю жизнь".
- Aent
- Сообщения: 1129
- Зарегистрирован: 01 окт 2006, 14:52
- Откуда: Saratov,Russia
- Контактная информация:
VictorM писал(а): Чёт не получается у меня это все запустить.
Цикл вроде пробегается, но результатов нет.
Cейчас протестировал у себя вроде бы всё работает.
У вас разделитель элементов строки в файле "," ?
Андрей Энтелис,
aentelis.livejournal.com
aentelis.livejournal.com
- VictorM
- Сообщения: 794
- Зарегистрирован: 23 окт 2006, 01:44
- Откуда: Lugansk, Ukraine
- Контактная информация:
Aent,
Попутный вопрос, если можно.
sFile - я задаю и все нормально, а вот при попытке указать ws, VBE пишет ошибку. Или я что-то не так делаю?
Спасибо.
нет, у меня - ";".У вас разделитель элементов строки в файле "," ?
Попутный вопрос, если можно.
sFile - я задаю и все нормально, а вот при попытке указать ws, VBE пишет ошибку. Или я что-то не так делаю?
Спасибо.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
научите их ловить рыбу - и вы накормите их на всю жизнь".
- Aent
- Сообщения: 1129
- Зарегистрирован: 01 окт 2006, 14:52
- Откуда: Saratov,Russia
- Контактная информация:
VictorM,
В этом случае строка кода, формирующая массив для строки рабочего листа должна выглядеть так:Что касается ws, то в вызывающей программе соответствующий аргумент должен быть
декларирован как worksheet. Пример вызова.
Кстати, вы тестировали исправленный код ? В первый раз когда я его публиковал cлучайно
пропустил x = x+1.
Если все строки одинаковой длины то код можно подсократить.
Тогда понятно почему у вас не работаетнет, у меня - ";"
В этом случае строка кода, формирующая массив для строки рабочего листа должна выглядеть так:
Код: Выделить всё
.............
v2 = Split(v1(i), ";")
..............
декларирован как 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
aentelis.livejournal.com