Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2010, 13:19   #1
R@v14
Пользователь
 
Регистрация: 27.05.2010
Сообщений: 13
По умолчанию Проблема с загрузкой dbf в макрос

Добрый день! Пишу макрос в excel-ке, но не получается импортировать данные из дбф файла и обработать.
Собственно нужно: в форме экселя пользователь вводит порядковый номер. при нажатии на кнопку формы ексель должен открыть дбф файл, лежащий в той же папке, и по введенному номеру отыскать строку в дбф и вывести наименование определенные стобцы этой стоки в форму эксель.
Если конкретнее: пользвователь вводит бик банка, макрос подключается к дбф-ку и выдает в эксель наименование банка.
Кто что может посоветовать???
Написать необходимо именно на VBA.

Последний раз редактировалось R@v14; 27.05.2010 в 14:18.
R@v14 вне форума Ответить с цитированием
Старый 27.05.2010, 13:31   #2
Sham1963
 
Регистрация: 27.05.2010
Сообщений: 5
По умолчанию

Доброго дня

Переведи сначала из формата .DBF в .XLS, а потом работай, как с обычным файлом:

FN = "file_name_dbf"
ChDir "C:\papka"
Workbooks.Open Filename:="C:\papka\" & FN & ".DBF"
ActiveWorkbook.SaveAs Filename:="C:\papka\" & FN & ".XLS", _
FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False
ActiveWindow.Close
Workbooks.Open Filename:="C:\papka\" & FN & ".XLS"

Это поможет сохранить оригинальный DBF неизменным
Sham1963 вне форума Ответить с цитированием
Старый 27.05.2010, 13:35   #3
R@v14
Пользователь
 
Регистрация: 27.05.2010
Сообщений: 13
По умолчанию

TO Sham1963
*****
А как работать тогда с обычным файлом .xls???
И то, что оригинальный дбф останется не изменным- это не столь важно, т.к. каждый день дбф записывается новый...
Если не сложно укажи, пжлст, как тогда в твоем варианте искать нужную строку в др файле xls?
R@v14 вне форума Ответить с цитированием
Старый 27.05.2010, 13:42   #4
Sham1963
 
Регистрация: 27.05.2010
Сообщений: 5
По умолчанию

s = Range("A1").CurrentRegion.Rows.Coun t ' S - считаем число строк в файле
for i=1 to s
if cells(i,4)= trebuemy_bik then ss=i : exit for ' SS - запомнили нужную строку
next i
Sham1963 вне форума Ответить с цитированием
Старый 27.05.2010, 14:17   #5
R@v14
Пользователь
 
Регистрация: 27.05.2010
Сообщений: 13
По умолчанию

