Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ошибка при повторном выполнении того же самого кода / 10 сообщений из 10, страница 1 из 1
21.12.2020, 13:46
    #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
21.12.2020, 15:09
    #40029761
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном выполнении того же самого кода
Правильно появляется. Потому что должно быть не
Код: vbnet
1.
Range("1:1").Select

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

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

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

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

И в предыдущем, и во втором случае методы должны быть привязаны к родительским объектам, а у вас они зависают в воздухе, что приводит к неявному созданию второго экземпляра Excel.Application, который после первого выполнения кода остается в процессах и всё портит.
Кроме того, есть претензии к Select и Selection. Если вы не собираетесь наслаждаться процессом на экране - не используйте их.
...
Рейтинг: 0 / 0
21.12.2020, 16:55
    #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
21.12.2020, 17:25
    #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
21.12.2020, 17:38
    #40029848
papant1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при повторном выполнении того же самого кода
Кривцов Анатолий,

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

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

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

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


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