powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ошибка при повторном выполнении того же самого кода
10 сообщений из 10, страница 1 из 1
Ошибка при повторном выполнении того же самого кода
    #40029731
papant1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, помогите пожалуйста с кодом. Проблема в том, что указанный код хорошо отрабатывает только один раз при его запуске, при повторном запуске процедуры, содержащей этот код, вываливается ошибка
Run-time error '1004'. Method 'Range' of object '_Global' failed
Ошибка проявляется в строке Range("1:1").Select. Что с ней не так и почему она нормально отрабатывает первый раз я понять не могу. Нашел подобную проблему у человека вот тут
https://stackoverflow.com/questions/14168468/run-time-error-1004-method-rows-of-object-global-failed
но что именно мне надо подправить в своем коде я так и не понял (((
Буду рад если поможете разобраться в проблеме
Заранее спасибо


Код: vbnet
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.
sFiles = Dir(sFolder & "*.csv") 'открываем все файлы из папки
    Do While sFiles <> ""         ' пока не кончились файлы
        Set wb = app.Workbooks.Open(sFolder & sFiles)       'открываем файл
        lLastRow = wb.Worksheets(1).UsedRange.Row + wb.Worksheets(1).UsedRange.Rows.Count - 1   'ищем последнюю строку на листе
   
           With wb.Worksheets(1) ' работаем с первым листом в книге
 ' следующая строка вызывает указанную ошибку
                Range("1:1").Select      ' выбираем первую строку экселевского файла
                Selection.Replace What:=" ", Replacement:="_", LookAt:=xlPart, _
                         SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
                         ReplaceFormat:=False
  ' и заменяем все названия столбцов с пробелом на с подчеркиванием
                
                .Columns("A:A").Select ' выбираем первый столбец
                Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
                 TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
                Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
                :="|", FieldInfo:=Array(Array(1, 4), Array(2, 4), Array(3, 2), Array(4, 2), Array(5, 2), _
                Array(6, 2), Array(7, 2), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12 _
                , 1), Array(13, 1)), TrailingMinusNumbers:=True
              
' растаскиваем его по столбцам по символу |

            CntRow = "A1:M" & lLastRow  ' формируем диапазон
            DoCmd.TransferSpreadsheet acImport, 10, "import", sFolder + sFiles, True, CntRow   ' вставляем в таблицу import значения диапазона
           End With
           app.DisplayAlerts = False
           wb.Close False
           Set wb = Nothing
        sFiles = Dir
    Loop
...
Рейтинг: 0 / 0
Ошибка при повторном выполнении того же самого кода
    #40029761
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно появляется. Потому что должно быть не
Код: vbnet
1.
Range("1:1").Select

а
Код: vbnet
1.
.Range("1:1").Select
...
Рейтинг: 0 / 0
Ошибка при повторном выполнении того же самого кода
    #40029766
papant1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
если сделать с точкой как вы говорите, то тоже первый раз отрабатывает нормально, при повторном выполнении кода ошибка
run-time error 91, Object variable or With block variable not set.
Что он от меня хочет я не пойму.
И почему тогда первый раз отрабатывает?
...
Рейтинг: 0 / 0
Ошибка при повторном выполнении того же самого кода
    #40029768
papant1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
papant1,

Да, забыл добавить, что ошибка при этом появляется в следующей строке:
Selection.Replace What:=" ", Replacement:="_", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
...
Рейтинг: 0 / 0
Ошибка при повторном выполнении того же самого кода
    #40029778
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
papant1, перед выполнением команды Selection.Replace просмотрите в отладчике свойства объекта Selection....может что и прояснится
...
Рейтинг: 0 / 0
Ошибка при повторном выполнении того же самого кода
    #40029798
papant1Да, забыл добавить, что ошибка при этом появляется в следующей строке:
Selection.Replace

Правильно появляется. Потому что должно быть не
Код: vbnet
1.
Selection.Replace

а
Код: vbnet
1.
app.Selection.Replace

И в предыдущем, и во втором случае методы должны быть привязаны к родительским объектам, а у вас они зависают в воздухе, что приводит к неявному созданию второго экземпляра Excel.Application, который после первого выполнения кода остается в процессах и всё портит.
Кроме того, есть претензии к Select и Selection. Если вы не собираетесь наслаждаться процессом на экране - не используйте их.
...
Рейтинг: 0 / 0
Ошибка при повторном выполнении того же самого кода
    #40029823
papant1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кривцов Анатолий, спасибо, стало более понятно (немного) в части того, что создается второй объект экселя и в нем уже видимо ищется в selection что-то и не может найти. Поменял сейчас код на

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
With wb.Worksheets(1)
                .Range("1:1").Select
                app.Selection.Replace What:=" ", Replacement:="_", LookAt:=xlPart, _
                         SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
                         ReplaceFormat:=False
  
                .Columns("A:A").Select
                app.Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
                 TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
                Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
                :="|", FieldInfo:=Array(Array(1, 4), Array(2, 4), Array(3, 2), Array(4, 2), Array(5, 2), _
                Array(6, 2), Array(7, 2), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12 _
                , 1), Array(13, 1)), TrailingMinusNumbers:=True
              
            lLastRow = .UsedRange.Row + .UsedRange.Rows.Count - 1
            CntRow = "A1:M" & lLastRow
            DoCmd.TransferSpreadsheet acImport, 10, "import", sFolder + sFiles, True, CntRow
End With



Теперь ошибка 1004 появляется в строке app.Selection.TextToColumns Destination ((((
Однако до моего сознания не может никак дойти то, чем в первом случае select отличается от второго и вываливается ошибка

По поводу использования Select и selection не особо парит, использую app.visible=false
...
Рейтинг: 0 / 0
Ошибка при повторном выполнении того же самого кода
    #40029838
papant1
Теперь ошибка 1004 появляется в строке app.Selection.TextToColumns Destination ((((
Однако до моего сознания не может никак дойти то, чем в первом случае select отличается от второго и вываливается ошибка

Код: vbnet
1.
2.
.Columns("A:A").Select
app.Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, ...

Та же песня, Range("A1") из воздуха.
Вообще, попробуйте этот кусок так:
Код: vbnet
1.
.Columns("A:A").TextToColumns Destination:= .Range("A1"), DataType:=xlDelimited, ...
...
Рейтинг: 0 / 0
Ошибка при повторном выполнении того же самого кода
    #40029848
papant1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кривцов Анатолий,

Та же песня, Range("A1") из воздуха.
Вообще, попробуйте этот кусок так:

УРААА, заработало! Без selection )
Анатолий, сообщите плиз ваш тел в личку, начислю Вам на пиво донат - искал эту ошибку с вечера пятницы и всю субботу. Сегодня решил спросить на форуме и проблему решили очень быстро!

Все, тему можно закрывать
...
Рейтинг: 0 / 0
Ошибка при повторном выполнении того же самого кода
    #40030740
papant1, заработало, и ладненько. Пиво лучше выпейте сами за моё и Akina здоровье. :)

Но есть пара вопросов:
1. Зачем вы для импорта в Акс из текстового CSV файла используете Excel? Если у вас действительно в качестве разделителей полей используются и Tab, и "|", то оправдано, а если только "|", то с этим легко справится и сам Акс.
2. Если бы вы после распределения по столбцам сохранили файл в формате XLS, закрыли, а затем выполнили импорт, то это логично. А в вашем коде DoCmd.TransferSpreadsheet выполняется из текстового файла с несохраненными изменениями, открытого в данный момент.
И это работает?!!! Я, наверное, чего-то не понимаю...
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ошибка при повторном выполнении того же самого кода
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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