TO Sham1963
*****
Пробую конвертить дбф файл в хлс -ругается у меня екселька.
Вот это ей не нравится:
ActiveWorkbook.SaveAs Filename:="C:\papka\" & FN & ".XLS", _
и FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
(((((((((((((
R@v14 вне форума Ответить с цитированием
Старый 27.05.2010, 14:25   #6
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Цитата:
Сообщение от R@v14 Посмотреть сообщение
Добрый день! Пишу макрос в excel-ке, но не получается импортировать данные из дбф файла и обработать.
Собственно нужно: в форме экселя пользователь вводит порядковый номер. при нажатии на кнопку формы ексель должен открыть дбф файл, лежащий в той же папке, и по введенному номеру отыскать строку в дбф и вывести наименование определенные стобцы этой стоки в форму эксель.
Если конкретнее: пользвователь вводит бик банка, макрос подключается к дбф-ку и выдает в эксель наименование банка.
Кто что может посоветовать???
Написать необходимо именно на VBA?
НЕ знаю поможет ли тебе. Но один раз я столкнулся с одной проблемой смотри эту тему. В моем случае был немного искаженный формат даты DBF. Решить проблему нормального чтения данной даты не получилось, по этой причине я решал ее через Acsess/ В нем я подключил DBF как внешную базу и сделал запрос. выбрав нужные поля БД. Всякий раз когда обновлялась база данный я получал обновленный запрос.
Далее в Excel используя ADO обрабатывал базу.
Код:
Dim Conn As ADODB.Connection
Dim oRes As ADODB.Recordset
Dim oCmd As ADODB.Command
dim st as string, st1 as string

...
Set Conn = New ADODB.Connection
With Conn
    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0"
    .Open cn(i)
End With
st = "Select 'имя нужного поля' fAllMass FROM 'условие отбора' ORDER BY 'поле_сортировка'"
Set oCmd = New ADODB.Command
Set oCmd.ActiveConnection = Conn
With oCmd
    .CommandText = st
    .CommandType = adCmdText
    .Execute
End With
Set oRes = New ADODB.Recordset
Set oRes.ActiveConnection = Conn
oRes.Open oCmd
...
If Not oRes.EOF Then
   st1 = oREs.Field(0) 'если запись найдена
else
   st1="записи с таким индексом нет"
endif
И вообще очень много различных тем с чтением баз данных только нужно искать
Юнлинг вне форума Ответить с цитированием
Старый 27.05.2010, 14:25   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

А если так попробовать?
Код:
ActiveWorkbook.SaveAs "c:\file_name_dbf.XLS"
Скорее всего, макрос ругается из-за отсутствия на диске папки "C:\papka\"
EducatedFool вне форума Ответить с цитированием
Старый 27.05.2010, 14:26   #8
Sham1963
 
Регистрация: 27.05.2010
Сообщений: 5
По умолчанию

1. А excell какой?
2. DBF открывается нормально?
3. Сохрани проще:

ActiveWorkbook.SaveAs Filename:="C:\papka\" & FN & ".XLS"

прим. В FN расширение не должно присутствовать, это чисто ИМЯ!!!
И действительно, papka - это какая-то твоя РЕАЛЬНАЯ ПАПКА!!!

Последний раз редактировалось Sham1963; 27.05.2010 в 14:30.
Sham1963 вне форума Ответить с цитированием
Старый 27.05.2010, 16:07   #9
R@v14
Пользователь
 
Регистрация: 27.05.2010
Сообщений: 13
По умолчанию

))))))))))))))))))) То, что "papka"- это моя какая-то папка- эт я понимаю )
На данный момент уже добился следующего:
макрос открывает дбф файл и добавляет его содержимое на Лист2, остается только доделать поиск нужного бика на листе2 и вывод ячейки с наименованием на лист1.

Столкнулся с такой проблемой: если несколько раз подряд вводить разные бики- то лист2 переполняется, т.к. дбф файл у меня более 10 000 строк ((( думаю, что после каждого нахождения наименования нужно очищать лист2?
Может кто-то подскажет что-то полегче?? Еще проблема- во время заполнения листа2 данными из дбф (несколько секунд)- активным становится окно листа2 и пользователь будет видеть содержимое дбф файла (правда всего несколько секунд)- но, думаю, это будет пугать моих юзверей... можно ли как-то в фоновом режиме передавать данные в лист2?

Последний раз редактировалось R@v14; 27.05.2010 в 17:36. Причина: ексель -2003
R@v14 вне форума Ответить с цитированием
Старый 28.05.2010, 00:50   #10
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Только ради нормального психического состояния юзера убрал содержимое файла,да и скорость увеличил

В текстбох вводите бик -кнопка и получаете название.Пример файла dbf во вложении.Для проверки указаны данные по условным банкам.
к проекту должна быть подключена библиотека ADO
меню Tools / References ... Microsoft ActiveX Data Objects...
Вложения
Тип файла: rar Не пугать Юзера.rar (20.4 Кб, 35 просмотров)
Анализ,обработка данных Недорого

Последний раз редактировалось doober; 28.05.2010 в 01:07.
doober вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с загрузкой в Image Panik666 Мультимедиа в Delphi 1 22.04.2010 03:35
Проблема с загрузкой ОС Vali_T Операционные системы общие вопросы 18 07.04.2010 18:50
Проблема с загрузкой страницы Nester Работа с сетью в Delphi 5 06.11.2009 13:37
Проблема с загрузкой XP. hebu Windows 11 20.07.2009 14:33
Проблема с загрузкой карты. Shadow_1329 Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 13.07.2009 14:35