Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / не срабатывает макрос для открытия таблицы dbf / 25 сообщений из 29, страница 1 из 2
20.07.2011, 23:34
    #37360269
shumamura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не срабатывает макрос для открытия таблицы dbf
Всем привет! у меня небольшая проблемка - есть один макрос, который должен работать так - при нажатии на кнопку открывается диалоговое окно выбора файла, затем этот файл импортируется в таблицу эксель. вот сам макрос


Sub uyjhk()
Dim path As String
Application.ScreenUpdating = False
With Application.FileDialog(msoFileDialogOpen)

.Title = "Выберите файл"
.Show
If .SelectedItems.Count = 0 Then Exit Sub
myPath = .SelectedItems(1)
End With

Cells.Select
Selection.ClearContents
With ActiveSheet.QueryTables.Add(Connection:="odbc;Driver={Microsoft dBase Driver (*.dbf)};DBQ=c:", _
Destination:=ActiveSheet.Range("A2"), Sql:="SELECT * FROM mypath")

.Refresh
End With

End Sub

при запуске макроса вылезает Run-time error 1004 Общая ошибка оdbc. если я явно указываю в конструкции select .... from путь к dbf файлу - все работает. как устранить сей косяк??
...
Рейтинг: 0 / 0
21.07.2011, 00:05
    #37360294
не срабатывает макрос для открытия таблицы dbf
shumamura,

Код: plaintext
1.
2.
With ActiveSheet.QueryTables.Add(Connection:="odbc;Driver={Microsoft dBase Driver (*.dbf)};DBQ=c:", _
Destination:=ActiveSheet.Range("A2"), Sql:="SELECT * FROM " & myPath)
...
Рейтинг: 0 / 0
21.07.2011, 09:51
    #37360574
shumamura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не срабатывает макрос для открытия таблицы dbf
пробуй камнем,

пишет что run-time-error 1004, синтаксическая ошибка sql
...
Рейтинг: 0 / 0
21.07.2011, 09:58
    #37360596
shumamura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не срабатывает макрос для открытия таблицы dbf
пробуй камнем,

Спасибо! все получилось!
...
Рейтинг: 0 / 0
21.07.2011, 12:12
    #37360901
shumamura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не срабатывает макрос для открытия таблицы dbf
есть еще один прикол - если имя открываемого dbf файла превышает 8 символов вместе с расширением, то при выполнении

With ActiveSheet.QueryTables.Add(Connection:="odbc;Driver={Microsoft dBase Driver (*.dbf)};DBQ=c:", _
Destination:=ActiveSheet.Range("A2"), Sql:="SELECT * FROM " & myPath)

выдается "Общая ошибка ODBC".... такие приколы блин - не ожидал что так будет.. возможно ли как-то обойти эту проблемку?
...
Рейтинг: 0 / 0
21.07.2011, 12:32
    #37360956
shumamura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не срабатывает макрос для открытия таблицы dbf
shumamuraесть еще один прикол - если имя открываемого dbf файла превышает 8 символов , то при выполнении

With ActiveSheet.QueryTables.Add(Connection:="odbc;Driver={Microsoft dBase Driver (*.dbf)};DBQ=c:", _
Destination:=ActiveSheet.Range("A2"), Sql:="SELECT * FROM " & myPath)

выдается "Общая ошибка ODBC".... такие приколы блин - не ожидал что так будет.. возможно ли как-то обойти эту проблемку?
...
Рейтинг: 0 / 0
21.07.2011, 16:21
    #37361615
не срабатывает макрос для открытия таблицы dbf
shumamura,
...возможно ли как-то обойти эту проблемку?
Код: 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.
' ...
' файл выбрали, в переменной myPath - полный путь к файлу

Dim myTable$, sConnection$, k%

