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


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
не срабатывает макрос для открытия таблицы dbf
    #37360294
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
не срабатывает макрос для открытия таблицы dbf
    #37360574
shumamura
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробуй камнем,

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

Спасибо! все получилось!
...
Рейтинг: 0 / 0
не срабатывает макрос для открытия таблицы dbf
    #37360901
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
не срабатывает макрос для открытия таблицы dbf
    #37360956
shumamura
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
не срабатывает макрос для открытия таблицы dbf
    #37361615
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
не срабатывает макрос для открытия таблицы dbf
    #37362109
shumamura
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробуй камнем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
не срабатывает макрос для открытия таблицы dbf
    #37362116
shumamura,
... а после изменения имени файла на более короткое подключение QureyTable происходит без ошибок.
Если так - то вы наступили на какие-то неизвестные грабли.
Если нет - то ошибка не из-за имени файла, а, например, из-за отсутствия индексного файла.
...
Рейтинг: 0 / 0
не срабатывает макрос для открытия таблицы dbf
    #37362127
shumamura
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробуй камнемshumamura,
... а после изменения имени файла на более короткое подключение QureyTable происходит без ошибок.
Если так - то вы наступили на какие-то неизвестные грабли.
Если нет - то ошибка не из-за имени файла, а, например, из-за отсутствия индексного файла.

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

ЗЫ: более вразумительный текс ошибки пожно получить используя другого провайдера, например Microsoft.Jet.OLEDB.4.0
...
Рейтинг: 0 / 0
не срабатывает макрос для открытия таблицы dbf
    #37362139
shumamura,
можете выложить Ваш "файл с длинным именем", на котором подключение обламывается?
...
Рейтинг: 0 / 0
не срабатывает макрос для открытия таблицы dbf
    #37362143
shumamura
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробуй камнем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
не срабатывает макрос для открытия таблицы dbf
    #37362147
shumamura
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробуй камнем,

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


тут уже нет слов.... неужели от версии драйвера зависит....?
...
Рейтинг: 0 / 0
не срабатывает макрос для открытия таблицы dbf
    #37362215
shumamura,
не знаю. Сейчас семёрку на виртуальную машину поставлю - проверю.
...
Рейтинг: 0 / 0
не срабатывает макрос для открытия таблицы dbf
    #37362348
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
не срабатывает макрос для открытия таблицы dbf
    #37362524
shumamura
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробуй камнем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
не срабатывает макрос для открытия таблицы dbf
    #37362543
shumamura
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тогда еще один вопрос... по конструкции Select
как правильно написать

.Sql = "SELECT FIO as ФИО потребителя, sum as уплаченная сумма FROM *
чтобы в экселе отображались наименования столбцов, которые мы задаем, а не названия полей таблицы?
...
Рейтинг: 0 / 0
не срабатывает макрос для открытия таблицы dbf
    #37362565
R Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
не срабатывает макрос для открытия таблицы dbf
    #37362574
shumamura
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
R Dmitry,
я и ковычки и апострофы перепробовал, оказывается надо []
спасибо!
...
Рейтинг: 0 / 0
не срабатывает макрос для открытия таблицы dbf
    #37362584
R Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shumamura,

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

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




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


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