powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сохранение в CSV
13 сообщений из 13, страница 1 из 1
Сохранение в CSV
    #35530633
kabancheg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, в чем проблема:
Написал макрос, который сохраняет файл в формат .CSV
При запуске его через меню, ALT+F8, сохраняется нормально, разделитель данных ";" точка с запятой
Повесил запуск макроса на кнопку на панели инструментов, так при запуске с кнопки разделитель "," запятая, что не подходит для дальнейшей обработки файла. В чем причина? Это лечится? Может, надо в явном виде атрибуты какие прописать?
Код: plaintext
1.
    ActiveWorkbook.SaveAs Filename:="C:\domino\1.csv", FileFormat:=xlCSVMSDOS, _
        CreateBackup:=False
...
Рейтинг: 0 / 0
Сохранение в CSV
    #35530734
kabancheg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Более вдумчивый поиск натолкнул на вот эту ссылку, похожий случай, но решения проблемы там нет и что дальше с этим делать не пойму
http://forum.ru-board.com/topic.cgi?forum=33&topic=3961&start=20

авторКасательно разделителя: похоже в твоем случае просто игнорируется разделитель, установленный ключем Format (=Delimited(;)) раздела HKEY_LOCAL_MACHINE\software\Microsoft\jet\4.0\engines\text реестра.
Да и не было, по-моему, конкретной определенности по поводу разделителя в csv-файлах. Вроде в версиях выше XP жестко остановились на ";". Описанное тобой явление может быть отголоском этих разногласий.
...
Рейтинг: 0 / 0
Сохранение в CSV
    #35530745
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то, точку с запятой использовать неверно. Стандарт это запятая.
Гугли RFC 4180 и читай пункт 2.4

А Эксель (2003) знает несколько CSV форматов:
xlCSV

xlCSVMac

xlCSVMSDOS

xlCSVWindows
поэксперементируй с ними, какой лучше тебе подойдет.
...
Рейтинг: 0 / 0
Сохранение в CSV
    #35530780
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CSV = Comma Separated Value(s) - значения, разделенные запятыми .
...
Рейтинг: 0 / 0
Сохранение в CSV
    #35532282
kabancheg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlВообще-то, точку с запятой использовать неверно. Стандарт это запятая.
Гугли RFC 4180 и читай пункт 2.4
я знаю, но у меня база данных запятые не воспринимает почему-то, импортирует только если точка с запятой разделитель. так оно и получается точка с запятой, но вот если запуск макроса на кнопку привязать, то не получается почему-то, хотя макрос один и тот же

White Owl
А Эксель (2003) знает несколько CSV форматов:
xlCSV

xlCSVMac

xlCSVMSDOS

xlCSVWindows
поэксперементируй с ними, какой лучше тебе подойдет.


уже. не помогает. оно вроде только на кодировку влияет, если текст сохранять. Эксель правда 2000, но там тоже это есть.
Я вот думаю, может, какой ключик специальный существует, чтобы в лоб прописать, какие разделители использовать, но в справке по VBA этого нет.
...
Рейтинг: 0 / 0
Сохранение в CSV
    #35532631
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я чего не понимаю. Почему автор одновременно говорит о формате CSV и о разделителе ";". Одно другое должно исключать. Наличие такого разделителя не есть формат CSV. То есть можно воспользоваться (как заклинанием) форматом xlCSVMSDOS, но разделение данных будет осуществляться по запятым, а не по точкам с запятой.

Если надо импортировать в Excel, то дайте файлу расширение "txt" и запишите макро, указывающее разделитель ";": File/Open и т.д.
...
Рейтинг: 0 / 0
Сохранение в CSV
    #35532644
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще: что это у вас за база данных такая? Если это Excel, то так и надо сказать, а если это действительно база данных, а не Excel, то какая?
...
Рейтинг: 0 / 0
Сохранение в CSV
    #35532733
kabancheg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VladConnМожет я чего не понимаю. Почему автор одновременно говорит о формате CSV и о разделителе ";". Одно другое должно исключать. Наличие такого разделителя не есть формат CSV. То есть можно воспользоваться (как заклинанием) форматом xlCSVMSDOS, но разделение данных будет осуществляться по запятым, а не по точкам с запятой.

Если надо импортировать в Excel, то дайте файлу расширение "txt" и запишите макро, указывающее разделитель ";": File/Open и т.д.
И еще: что это у вас за база данных такая? Если это Excel, то так и надо сказать, а если это действительно база данных, а не Excel, то какая?


Ну я не знаю как еще объяснить... может это фича такая в экселе, но если я через меню выбираю команду Файл- сохранить как - тип файла=.csv (разделители запятые) то сохраняется файл с разделителем ";" :) эксель 2000, в 97м то же самое. Может потому, что в региональных стандартах так задано, может, еще почему... То же самое действие, записанное в макрос, дает такой же результат. А вот тот же самый макрос, запускаемый кнопкой на панели инструментов дает результат "," В последующем данный файл импортируется в бд "Домино", где функция импорта на ";" заточена.
а я хочу все-таки этот макрос с кнопки запустить, что бы и так и так работало. За неимением доступного формата xlCDSV (Comma Dot Separated Value) :) приходится как-то через xlCSV изворачиваться.

