Вход на сайт
Необъяснимая проблема в VBA Excel
NEW 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
Чем дольше тут живу, тем больше убеждаюсь,
что одаренность немцев не знает границ.
Чем дольше тут живу, тем больше убеждаюсь, что одаренность немцев не знает границ.
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

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