Вход на сайт
Необъяснимая проблема в VBA Excel
08.07.14 22:17
Написал программу в Ексель 2007.
Проверил работает.
Выяснилось позже, что программа будет работать на Ексель 2010.
Поставил у себя Ексель 2010, проверил - работает.
Поставил на другой чистый компьютер Ексель 2010 - проверил работает.
Привез программу к заказчику - не работает. единственная разница - у меня русский, у него немецкий Windows
ошибки идут просто ужасно странные, например:
Public Function IsFilePresent(FullPathName As String) As Boolean
If Dir(FullPathName) <> "" Then тут ошибка
говорит, что Bad file name на "E:\macro\macro_2014.xlsm" и вызывает Debug
опытным путем установил, что именно комбинация E: вызывает ошибку, остальное без проблем.
на верный путь "C:\macro\macro_2014.xlsm" отрабатывает нормально
и на неверный путь "F:\macro\macro_2014.xlsm" отрабатывает нормально - выдает сообщение о неверном пути.
потом эта часть кода:
Dim Source As Excel.Workbook
Dim Target As Excel.Worksheet
Set Target = Workbooks(ClientName).Worksheets(SheetName)
Set Source = Workbooks.Open(MacroPath, , True, , "111")
Source.Worksheets(SheetName).Copy Before:=Target следующая проблема возникает в этой строке
говорит - метод не может быть выполнен
проверяю синтаксис, проверяю параметры - всё отлично.
Пока нахожусь в тупике. Есть идеи?
Проверил работает.
Выяснилось позже, что программа будет работать на Ексель 2010.
Поставил у себя Ексель 2010, проверил - работает.
Поставил на другой чистый компьютер Ексель 2010 - проверил работает.
Привез программу к заказчику - не работает. единственная разница - у меня русский, у него немецкий Windows
ошибки идут просто ужасно странные, например:
Public Function IsFilePresent(FullPathName As String) As Boolean
If Dir(FullPathName) <> "" Then тут ошибка
говорит, что Bad file name на "E:\macro\macro_2014.xlsm" и вызывает Debug
опытным путем установил, что именно комбинация E: вызывает ошибку, остальное без проблем.
на верный путь "C:\macro\macro_2014.xlsm" отрабатывает нормально
и на неверный путь "F:\macro\macro_2014.xlsm" отрабатывает нормально - выдает сообщение о неверном пути.
потом эта часть кода:
Dim Source As Excel.Workbook
Dim Target As Excel.Worksheet
Set Target = Workbooks(ClientName).Worksheets(SheetName)
Set Source = Workbooks.Open(MacroPath, , True, , "111")
Source.Worksheets(SheetName).Copy Before:=Target следующая проблема возникает в этой строке
говорит - метод не может быть выполнен
проверяю синтаксис, проверяю параметры - всё отлично.
Пока нахожусь в тупике. Есть идеи?
Чем дольше тут живу, тем больше убеждаюсь, что одаренность немцев не знает границ.
NEW 08.07.14 22:26
в ответ BND 08.07.14 22:17
Есть идеи?
-----
Есть вопросы.
1. С какими правами запускается <Excel>?
2. Какие файловые системы на дисках (<C:..F:>)?
3. Какие антивири на системах.
единственная разница - у меня русский, у него немецкий Щиндощс
-----
Если кирилица нигде не использована - без разницы
-----
Есть вопросы.
1. С какими правами запускается <Excel>?
2. Какие файловые системы на дисках (<C:..F:>)?
3. Какие антивири на системах.
единственная разница - у меня русский, у него немецкий Щиндощс
-----
Если кирилица нигде не использована - без разницы
NEW 08.07.14 22:35
в ответ Murr 08.07.14 22:26
1. С какими правами запускается <Excel>?
везде права админ. если бы не было доступа к диску - ругнулся бы. разве нет?
2. Какие файловые системы на дисках (<C:..F:>)?
всё одинаковое, NTFS . разве есть разница? если посмотреть синтаксис функции Dir, то она должна выдать результат, а не "плохое имя"
3. Какие антивири на системах.
у меня никаких, а там что-то может и стоит. но антивир не ругается и половина макроса отрабатывает нормально.
кириллица есть в названии листов. но кириллица нормально отображается и лист создается.
эксперимент проведу сейчас по этому поводу.
везде права админ. если бы не было доступа к диску - ругнулся бы. разве нет?
2. Какие файловые системы на дисках (<C:..F:>)?
всё одинаковое, NTFS . разве есть разница? если посмотреть синтаксис функции Dir, то она должна выдать результат, а не "плохое имя"
3. Какие антивири на системах.
у меня никаких, а там что-то может и стоит. но антивир не ругается и половина макроса отрабатывает нормально.
кириллица есть в названии листов. но кириллица нормально отображается и лист создается.
эксперимент проведу сейчас по этому поводу.
Чем дольше тут живу, тем больше убеждаюсь, что одаренность немцев не знает границ.
NEW 09.07.14 01:14
в ответ BND 08.07.14 22:35
ругнулся бы. разве нет?
-----
Вероятно. Но это - VB - онО может ругаться на то чего нет или не на то что есть...
разве есть разница?
-----
Разумеется. Вдруг там CDFS?
Посмотрел это
If Dir(FullPathName) <> "" Then
да, тут ошибка - после Then должен быть оператор или символ переноса на другую строку
метод не может быть выполнен
-----
Снова скажу - VB - если у тебя выше некоректно завершилась операция с проверкой чего-то на диске, то файл может быть залочен. Иногда освобождается только после перезагрузки...
-----
Вероятно. Но это - VB - онО может ругаться на то чего нет или не на то что есть...
разве есть разница?
-----
Разумеется. Вдруг там CDFS?
Посмотрел это
If Dir(FullPathName) <> "" Then
да, тут ошибка - после Then должен быть оператор или символ переноса на другую строку
метод не может быть выполнен
-----
Снова скажу - VB - если у тебя выше некоректно завершилась операция с проверкой чего-то на диске, то файл может быть залочен. Иногда освобождается только после перезагрузки...
NEW 09.07.14 01:57
в ответ Murr 09.07.14 01:14
разве есть разница?
-----
Разумеется. Вдруг там CDFS?
Везде NTFS. Ругается то странно!!!
диска E: нет и диска F: нет
Почему на диске Е: вызывается дебагер, а на диск F: моё сообщение об ошибки.
Посмотрел это
If Dir(FullPathName) <> "" Then
да, тут ошибка - после Then должен быть оператор или символ переноса на другую строку
Да нет тут ошибки. Я же не стал весь код выкладывать. Если бы в If Then была ошибка, то она бы не касалась аргумента.
Конечно тут дальше идет блок и заканчивется End If
метод не может быть выполнен
-----
Снова скажу - VB - если у тебя выше некоректно завершилась операция с проверкой чего-то на диске, то файл может быть залочен. Иногда освобождается только после перезагрузки...
Если некая операция заверишлась вызовом дебагера, то дальше никуда и ничего не идет, а программа торчит на проблемной точке. кстати файл тот открывается. метод Copy не работает.
за это время было проверено:
1) отрубил антивирус
2) поставил одинаковый Ексель 2010
3) убрал кириллицу из программы - только английский язык
4) запустил у него Ексель с правами администратора
5) проверен набор библиотек - одинаково
разница пока в одном: у меня русская Винда 8, а там немецкий Винд 7
Вот эта часть больше волнует:
(мне необходимо из одной книги в другую скопировать полностью лист, включая все свойства и макросы листа):
Dim Source As Excel.Workbook
Dim Target As Excel.Worksheet
Dim SourceL As Excel.Worksheet
Set Source = Workbooks.Open(MacroPath, , True, , "111")
Set SourceL = Source.Worksheets(SheetName)
SourceL.Copy After:=Target ОШИБКА ТУТ
говорит - Run time error 1004
method copy of _worksheet failed
-----
Разумеется. Вдруг там CDFS?
Везде NTFS. Ругается то странно!!!
диска E: нет и диска F: нет
Почему на диске Е: вызывается дебагер, а на диск F: моё сообщение об ошибки.
Посмотрел это
If Dir(FullPathName) <> "" Then
да, тут ошибка - после Then должен быть оператор или символ переноса на другую строку
Да нет тут ошибки. Я же не стал весь код выкладывать. Если бы в If Then была ошибка, то она бы не касалась аргумента.
Конечно тут дальше идет блок и заканчивется End If
метод не может быть выполнен
-----
Снова скажу - VB - если у тебя выше некоректно завершилась операция с проверкой чего-то на диске, то файл может быть залочен. Иногда освобождается только после перезагрузки...
Если некая операция заверишлась вызовом дебагера, то дальше никуда и ничего не идет, а программа торчит на проблемной точке. кстати файл тот открывается. метод Copy не работает.
за это время было проверено:
1) отрубил антивирус
2) поставил одинаковый Ексель 2010
3) убрал кириллицу из программы - только английский язык
4) запустил у него Ексель с правами администратора
5) проверен набор библиотек - одинаково
разница пока в одном: у меня русская Винда 8, а там немецкий Винд 7
Вот эта часть больше волнует:
(мне необходимо из одной книги в другую скопировать полностью лист, включая все свойства и макросы листа):
Dim Source As Excel.Workbook
Dim Target As Excel.Worksheet
Dim SourceL As Excel.Worksheet
Set Source = Workbooks.Open(MacroPath, , True, , "111")
Set SourceL = Source.Worksheets(SheetName)
SourceL.Copy After:=Target ОШИБКА ТУТ
говорит - Run time error 1004
method copy of _worksheet failed
Чем дольше тут живу, тем больше убеждаюсь,
что одаренность немцев не знает границ.
Чем дольше тут живу, тем больше убеждаюсь, что одаренность немцев не знает границ.
NEW 09.07.14 11:00
в ответ Murr 09.07.14 02:50
т.е. вы хотите сказать, что у них особый дебаггер?
на моих компьютерах он не реагирует на НЕ проблемы, а у них реагирует?
как раз к строчке, где Dir особых нареканий нет, так как её можно было укрепить и я это сделал:
Dim Str As String
On Error Resume Next
Str = Dir(FullPathName)
If Err Then
'файла нет
IsFilePresent = False
Err.Clear
End
End If
а вот строчку с копированием программа просто не хочет выполнять даже
Dim Source As Excel.Workbook
Dim Target As Excel.Worksheet
Dim SourceL As Excel.Worksheet
Set Target = Workbooks(ClientName).Worksheets(SheetName)
Set Source = Workbooks.Open(MacroPath, , True, , "111")
Set SourceL = Source.Worksheets(SheetName)
SourceL.Copy Before:=Target проблемная строка
на моих компьютерах он не реагирует на НЕ проблемы, а у них реагирует?
как раз к строчке, где Dir особых нареканий нет, так как её можно было укрепить и я это сделал:
Dim Str As String
On Error Resume Next
Str = Dir(FullPathName)
If Err Then
'файла нет
IsFilePresent = False
Err.Clear
End
End If
а вот строчку с копированием программа просто не хочет выполнять даже
Dim Source As Excel.Workbook
Dim Target As Excel.Worksheet
Dim SourceL As Excel.Worksheet
Set Target = Workbooks(ClientName).Worksheets(SheetName)
Set Source = Workbooks.Open(MacroPath, , True, , "111")
Set SourceL = Source.Worksheets(SheetName)
SourceL.Copy Before:=Target проблемная строка
Чем дольше тут живу, тем больше убеждаюсь, что одаренность немцев не знает границ.
NEW 09.07.14 13:29
в ответ BND 09.07.14 11:00
т.е. вы хотите сказать, что у них особый дебаггер?
-----
Неа... То, что Я говорю - состояние интерпритатора <VB> часто довольно неопределенное - часть ошибок частично обрабатывается.
на моих компьютерах он не реагирует на НЕ проблемы, а у них реагирует?
-----
Твоя проблема - что-то препятствует записи в файл.
Почему именно на том компостере - не знаю.
Область проверки - <FS>, права, блокировки и конфигурация.
как раз к строчке, где Дир особых нареканий нет
-----
Угу... Правда Я бы сделал <Exit Sub> - продолжать то там смысла нет.
Сет Таргет = Щоркбоокс(ЦлиентНаме).Щоркшеетс(ШеетНаме)
Сет Соурце = Щоркбоокс.Опен(МацроПатх, , Труе, , "111")
Сет СоурцеЛ = Соурце.Щоркшеетс(ШеетНаме)
-----
Если ни один из них не <Nothing> - то ройся на предмет конфигурации <sandbox>а.
-----
Неа... То, что Я говорю - состояние интерпритатора <VB> часто довольно неопределенное - часть ошибок частично обрабатывается.
на моих компьютерах он не реагирует на НЕ проблемы, а у них реагирует?
-----
Твоя проблема - что-то препятствует записи в файл.
Почему именно на том компостере - не знаю.
Область проверки - <FS>, права, блокировки и конфигурация.
как раз к строчке, где Дир особых нареканий нет
-----
Угу... Правда Я бы сделал <Exit Sub> - продолжать то там смысла нет.
Сет Таргет = Щоркбоокс(ЦлиентНаме).Щоркшеетс(ШеетНаме)
Сет Соурце = Щоркбоокс.Опен(МацроПатх, , Труе, , "111")
Сет СоурцеЛ = Соурце.Щоркшеетс(ШеетНаме)
-----
Если ни один из них не <Nothing> - то ройся на предмет конфигурации <sandbox>а.
NEW 09.07.14 23:18
сразу видно человек не работает в микрософте
Есть один маленький ньюанс, в немецкой винде вместо "." используется "," и экзелу это страшно не нравится. Не, ну когда в одной системе работаешь то все в порядке, а вот если файл потаскать туда сюда...
Да и еще какой то умник решил что имена функций также нужно переводить.
С VBA дел особо не имел, но основная разница между двумя системами именно в локалях по умолчанию. В свое время много крови выпили. Еще имена системных папок в эсплоере отличаются
В ответ на:
единственная разница - у меня русский, у него немецкий Щиндощс
-----
Если кирилица нигде не использована - без разницы
единственная разница - у меня русский, у него немецкий Щиндощс
-----
Если кирилица нигде не использована - без разницы
сразу видно человек не работает в микрософте