Чтобы меня сильно не пинали... я не программист, а простой менеджер, пытаюсь оптимизировать свои рабочие процедуры. Спрашивал у нашего админа-программиста, почему так происходит - он глубокомысленно пожал плечами и сказал "не знаю". он по VBA вообще не сечет
...
Рейтинг: 0 / 0
Сохранение в CSV
    #35532768
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kabanchegЗа неимением доступного формата xlCDSV (Comma Dot Separated Value) :)Тогда уж xlSSV. Знак пунктуации "точка с запятой" по английски называется "semicolon".

Хочешь универсальности - реализуй сохранение данных в файл самостоятельно. Либо прогоняй полученный файл через дополнительный конвертор который превратит "неправильный" разделитель полей в "правильный".
...
Рейтинг: 0 / 0
Сохранение в CSV
    #35533444
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то все очень несложно.
Рекомендую почитать здесь: http://msdn.microsoft.com/en-us/library/ms709353.aspx
...
Рейтинг: 0 / 0
Сохранение в CSV
    #35537217
kabancheg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndrFВообще-то все очень несложно.
Рекомендую почитать здесь: http://msdn.microsoft.com/en-us/library/ms709353.aspx
Почитал. Не совсем понял, поясните плз: этот Schema.ini используется для непосредственного импорта в базу данных что ли? т.е. в исходном файле разделители могут быть любыми, а при импорте меняются как бы на лету?
...
Рейтинг: 0 / 0
Сохранение в CSV
    #35537225
kabancheg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
о_О а я неделю мучаюсь. Дошло. А все надо было проще гораздо....
Сцепить эти колонки просто в одну с разделителем, каким мне надо, и всего делов.
...
Рейтинг: 0 / 0
Сохранение в CSV
    #35538945
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kabanchegПочитал. Не совсем понял, поясните плз: этот Schema.ini используется для непосредственного импорта в базу данных что ли? т.е. в исходном файле разделители могут быть любыми, а при импорте меняются как бы на лету?

Schema.ini задает параметры экспорта/импорта. В том числе может задавать и разделитель, кодовую страницу файла, имена полей...

Ниже примерчик, который я когда-то набрасывал:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
Public Sub Main()
    Const sPathIn As String = "C:\Temp\"
    Const sPathOut As String = "C:\Temp\"
    Const sFileIn As String = "File.txt"
    Const sFileOut As String = "NewFile.txt"

    Dim cn As New ADODB.Connection, r As New ADODB.Recordset, _
        s As String, ss As String, sSchemaIni As String, i As Integer

    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=" & sPathIn & ";" & _
          "Extended Properties=Text"

    ' Создадим файл откуда берем данные для теста
    For i =  0  To  100 
        s = Mid$(Format$(Rnd, ".0000000"),  2 )
        ss = ss & Mid$(s,  1 ,  1 ) & "," & Mid$(s,  2 ,  1 ) & "," & Mid$(s,  3 ,  1 ) & "." & CInt(Mid$(s,  4 ,  3 )) & "," & Mid$(s,  7 ,  1 ) & vbCrLf
    Next i
    s = sPathOut & sFileIn
    If FileExists(s) Then Kill s
    SaveFile s, ss
    
    ' Удалим выходной файл
    s = sPathOut & sFileOut
    If FileExists(s) Then Kill s
    
    ' Создадим schema.ini
    sSchemaIni = sPathOut & "schema.ini"
    If FileExists(sSchemaIni) Then Kill sSchemaIni
    ss = "[File.txt]" & vbCrLf _
        & "ColNameHeader=False" & vbCrLf _
        & "CharacterSet=1251" & vbCrLf _
        & "Format=Delimited(,)" & vbCrLf _
        & "DecimalSymbol=." & vbCrLf _
        & "Col1=F1 Integer" & vbCrLf _
        & "Col2=F2 Integer" & vbCrLf _
        & "Col3=F3 Float" & vbCrLf _
        & "Col4=F4 Integer" & vbCrLf _
        & vbCrLf _
        & "[NewFile.txt]" & vbCrLf _
        & "ColNameHeader=False" & vbCrLf _
        & "CharacterSet=1251" & vbCrLf _
        & "Format=Delimited(,)" & vbCrLf _
        & "DecimalSymbol=." & vbCrLf _
        & "NumberDigits=4" & vbCrLf _
        & "Col1=F1 Integer" & vbCrLf _
        & "Col2=F2 Integer" & vbCrLf _
        & "Col3=F3 Float" & vbCrLf _
        & "Col4=F4 Integer" & vbCrLf
        
    SaveFile sSchemaIni, ss
    
    ' Импортируем данные
    On Error GoTo Err_
    r.Open "SELECT * INTO [" & sFileOut _
                    & "] IN '" & sPathOut & "' [Text;] " _
            & "FROM [" & sFileIn _
            & "] ORDER BY 1,2,3,4", cn, _
                    adOpenStatic, adLockReadOnly, adCmdText
    If FileExists(sSchemaIni) Then Kill sSchemaIni
    Exit Sub

Err_:
    With cn.Errors( 0 )
        If .NativeError = - 329323426  And .Number = - 2147467259  Then Resume Next
    End With
    MsgBox Err.Description, vbCritical
End Sub

Private Function FileExists(sFile As String) As Boolean
    On Error Resume Next
    FileExists = ((GetAttr(sFile) And vbDirectory) =  0 )
    If Err.Number Then Err.Clear
End Function

Private Sub SaveFile(sFile As String, sText As String)
    Dim iHFile As Integer
    
    iHFile = FreeFile
    Open sFile For Binary As #iHFile
    Put iHFile, , sText
    Close #iHFile
End Sub
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сохранение в CSV
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]