Диалоговое окно выбора диапазона

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

Вот, "остатки" рабочей книги проекта ))
Удалил ВСЕ кроме одного листа и одного модуля с единственной процедурой.
Затем вставил просто чистый лист. И теперь - на чистом листе работает, на листе Склад - нет :confused: Причем, не работало ни на одном листе проекта, их там много, пробовал на разных .
Может кто - нибудь это обьяснить? :confused:
Вложения
Быттехника.zip
(19.2 КБ) 27 скачиваний
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
heisnod
Сообщения: 70
Зарегистрирован: 24 ноя 2008, 16:53

я удалили тот бред что написал. меня ввело в заблуждение то, что если запустить ту процедуру как макрос то ошибка не выскакивает
Вложения
Быттехника.zip
(10.31 КБ) 34 скачивания
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

Проблема заключается в форматах ячеек на листе СКЛАД.

Попробуйте скопировать содержимое листа СКЛАД,
после чего при помощи команды Правка - Специальная вставка
вставлять содержимое листа СКЛАД на новый лист.

После всех вариантов вставки, кроме варианта со вставкой форматов ячеек, макрос работает, а если копируем вместе с форматами - то перестаёт :)

Как тут не вспомнишь маму Билла Гейтса :)

Кстати, если на листе СКЛАД расположить автофигуру, и назначить ей макрос, то он работает :) почему-то...

Наконец-то нашел, в чём дело: проблема была в форматах ячеек во 2-м столбце.
Если Вы выделите заполенные ячейки в столбце В, и очистите формат этих ячеек (Правка - Очистить - Форматы), то макрос начнёт работать :)
Или достаточно скопировать формат 3-го столбца на второй.

И вот теперь думайте, какое отношение имеет Application.InputBox к форматам ячеек :)
heisnod
Сообщения: 70
Зарегистрирован: 24 ноя 2008, 16:53

Спасибо, чувак! А то я уже нервничать начал=)
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

EducatedFool, уму не постижимо !!!
Спасибо!!!
Я тоже все утро бьюсь пытаясь понять, где собака порылась)))
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
heisnod
Сообщения: 70
Зарегистрирован: 24 ноя 2008, 16:53

А что там за формат такой был странный? Что ты с колонкой B делал?
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

Ответ подсказал анализ структуры этого файла в формате XML:
<ConditionalFormatting xmlns="urn:schemas-microsoft-com :o ffice:excel">
<Range>R2C2:R10C2</Range>
<Condition>
<Value1>COUNTIF(C2,RC)>1</Value1>
<Format Style='background:yellow'/>
</Condition>
</ConditionalFormatting>

Причина была в условном форматировании этих ячеек:
=СЧЁТЕСЛИ($B:$B;B2)>1

После удаления условного форматирования макрос сразу заработал.

Причем если убрать эту формулу, и поставить условия форматирования по значению - макрос начинает работать...
Видимо, проблема в формуле...
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

EducatedFool, и правда, ну как тут не вспомнить маму Била )))
Ведь стоит немного сдвинуть лист скролом влево, или просто выбирать ячейки в столбцах подальше от столбца В, да даже просто "оттащить" куда либо в сторону саму форму - все работает. Хоть с кнопки, хоть из редактора VBE.
Без удаления форматов в этом столбце )).
Но мне вся эта музыка нужна для выделения ячеек в столбце Е (цена), вот теперь думать надо, как быть.
Форматы удалять не хочется, они предназначены для выявления дублей кода в столбце В.
Может "подвесить" на кнопку еще и удаление/восстановление форматов :rolleyes:
Во дела.......... :D
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Teslenko_EA
Сообщения: 526
Зарегистрирован: 04 фев 2007, 18:37
Откуда: Сургут
Контактная информация:

Здравствуйте VictorM.
Думаю ошибки можно попытаться обойти

Код: Выделить всё

Sub printArea()
On Error Resume Next
Dim o As Object
Set o = Application.InputBox("Label ", , ActiveCell.Address, , , , , 8)
Debug.Print o.Address
End Sub
Евгений.
P.S. но как выяснилось обойти нельзя, код с Вашим "проблемным" документом не работает :(
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

Teslenko_EA, спасибо!!!
Обязательно попробую.
Вот из такого, казалось бы простого вопроса возникла такая интересная тема )))
Оказывается, это официально зарегистрированный баг!!!
Вот что ответил pashulka на соседнем форуме: ссылка
*****
Это тот редкий случай, когда не стоит искать причину(читайте ошибку) в своих действиях, ибо это официально зарегистрированный баг и заключается он в том, что при наличии условного форматирования, где критерием служат некие формулы, функция Application.InputBox действительно возвращает False.

Бороться с этим безобразием можно использовав, уже вышеупомянутый DialogSheet + EditBox, либо UserForm + RefEdit (дешёвая замена EditBox), только не забудьте, что полученный адрес диапазона будет зависеть от нотации A1/R1C1, тогда как попытка использовать адрес в стиле R1C1 неизменно приведёт к ошибке, которую можно избежать, если либо предварительно установить нужный стиль ссылок :

Код Visual Basic
Application.ReferenceStyle = xlA1 'без проверки


Код Visual Basic
If Application.ReferenceStyle = xlR1C1 _
Then Application.ReferenceStyle = xlA1 'с проверкой


кстати, несмотря на кажущуюся ненужность проверки, она всё-таки имеет право на существование, к примеру, при работе макроса на чужих машинах, ибо в таких случаях, правила хорошего тона просят вернуть всё на круги своя.

либо конвертировать полученный адрес :

Код Visual Basic
iAddress = ThisWorkbook.DialogSheets(1).EditBoxes(1).Text

If Application.ReferenceStyle = xlR1C1 Then _
iAddress = Application.ConvertFormula(Formula:= _
iAddress, FromReferenceStyle:=xlR1C1, ToReferenceStyle:=xlA1)
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Ответить