Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
2 / 2 / 0
Регистрация: 05.01.2013
Сообщений: 69
1

Ошибка: указан недопустимый обьект, или обьект более не задан

06.01.2013, 22:10. Просмотров 2316. Ответов 8
Метки нет (Все метки)


Что не так в этом коде ?

Visual Basic
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
Sub abv()
 
Dim rst As Recordset, str As String, i As Byte, fld As String
Dim tdf As TableDef
 
 
 
 
Set rst = CurrentDb.OpenRecordset("select * from Yahoo_котировки_связная;")    
Set tdf = CurrentDb.TableDefs("Yahoo_котировки")
DoCmd.SetWarnings False
 
If Not (rst.EOF) Then
    For i = 0 To rst.Fields.Count - 1               
        While Not (rst.EOF)                        
        
            If str <> "" Then str = str & ","
            
            str = str & Nz(rst.Fields(i).Value, 0)  
            
            If fld <> "" Then fld = fld & ","
            
            fld = fld & tdf.Fields(rst.AbsolutePosition).Name  ' вот здесь выдает ошибку
            rst.MoveNext
        Wend
        DoCmd.RunSQL "INSERT INTO Yahoo_котировки (" & fld & ") VALUES (" & str & ");" 
        str = "": fld = ""     
        rst.MoveFirst           
    Next
End If
DoCmd.SetWarnings True
End Sub
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.01.2013, 22:10
Ответы с готовыми решениями:

Какой обьект или какие метоты позволяют обрабатывать события undo и redo?
привет НАРОД какой обьект или какие метоты позволяют обрабатывать события undo и redo, как ими...

обьект по ссылке
класс cls_Settings: Public bkMain, bkTmp, shMain, shTmp As String Public columnListMain As...

Указан недопустимый обьект, или обьект более не задан
Не могу понять как это происходит и почему. В открывшейся форме нажмите кнопку фф и вам выпадет...

Как конвертировать обьект типа System.Drawing.Image в обьект System.Web.UI.WebControls.Image
Буду очень благодарен тому кто поможет

8
5349 / 1413 / 332
Регистрация: 23.12.2010
Сообщений: 2,081
Записей в блоге: 1
06.01.2013, 23:14 2
Для объектной переменной tdf не задан объект, не было команды Set tdf.
0
2 / 2 / 0
Регистрация: 05.01.2013
Сообщений: 69
06.01.2013, 23:46  [ТС] 3
можете написать как должно быть ?

Добавлено через 58 секунд
Set tdf = CurrentDb.TableDefs("Yahoo_котировки") а это что ?

Добавлено через 1 минуту
это было указано в 10й строке , видимо когда переносил Казанский не перенес весь код
0
15015 / 6343 / 1725
Регистрация: 24.09.2011
Сообщений: 9,976
07.01.2013, 00:49 4
Я ничего не переносил Просто выделил код и нажал кнопку VB.
Так, что ли?
0
5349 / 1413 / 332
Регистрация: 23.12.2010
Сообщений: 2,081
Записей в блоге: 1
08.01.2013, 11:10 5
В выражении tdf.Fields(rst.AbsolutePosition).Name
rst.AbsolutePosition это номер текущей записи в базе данных, который никак не связан с индексом коллекции полей tdf.Fields и может превышать количество полей в TableDefs.
1
2 / 2 / 0
Регистрация: 05.01.2013
Сообщений: 69
09.01.2013, 01:51  [ТС] 6
А как тогда правильно записать ?
0
Эксперт MS Access
26610 / 14309 / 3166
Регистрация: 28.04.2012
Сообщений: 15,691
09.01.2013, 07:04 7
Цитата Сообщение от aae1 Посмотреть сообщение
А как тогда правильно записать ?
Код, вообще говоря, неясный. Непонятно, что надо получить в результате. Но предположим, что вы добавляете записи из временной таблицы, например из екселя, в постоянную.

По сабжу. Надо изменить подход. В программе динамически формируется строка запроса и списки полей. Так вот списки полей следует получить ДО прохода по рекордсету или таблдефу, они ведь в таблице неизменны и незачем готовить их заново во вложенном цикле. И вместо цикла запросов с Values, достаточно одного
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub abv()
 
Dim rst As DAO.Recordset, str As String, i As Byte, fld As String, s As String
Dim tdf As TableDef
Set rst = CurrentDb.OpenRecordset("select * from Yahoo_котировки_связная;")    
Set tdf = CurrentDb.TableDefs("Yahoo_котировки")
 
