Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Необъяснимая проблема в VBA Excel

390  1 2 все
BND коренной житель08.07.14 22:17
BND
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 следующая проблема возникает в этой строке
говорит - метод не может быть выполнен
проверяю синтаксис, проверяю параметры - всё отлично.
Пока нахожусь в тупике. Есть идеи?
Чем дольше тут живу, тем больше убеждаюсь, что одаренность немцев не знает границ.
#1 
Murr патриот08.07.14 22:26
Murr
NEW 08.07.14 22:26 
в ответ BND 08.07.14 22:17
Есть идеи?
-----
Есть вопросы.
1. С какими правами запускается <Excel>?
2. Какие файловые системы на дисках (<C:..F:>)?
3. Какие антивири на системах.
единственная разница - у меня русский, у него немецкий Щиндощс
-----
Если кирилица нигде не использована - без разницы
#2 
BND коренной житель08.07.14 22:35
BND
NEW 08.07.14 22:35 
в ответ Murr 08.07.14 22:26
1. С какими правами запускается <Excel>?
везде права админ. если бы не было доступа к диску - ругнулся бы. разве нет?
2. Какие файловые системы на дисках (<C:..F:>)?
всё одинаковое, NTFS . разве есть разница? если посмотреть синтаксис функции Dir, то она должна выдать результат, а не "плохое имя"
3. Какие антивири на системах.
у меня никаких, а там что-то может и стоит. но антивир не ругается и половина макроса отрабатывает нормально.
кириллица есть в названии листов. но кириллица нормально отображается и лист создается.
эксперимент проведу сейчас по этому поводу.
Чем дольше тут живу, тем больше убеждаюсь, что одаренность немцев не знает границ.
#3 
BND коренной житель08.07.14 22:43
BND
NEW 08.07.14 22:43 
в ответ Murr 08.07.14 22:26
кириллицу убрал - проблема та же.
Чем дольше тут живу, тем больше убеждаюсь, что одаренность немцев не знает границ.
#4 
Murr патриот09.07.14 01:14
Murr
NEW 09.07.14 01:14 
в ответ BND 08.07.14 22:35
ругнулся бы. разве нет?
-----
Вероятно. Но это - VB - онО может ругаться на то чего нет или не на то что есть...
разве есть разница?
-----
Разумеется. Вдруг там CDFS?
Посмотрел это
If Dir(FullPathName) <> "" Then
да, тут ошибка - после Then должен быть оператор или символ переноса на другую строку
метод не может быть выполнен
-----
Снова скажу - VB - если у тебя выше некоректно завершилась операция с проверкой чего-то на диске, то файл может быть залочен. Иногда освобождается только после перезагрузки...
#5 
BND коренной житель09.07.14 01:57
BND
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
Чем дольше тут живу, тем больше убеждаюсь, что одаренность немцев не знает границ.
Чем дольше тут живу, тем больше убеждаюсь, что одаренность немцев не знает границ.
#6 
Murr патриот09.07.14 02:50
Murr
NEW 09.07.14 02:50 
в ответ BND 09.07.14 01:57
заверишлась вызовом дебагера
----
Он не всегда вызывается. И более чем не всегда VB не освобождает ресурсы...
Здесь по 1004:
http://msdn.microsoft.com/en-us/library/office/microsoft.office.interop.excel.protectedviewwindow.workbook(v=office.15).aspx
#7 
BND коренной житель09.07.14 11:00
BND
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 проблемная строка
Чем дольше тут живу, тем больше убеждаюсь, что одаренность немцев не знает границ.
#8 
Murr патриот09.07.14 13:29
Murr
NEW 09.07.14 13:29 
в ответ BND 09.07.14 11:00
т.е. вы хотите сказать, что у них особый дебаггер?
-----
Неа... То, что Я говорю - состояние интерпритатора <VB> часто довольно неопределенное - часть ошибок частично обрабатывается.
на моих компьютерах он не реагирует на НЕ проблемы, а у них реагирует?
-----
Твоя проблема - что-то препятствует записи в файл.
Почему именно на том компостере - не знаю.
Область проверки - <FS>, права, блокировки и конфигурация.
как раз к строчке, где Дир особых нареканий нет
-----
Угу... Правда Я бы сделал <Exit Sub> - продолжать то там смысла нет.
Сет Таргет = Щоркбоокс(ЦлиентНаме).Щоркшеетс(ШеетНаме)
Сет Соурце = Щоркбоокс.Опен(МацроПатх, , Труе, , "111")
Сет СоурцеЛ = Соурце.Щоркшеетс(ШеетНаме)
-----
Если ни один из них не <Nothing> - то ройся на предмет конфигурации <sandbox>а.
#9 
AlexNek патриот09.07.14 23:18
AlexNek
NEW 09.07.14 23:18 
в ответ Murr 08.07.14 22:26, Последний раз изменено 09.07.14 23:20 (AlexNek)
В ответ на:
единственная разница - у меня русский, у него немецкий Щиндощс
-----
Если кирилица нигде не использована - без разницы

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