Есть один маленький ньюанс, в немецкой винде вместо "." используется "," и экзелу это страшно не нравится. Не, ну когда в одной системе работаешь то все в порядке, а вот если файл потаскать туда сюда...
Да и еще какой то умник решил что имена функций также нужно переводить.
С VBA дел особо не имел, но основная разница между двумя системами именно в локалях по умолчанию. В свое время много крови выпили. Еще имена системных папок в эсплоере отличаются
NEW 09.07.14 23:48
в ответ AlexNek 09.07.14 23:18
и экзелу это страшно не нравится.
-----
Где-то в <VB Excel> есть возможность получить системные установки для текущего системного разделителя.
Но <VB>исты такими мелочами не занимаются - хардкодят... в лучшем случае - выносят в переменную...
С ВБА дел особо не имел, но основная разница между двумя системами именно в локалях по умолчанию.
-----
Имел. Давно. Во времена <Access 2>.
Основная разница - в мозгах тех, кто разрабатывает софт обычными методами и роет полудокументированные возможности <VBA>.
<VBA>, кстати, позволяет оформлять код в виде классов. С ограничениями, но все же с какой-никакой инкапсуляцией...
Только в <VBA> этим никто не пользуется...
Еще имена системных папок в эсплоере отличаются
-----
Если ты их получаешь из реестра - без разницы. Проблема - <VBA>шники не всегда понимают в какой ячейке шита это хранится...
-----
Где-то в <VB Excel> есть возможность получить системные установки для текущего системного разделителя.
Но <VB>исты такими мелочами не занимаются - хардкодят... в лучшем случае - выносят в переменную...
С ВБА дел особо не имел, но основная разница между двумя системами именно в локалях по умолчанию.
-----
Имел. Давно. Во времена <Access 2>.
Основная разница - в мозгах тех, кто разрабатывает софт обычными методами и роет полудокументированные возможности <VBA>.
<VBA>, кстати, позволяет оформлять код в виде классов. С ограничениями, но все же с какой-никакой инкапсуляцией...
Только в <VBA> этим никто не пользуется...
Еще имена системных папок в эсплоере отличаются
-----
Если ты их получаешь из реестра - без разницы. Проблема - <VBA>шники не всегда понимают в какой ячейке шита это хранится...