If Not (rst.EOF) Then
    For i = 0 To rst.Fields.Count - 1               
            str = str & "[" & rst.Fields(i).Name & "]" & "," 
    Next
    str = Left(str, Len(str)-1)
 
    For i=0 To tdf.Fields.Count - 1
            fld = fld & "[" & rst.Fields(i).Name & "]" & "," 
    Next
    fld = Left(fld, Len(fld)-1)
 
    s="INSERT INTO Yahoo_котировки (" & fld & ") select " & str & " from [Yahoo_котировки_связная]" 
    Debug.Print s
    Currentdb.Execute s
 
End If
End Sub
ЗЫ. Не проверял

Добавлено через 1 час 1 минуту
В втором цикле описка. Надо заменить rst на tdf
Visual Basic
1
            fld = fld & "[" & tdf.Fields(i).Name & "]" & ","
1
2 / 2 / 0
Регистрация: 05.01.2013
Сообщений: 69
10.01.2013, 02:21  [ТС] 8
спасибо буду пробовать

Добавлено через 3 часа 8 минут
Выдает такую же ошибку как только подходит к строке
Visual Basic
1
For i = 0 To tdf.Fields.Count - 1
нашел на просторах интернета вот этот моментик
----------------------------------------------------
Владимир Саныч
Иван FXS
Set td = CurrentDb.TableDefs("myTable")
- выдает "Run-time error '3420': Указан недопустимый объект, или объект более не задан."
-----------------------------------------------------------------------------------------------------
Это известное явление. Currentdb надо либо запомнить в переменной, либо вынести в строку With.
--------------------------------------
Или TableDefs запомнить в переменную (или в блок With)
----------------------------------------------------------------------------------

Может дело в этом ??????????

Добавлено через 17 минут
Visual Basic
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
Sub abv()
 
Dim rst As DAO.Recordset, str As String, i As Byte, fld As String, s As String
Dim tdf As TableDef
Dim CD As Database
Set CD = CurrentDb
Set rst = CD.OpenRecordset("select * from Yahoo_êîòèðîâêè_ñâÿçíàÿ;")
Set tdf = CD.TableDefs("Yahoo_êîòèðîâêè")
 
If Not (rst.EOF) Then
    For i = 0 To rst.Fields.Count - 1
            str = str & "[" & rst.Fields(i).Name & "]" & ","
    Next
    str = Left(str, Len(str) - 1)
 
    For i = 0 To tdf.Fields.Count - 1
            fld = fld & "[" & tdf.Fields(i).Name & "]" & ","
    Next
    fld = Left(fld, Len(fld) - 1)
 
    s = "INSERT INTO Yahoo_êîòèðîâêè (" & fld & ") select " & str & " from [Yahoo_êîòèðîâêè_ñâÿçíàÿ]"
    Debug.Print s
    CurrentDb.Execute s
 
End If
MsgBox "ok"
End Sub
Вобщем все исправил , ошибки теперь ни какой нет , но поля не заполняет
0
Эксперт MS Access
26610 / 14309 / 3166
Регистрация: 28.04.2012
Сообщений: 15,691
10.01.2013, 12:17 9
Цитата Сообщение от aae1 Посмотреть сообщение
Вобщем все исправил , ошибки теперь ни какой нет , но поля не заполняет
В тексте программы есть команда распечатки полученной (сформированной) строки запроса Debug.Print s. После выполнения кода, скопируйте готовую строку из области отладки (Immediate), создайте запрос в Access, вставьте скопированное в режиме SQL-редактора запроса и попробуйте выполнить. Возможно, компилятор запросов подскажет источник ошибки. Если не разберетесь сами, скопируйте скл-строку сюда.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2013, 12:17

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Date это обьект или класс?
я вообще не понимаю этого типа данных. Я знаю C#, там все понятно, а здесь бред какойто. В учебнике...

Динамический обьект или класс + GDI?
Есть непростая проблемка. Поигрался я как-то в Sherlock Holmes vs. Jack the Ripper и захотелось мне...

Как создать на форме батн или другой обьект?
Хелло ворлд!!! Ребята как с кода создать обиект? т.е если нажато на Button1 то создать на...

Это обьект, переменная или что? Как то вовсе непонятно
Пожалуста, обьясните подробно что такое rhs!! // Функция Add #include &lt;string&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.