Не только они...
Сегодня встретил интересную проблему.
dbReader.getValue(1) - работает
dbReader.getValue("имя_поля") - не работает, говорит что поле "неправильное"
dbReader.getFieldIndex ("имя_поля") - работает
#12 
Murr патриот10.07.14 01:52
Murr
NEW 10.07.14 01:52 
в ответ AlexNek 10.07.14 00:13
Ты бы хоть сослался на то в чем написано и какие типы...
Но именно за подобные штучки Я <VB> и не люблю... если еще добавить то что работает неявно... и не документировано - вообще удивляюсь что кто-то это пользует...
не работает, говорит что поле "неправильное"
-----
У реадера есть режим однонаправленного реадера - только вперед. Причем - вперед - на уровне полей.
Т.е. когда у тебя выборка "поле1", "поле2", "поле3", то читать надо в том же порядке.
Если читаешь "поле1", "поле3", то "поле2" уже "неправильное" т.к. оно скипнуто для прочтения "поле3" и для его считывания нужно "отмотать" назад.
На <MS SQL> это управляется типом курсора. Можно ли поменять в реадере - не смотрел.
<.getFieldIndex ("имя_поля")> - работает, потому что позиция поля в строке хранится в метаданных реадера/таблицы,
но читать поля все одно будет нужно в правильной последовательности...
#13 
AlexNek патриот10.07.14 07:49
AlexNek
NEW 10.07.14 07:49 
в ответ Murr 10.07.14 01:52
В ответ на:
Ты бы хоть сослался на то в чем написано и какие типы...

вообще то непринципиально, как и в случае с последовательностью чтения полей.
Но чисто для интереса: манагед драйвер Оракла под VB.NET
Последовательность чтения думаю не при чем, как раз расположил строки чтения в порядке следования полей, так как поставил коммент с индексом поля.
Скорее всего дело в том что там поле "виртуальное" - select ....,count(*) as count,....
Вначале решил что имя "count" не нравится.
#14 
BND коренной житель10.07.14 11:14
BND
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 не может быть выполнен.
т.е. теперь ничего не открывается и не закрывается.
просто внутри книги копируется существующий лист.
у меня работает, на том компе нет.
чиню их комп. пока не чинится.
есть идеи?
Чем дольше тут живу, тем больше убеждаюсь, что одаренность немцев не знает границ.
#15 
Murr патриот10.07.14 12:03
Murr
NEW 10.07.14 12:03 
в ответ AlexNek 10.07.14 07:49
Вначале решил что имя "цоунт" не нравится.
-----
Про Оракла - не знаю, под <Ms SQL> - без разницы... у меня, правда, давно вьевшаяся привычка не использовать ключевые слова в качестве идентификатиров...
так как поставил коммент с индексом поля.
-----
Тогда непонятно. Других вариантов вроде не было.
#16 
Murr патриот10.07.14 12:09
Murr
NEW 10.07.14 12:09 
в ответ BND 10.07.14 11:14
есть идеи?
-----
Ну Я бы сказал, что копировать лист сам на себя не есть хорошо, но раз в одномместе работает - значит возможно...
Остается - песочница.
Про нее Я тебе увы ничего не скажу - новодел, для меня, от билли...
Смотри доки на предмет конфигурурования песочницы.
#17 
BND коренной житель10.07.14 12:16
BND
NEW 10.07.14 12:16 
в ответ Murr 10.07.14 12:09
В ответ на:
Ну Я бы сказал, что копировать лист сам на себя не есть хорошо, но раз в одномместе работает - значит возможно...

Сам на себя?!
извиняюсь, а смысл ключа Before
он не копирует сам на себя!!!
Чем дольше тут живу, тем больше убеждаюсь, что одаренность немцев не знает границ.
#18 
Murr патриот10.07.14 12:39
Murr
NEW 10.07.14 12:39 
в ответ BND 10.07.14 12:16
а смысл ключа <Before>
-----
Да, упустил...
он не копирует сам на себя!!!
-----
Хммм...
Сейчас попробовал сделать два одинаково поименованных листа.
Получил ошибку.
Может там уже есть такой лист? Но тогда странно что где-то работает.
#19 
AlexNek патриот10.07.14 21:59
AlexNek
NEW 10.07.14 21:59 
в ответ BND 10.07.14 11:14
В ответ на:
Сделал маленькую тестовую функцию

На моей англицкой также без проблем.
Попробуй ради теста поставить ему другую версию экзела, не немецкую.
Ну и себе на виртуалку кинуть немецкую винду и немецкий экзель.
Может нужно писать Source.Kopie
#20 
1 2 все