<--- nobody
harmed in this action -->
NEW 10.07.14 00:13
Не только они...
Сегодня встретил интересную проблему.
dbReader.getValue(1) - работает
dbReader.getValue("имя_поля") - не работает, говорит что поле "неправильное"
dbReader.getFieldIndex ("имя_поля") - работает
в ответ Murr 09.07.14 23:48
В ответ на:
Проблема - <VBA>шники не всегда понимают в какой ячейке шита это хранится
Проблема - <VBA>шники не всегда понимают в какой ячейке шита это хранится
Не только они...
Сегодня встретил интересную проблему.
dbReader.getValue(1) - работает
dbReader.getValue("имя_поля") - не работает, говорит что поле "неправильное"
dbReader.getFieldIndex ("имя_поля") - работает
NEW 10.07.14 01:52
в ответ AlexNek 10.07.14 00:13
Ты бы хоть сослался на то в чем написано и какие типы...
Но именно за подобные штучки Я <VB> и не люблю... если еще добавить то что работает неявно... и не документировано - вообще удивляюсь что кто-то это пользует...
не работает, говорит что поле "неправильное"
-----
У реадера есть режим однонаправленного реадера - только вперед. Причем - вперед - на уровне полей.
Т.е. когда у тебя выборка "поле1", "поле2", "поле3", то читать надо в том же порядке.
Если читаешь "поле1", "поле3", то "поле2" уже "неправильное" т.к. оно скипнуто для прочтения "поле3" и для его считывания нужно "отмотать" назад.
На <MS SQL> это управляется типом курсора. Можно ли поменять в реадере - не смотрел.
<.getFieldIndex ("имя_поля")> - работает, потому что позиция поля в строке хранится в метаданных реадера/таблицы,
но читать поля все одно будет нужно в правильной последовательности...
Но именно за подобные штучки Я <VB> и не люблю... если еще добавить то что работает неявно... и не документировано - вообще удивляюсь что кто-то это пользует...
не работает, говорит что поле "неправильное"
-----
У реадера есть режим однонаправленного реадера - только вперед. Причем - вперед - на уровне полей.
Т.е. когда у тебя выборка "поле1", "поле2", "поле3", то читать надо в том же порядке.
Если читаешь "поле1", "поле3", то "поле2" уже "неправильное" т.к. оно скипнуто для прочтения "поле3" и для его считывания нужно "отмотать" назад.
На <MS SQL> это управляется типом курсора. Можно ли поменять в реадере - не смотрел.
<.getFieldIndex ("имя_поля")> - работает, потому что позиция поля в строке хранится в метаданных реадера/таблицы,
но читать поля все одно будет нужно в правильной последовательности...
NEW 10.07.14 07:49
вообще то непринципиально, как и в случае с последовательностью чтения полей.
Но чисто для интереса: манагед драйвер Оракла под VB.NET
Последовательность чтения думаю не при чем, как раз расположил строки чтения в порядке следования полей, так как поставил коммент с индексом поля.
Скорее всего дело в том что там поле "виртуальное" - select ....,count(*) as count,....
Вначале решил что имя "count" не нравится.
в ответ Murr 10.07.14 01:52
В ответ на:
Ты бы хоть сослался на то в чем написано и какие типы...
Ты бы хоть сослался на то в чем написано и какие типы...
вообще то непринципиально, как и в случае с последовательностью чтения полей.
Но чисто для интереса: манагед драйвер Оракла под VB.NET
Последовательность чтения думаю не при чем, как раз расположил строки чтения в порядке следования полей, так как поставил коммент с индексом поля.
Скорее всего дело в том что там поле "виртуальное" - select ....,count(*) as count,....
Вначале решил что имя "count" не нравится.
NEW 10.07.14 11:14
в ответ AlexNek 10.07.14 07:49
Сделал маленькую тестовую функцию:
Public Const SheetCfg As String = "cfg"
Sub Test()
Dim Target As Excel.Worksheet
Dim Source As Excel.Worksheet
ClientName = ActiveWorkbook.Name
'куда копировать
Set Target = Workbooks(ClientName).Worksheets(SheetCfg)
'откуда копировать
Set Source = Workbooks(ClientName).Worksheets(SheetCfg)
'Копирование листа
Source.Copy Before:=Target
End Sub
проблемная красная строка.
ошибка Run-Error 1004 метод Copy не может быть выполнен.
т.е. теперь ничего не открывается и не закрывается.
просто внутри книги копируется существующий лист.
у меня работает, на том компе нет.
чиню их комп. пока не чинится.
есть идеи?
Public Const SheetCfg As String = "cfg"
Sub Test()
Dim Target As Excel.Worksheet
Dim Source As Excel.Worksheet
ClientName = ActiveWorkbook.Name
'куда копировать
Set Target = Workbooks(ClientName).Worksheets(SheetCfg)
'откуда копировать
Set Source = Workbooks(ClientName).Worksheets(SheetCfg)
'Копирование листа
Source.Copy Before:=Target
End Sub
проблемная красная строка.
ошибка Run-Error 1004 метод Copy не может быть выполнен.
т.е. теперь ничего не открывается и не закрывается.
просто внутри книги копируется существующий лист.
у меня работает, на том компе нет.
чиню их комп. пока не чинится.
есть идеи?
Чем дольше тут живу, тем больше убеждаюсь, что одаренность немцев не знает границ.
NEW 10.07.14 12:03
в ответ AlexNek 10.07.14 07:49
Вначале решил что имя "цоунт" не нравится.
-----
Про Оракла - не знаю, под <Ms SQL> - без разницы... у меня, правда, давно вьевшаяся привычка не использовать ключевые слова в качестве идентификатиров...
так как поставил коммент с индексом поля.
-----
Тогда непонятно. Других вариантов вроде не было.
-----
Про Оракла - не знаю, под <Ms SQL> - без разницы... у меня, правда, давно вьевшаяся привычка не использовать ключевые слова в качестве идентификатиров...
так как поставил коммент с индексом поля.
-----
Тогда непонятно. Других вариантов вроде не было.
NEW 10.07.14 12:09
в ответ BND 10.07.14 11:14
есть идеи?
-----
Ну Я бы сказал, что копировать лист сам на себя не есть хорошо, но раз в одномместе работает - значит возможно...
Остается - песочница.
Про нее Я тебе увы ничего не скажу - новодел, для меня, от билли...
Смотри доки на предмет конфигурурования песочницы.
-----
Ну Я бы сказал, что копировать лист сам на себя не есть хорошо, но раз в одномместе работает - значит возможно...
Остается - песочница.
Про нее Я тебе увы ничего не скажу - новодел, для меня, от билли...
Смотри доки на предмет конфигурурования песочницы.
NEW 10.07.14 12:16
Сам на себя?!
извиняюсь, а смысл ключа Before
он не копирует сам на себя!!!
в ответ Murr 10.07.14 12:09
В ответ на:
Ну Я бы сказал, что копировать лист сам на себя не есть хорошо, но раз в одномместе работает - значит возможно...
Ну Я бы сказал, что копировать лист сам на себя не есть хорошо, но раз в одномместе работает - значит возможно...
Сам на себя?!
извиняюсь, а смысл ключа Before

он не копирует сам на себя!!!
Чем дольше тут живу, тем больше убеждаюсь, что одаренность немцев не знает границ.