k = InStrRev(myPath, "\")
myTable = Mid$(myPath, k +  1 ) ' имя файла с расширением 
                        ' можно играться и убирать расширение, но Microsoft dBase Driver и так переварит

myPath = Left$(myPath, k -  1 ) ' папка с файлом, без бэкслэша в конце

' строка подключения к локальной базе
' строку подключения к файлу на удаленом компьютере см. http://connectionstrings.com/dbf-foxpro
sConnection = "ODBC;Driver={Microsoft dBase Driver (*.dbf)};DBQ=" & myPath & ";"


Cells.Select
Selection.ClearContents
With ActiveSheet.QueryTables.Add( _
        Connection:=sConnection, _
        Destination:=ActiveSheet.Range("A2"))

  .Sql = "SELECT * FROM [" & myTable & "]"
' rem вместо квадратных скобок можно использовать кавычки
' rem .Sql = "SELECT * FROM """ & myTable & """"
' rem ИМХО квадратные скобки смотрятся красивше

  .Refresh
End With

End Sub

ЗЫ: проблема _скорее_всего_ не в длине имени файла.
...
Рейтинг: 0 / 0
21.07.2011, 20:40
    #37362109
shumamura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не срабатывает макрос для открытия таблицы dbf
пробуй камнемshumamura,
...возможно ли как-то обойти эту проблемку?
+
Код: 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.
' ...
' файл выбрали, в переменной myPath - полный путь к файлу

Dim myTable$, sConnection$, k%

k = InStrRev(myPath, "\")
myTable = Mid$(myPath, k +  1 ) ' имя файла с расширением 
                        ' можно играться и убирать расширение, но Microsoft dBase Driver и так переварит

myPath = Left$(myPath, k -  1 ) ' папка с файлом, без бэкслэша в конце

' строка подключения к локальной базе
' строку подключения к файлу на удаленом компьютере см. http://connectionstrings.com/dbf-foxpro
sConnection = "ODBC;Driver={Microsoft dBase Driver (*.dbf)};DBQ=" & myPath & ";"


Cells.Select
Selection.ClearContents
With ActiveSheet.QueryTables.Add( _
        Connection:=sConnection, _
        Destination:=ActiveSheet.Range("A2"))

  .Sql = "SELECT * FROM [" & myTable & "]"
' rem вместо квадратных скобок можно использовать кавычки
' rem .Sql = "SELECT * FROM """ & myTable & """"
' rem ИМХО квадратные скобки смотрятся красивше

  .Refresh
End With

End Sub

ЗЫ: проблема _скорее_всего_ не в длине имени файла. думаю, от этого ничего не меняется. что ваш код, что мой код - без разницы ЧТО стоит после FROM - полный путь к таблице DBF или только имя таблицы - та же проблема - при открытии файла с именем большим 8 символов - Общая ошибка ODBC...
...
Рейтинг: 0 / 0
21.07.2011, 20:46
    #37362116
не срабатывает макрос для открытия таблицы dbf
shumamura,
... а после изменения имени файла на более короткое подключение QureyTable происходит без ошибок.
Если так - то вы наступили на какие-то неизвестные грабли.
Если нет - то ошибка не из-за имени файла, а, например, из-за отсутствия индексного файла.
...
Рейтинг: 0 / 0
21.07.2011, 21:01
    #37362127
shumamura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не срабатывает макрос для открытия таблицы dbf
пробуй камнемshumamura,
... а после изменения имени файла на более короткое подключение QureyTable происходит без ошибок.
Если так - то вы наступили на какие-то неизвестные грабли.
Если нет - то ошибка не из-за имени файла, а, например, из-за отсутствия индексного файла.

да, запускаю например и выбираю файл с именем, большим чем 8 - не работает. затем меняю имя, открываю и все работает... может быть Microsoft dBase Driver не поддерживает все таки имена файлов, больших 8?
...
Рейтинг: 0 / 0
21.07.2011, 21:12
    #37362136
shumamura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не срабатывает макрос для открытия таблицы dbf
может стоить поменять провайдера? какой еще провайдер работает с *.dbf без глюков?
...
Рейтинг: 0 / 0
21.07.2011, 21:19
    #37362138
не срабатывает макрос для открытия таблицы dbf
shumamura,
перед тем как запостить свой говнокод, я, честное благородное слово, проверил, отрабатывает ли подключение, если имя файла длинее восьми символов.
ОС: win xp sp3
Версия драйвера: 4.00.6304.00, файл odbcjt32.dll, дата 18.08.2004

ЗЫ: более вразумительный текс ошибки пожно получить используя другого провайдера, например Microsoft.Jet.OLEDB.4.0
...
Рейтинг: 0 / 0
21.07.2011, 21:21
    #37362139
не срабатывает макрос для открытия таблицы dbf
shumamura,
можете выложить Ваш "файл с длинным именем", на котором подключение обламывается?
...
Рейтинг: 0 / 0
21.07.2011, 21:26
    #37362143
shumamura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не срабатывает макрос для открытия таблицы dbf
пробуй камнемshumamura,
перед тем как запостить свой говнокод, я, честное благородное слово, проверил, отрабатывает ли подключение, если имя файла длинее восьми символов.
ОС: win xp sp3
Версия драйвера: 4.00.6304.00, файл odbcjt32.dll, дата 18.08.2004

ЗЫ: более вразумительный текс ошибки пожно получить используя другого провайдера, например Microsoft.Jet.OLEDB.4.0

и че- у вас все получилось открыть какой-нить файл dbf? у меня win7prof, версия драйвера 6.01.7601.17514,файл odbcjt32.dll, дата 20.11.2010
...
Рейтинг: 0 / 0
21.07.2011, 21:29
    #37362147
shumamura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не срабатывает макрос для открытия таблицы dbf
пробуй камнем,

вот файл - данных там нет.
...
Рейтинг: 0 / 0
21.07.2011, 22:03
    #37362174
не срабатывает макрос для открытия таблицы dbf
shumamura,
поменял имячъко на более длинное
12345678 12345678.dbf
, положил файл в папку c:\temp\
, подключился без проблем. Запрос выдал 65 записей.
...
Рейтинг: 0 / 0
21.07.2011, 22:19
    #37362185
shumamura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не срабатывает макрос для открытия таблицы dbf
пробуй камнемshumamura,
поменял имячъко на более длинное
12345678 12345678.dbf
, положил файл в папку c:\temp\
, подключился без проблем. Запрос выдал 65 записей.


тут уже нет слов.... неужели от версии драйвера зависит....?
...
Рейтинг: 0 / 0
21.07.2011, 22:57
    #37362215
не срабатывает макрос для открытия таблицы dbf
shumamura,
не знаю. Сейчас семёрку на виртуальную машину поставлю - проверю.
...
Рейтинг: 0 / 0
22.07.2011, 04:01
    #37362348
не срабатывает макрос для открытия таблицы dbf
shumamura,
причиной оказалась DBE (Borland Database Engine). Если её удалить, у меня тоже не подключается к файлам с длинными именами.
Из положения вышел с помошью WinAPI функции GetShortPathName
Код: 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.
Option Explicit

'module kernel32
'DWORD WINAPI GetShortPathName(
'  __in   LPCTSTR lpszLongPath,
'  __out  LPTSTR lpszShortPath,
'  __in   DWORD cchBuffer
');

Private Declare Function GetShortPathName& _
Lib "kernel32" Alias "GetShortPathNameA" (ByVal sLongPath$, ByVal sShortPath$, ByVal dwBuffer&)


Sub uyjhk()
Dim myPath$, myTable$, scnn$, k&

Application.ScreenUpdating = False

With Application.FileDialog(msoFileDialogOpen)
    .Title = "Select DBF file"
    .Filters.Clear
    .Filters.Add "dBase files", "*.dbf"
    .Show
    If .SelectedItems.Count =  0  Then Exit Sub
    myPath = .SelectedItems( 1 )
End With

k = GetShortPathName(myPath, myPath, Len(myPath))

k = InStrRev(myPath, "\")
myTable = Mid$(myPath, k +  1 )
myPath = Left$(myPath, k -  1 )

myTable = Left$(myTable,  8 )

scnn = "odbc;Driver={Microsoft dBase Driver (*.dbf)};DBQ=" & myPath & ";"

With ActiveSheet
  .Cells.ClearContents

With .QueryTables.Add( _
      Connection:=scnn, _
      Destination:=.Cells( 2 ,  1 ))
    
    .Sql = "SELECT * FROM [" & myTable & "]"
    .Refresh
End With
End With

Application.ScreenUpdating = True
End Sub


...
Рейтинг: 0 / 0
22.07.2011, 10:07
    #37362524
shumamura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не срабатывает макрос для открытия таблицы dbf
пробуй камнемshumamura,
причиной оказалась DBE (Borland Database Engine). Если её удалить, у меня тоже не подключается к файлам с длинными именами.
Из положения вышел с помошью WinAPI функции GetShortPathName
+
Код: 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.
Option Explicit

'module kernel32
'DWORD WINAPI GetShortPathName(
'  __in   LPCTSTR lpszLongPath,
'  __out  LPTSTR lpszShortPath,
'  __in   DWORD cchBuffer
');

Private Declare Function GetShortPathName& _
Lib "kernel32" Alias "GetShortPathNameA" (ByVal sLongPath$, ByVal sShortPath$, ByVal dwBuffer&)


Sub uyjhk()
Dim myPath$, myTable$, scnn$, k&

Application.ScreenUpdating = False

With Application.FileDialog(msoFileDialogOpen)
    .Title = "Select DBF file"
    .Filters.Clear
    .Filters.Add "dBase files", "*.dbf"
    .Show
    If .SelectedItems.Count =  0  Then Exit Sub
    myPath = .SelectedItems( 1 )
End With

k = GetShortPathName(myPath, myPath, Len(myPath))

k = InStrRev(myPath, "\")
myTable = Mid$(myPath, k +  1 )
myPath = Left$(myPath, k -  1 )

myTable = Left$(myTable,  8 )

scnn = "odbc;Driver={Microsoft dBase Driver (*.dbf)};DBQ=" & myPath & ";"

With ActiveSheet
  .Cells.ClearContents

With .QueryTables.Add( _
      Connection:=scnn, _
      Destination:=.Cells( 2 ,  1 ))
    
    .Sql = "SELECT * FROM [" & myTable & "]"
    .Refresh
End With
End With

Application.ScreenUpdating = True
End Sub




хоть я пока и не разобрался как работает эта функция - (по названию - возвращает короткое имя файла ))) ) но теперь все открывает! Спасибо!
...
Рейтинг: 0 / 0
22.07.2011, 10:17
    #37362543
shumamura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не срабатывает макрос для открытия таблицы dbf
тогда еще один вопрос... по конструкции Select
как правильно написать

.Sql = "SELECT FIO as ФИО потребителя, sum as уплаченная сумма FROM *
чтобы в экселе отображались наименования столбцов, которые мы задаем, а не названия полей таблицы?
...
Рейтинг: 0 / 0
22.07.2011, 10:31
    #37362565
R Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не срабатывает макрос для открытия таблицы dbf
shumamura,

Для переименования заглавий столбцов(полей)
используйте как вы и написали только не употребляйте служебные слова, и соблюдайте синтаксис
Код: plaintext
Sql = "SELECT FIO as ФИО потребителя, [color=red]sum[/color] as [color=red]уплаченная сумма[/color] FROM * 
надо так
Код: plaintext
Sql = "SELECT FIO as [ФИО потребителя], [sum] as [уплаченная сумма] FROM * 
насчет sum , без скобок может не прокатить поэтому лучше заковать :)
...
Рейтинг: 0 / 0
22.07.2011, 10:37
    #37362574
shumamura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не срабатывает макрос для открытия таблицы dbf
R Dmitry,
я и ковычки и апострофы перепробовал, оказывается надо []
спасибо!
...
Рейтинг: 0 / 0
22.07.2011, 10:40
    #37362584
R Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не срабатывает макрос для открытия таблицы dbf
shumamura,

http://programmersforum.ru/showthread.php?t=161220
посмотрите ещше в сторону ADO
...
Рейтинг: 0 / 0
22.07.2011, 11:41
    #37362755
shumamura
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не срабатывает макрос для открытия таблицы dbf
R Dmitry,

ок! я с этим bde давно не работал...
а VBA я по жизни старался обходить стороной)) но пришлось и ею воспользоваться....




а проблематично ли будет защитить макрос от изменений?
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / не срабатывает макрос для открытия таблицы dbf / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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