inputbox с двумя полями ввода
Модератор: Naeel Maqsudov
Уважаемые, вдруг такое возможно: можно ли inputbox делать с двумя полями для ввода? Одно, к примеру, для ввода информации КОТОРУЮ надо заменить, второе - КАКОЙ информацией надо заменить.
Тружусь над макросом замены гиперссылок и ссылок и рисовать userform ну очень не хочется (макрос чисто для своего удобства плюс без userform его легко потом перетащить в другие базы), а последовательно выбрасываемые inputbox с одним полем для ввода каждое несколько раздражают.
Тружусь над макросом замены гиперссылок и ссылок и рисовать userform ну очень не хочется (макрос чисто для своего удобства плюс без userform его легко потом перетащить в другие базы), а последовательно выбрасываемые inputbox с одним полем для ввода каждое несколько раздражают.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Вот именно inputbox не получится.
Не вижу проблем с переносом формы.
В редакторе VBA слева, в браузере проекта по правой кнопке есть экспорт и импорт компонентов. Любой модуль или модуль формы можно легко перенести куда угодно.
Не вижу проблем с переносом формы.
В редакторе VBA слева, в браузере проекта по правой кнопке есть экспорт и импорт компонентов. Любой модуль или модуль формы можно легко перенести куда угодно.
Понял. Спасибо!
Я просто пытаюсь сделать действительно универсальный макрос, то есть а) не требущий никакой доработки при переносе в другие БД; б) копирующимся в другое место за один раз (не отдельно код, отдельно форма, а все вместе). Даже при условии, что весь код засуну в форму остается одна проблема:
в некоторых базах я намерен мой макрос включать в состав другого макроса с формой showmodal = true (процедура замены ссылок, к примеру, может автоматически включаться, если есть ошибки в тех же вычислениях связанных с изменением пути файлов откуда берутся те или иные значения). Проблема возникает здесь: даже если моя форма showmodal = false будет выдана ошибка поскольку уже висит окно с showmodal = true запущенное основным макросом. inputbox же, по идее, как и msgbox выдаются без проблем вне зависимости от того какой модальности окно уже висит. Таким образом применение inputbox было бы более простым и надежным решением здесь, чем использование userform.
Сейчас обойти эту проблему знаю только как прописывание во всех базах данных доп.условий типа: если мой макрос должен быть запущен - выгрузить или скрыть форму основного макроса, а после его (моего макроса) работы вернуть ее (форму основного макроса) на место.
В общем все усложняется на мой взгляд, а любая сложность ненадежна - проще и надежней обойтись двумя разными inputbox и смириться с определенным неудобством. В конце концов в том же inputbox2 (запрашивающим выражение которым буду менять) можно в Prompt указать выражение, которое введено было в inputbox1. Так будет удобнее отслеживать что уже ввел ранее и что надо ввести сейчас.
Я просто пытаюсь сделать действительно универсальный макрос, то есть а) не требущий никакой доработки при переносе в другие БД; б) копирующимся в другое место за один раз (не отдельно код, отдельно форма, а все вместе). Даже при условии, что весь код засуну в форму остается одна проблема:
в некоторых базах я намерен мой макрос включать в состав другого макроса с формой showmodal = true (процедура замены ссылок, к примеру, может автоматически включаться, если есть ошибки в тех же вычислениях связанных с изменением пути файлов откуда берутся те или иные значения). Проблема возникает здесь: даже если моя форма showmodal = false будет выдана ошибка поскольку уже висит окно с showmodal = true запущенное основным макросом. inputbox же, по идее, как и msgbox выдаются без проблем вне зависимости от того какой модальности окно уже висит. Таким образом применение inputbox было бы более простым и надежным решением здесь, чем использование userform.
Сейчас обойти эту проблему знаю только как прописывание во всех базах данных доп.условий типа: если мой макрос должен быть запущен - выгрузить или скрыть форму основного макроса, а после его (моего макроса) работы вернуть ее (форму основного макроса) на место.
В общем все усложняется на мой взгляд, а любая сложность ненадежна - проще и надежней обойтись двумя разными inputbox и смириться с определенным неудобством. В конце концов в том же inputbox2 (запрашивающим выражение которым буду менять) можно в Prompt указать выражение, которое введено было в inputbox1. Так будет удобнее отслеживать что уже ввел ранее и что надо ввести сейчас.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
1) Мне неизвестны случаи, когда из одного модального окна не открываются другие. Если возникает ошибка, то дело тут точно не в том, модальное ли окно или нет. Просто в Access иногда нельзя доступиться к некоторым свойствам некоторых контролов, если они не в фокусе. Вот в этом может быть проблема, но она в принципе решаема
2) А потом, о каких Userform мы говорим! Раз это access, то вынесите всю функциональность по запрашиванию двух текстовых строк в отдельную форму. В модуле этой же формы сделайте процедуру, скажем
Public Function InputBoxEx(.....) as Boolean
которая запускает форму синхронно, а по ее закрытии возвращает true если нажата OK, а через параметры по ссылке возвращает 2 введенных значения.
Такую форму можно будет просто мышью из одного проекта в другой таскать.
Если что не получится, обращайтесь.
2) А потом, о каких Userform мы говорим! Раз это access, то вынесите всю функциональность по запрашиванию двух текстовых строк в отдельную форму. В модуле этой же формы сделайте процедуру, скажем
Public Function InputBoxEx(.....) as Boolean
которая запускает форму синхронно, а по ее закрытии возвращает true если нажата OK, а через параметры по ссылке возвращает 2 введенных значения.
Такую форму можно будет просто мышью из одного проекта в другой таскать.
Если что не получится, обращайтесь.
-
- Сообщения: 526
- Зарегистрирован: 04 фев 2007, 18:37
- Откуда: Сургут
- Контактная информация:
Здравствуйте district.
Если планируется создание "универсального инструмента", его лучше создавать отдельной-надстройкой. Это позволит легко тиражировать его и подключать к приложению в котором работаете.
Евгений.
Если планируется создание "универсального инструмента", его лучше создавать отдельной-надстройкой. Это позволит легко тиражировать его и подключать к приложению в котором работаете.
Евгений.
- Aent
- Сообщения: 1129
- Зарегистрирован: 01 окт 2006, 14:52
- Откуда: Saratov,Russia
- Контактная информация:
А если всё таки хотите оставить InputBox, что мешает использовать специфический символ
(b.е. " | " или " \ " ) как разделитель строк поиска и замены при вводе ?
(b.е. " | " или " \ " ) как разделитель строк поиска и замены при вводе ?
Андрей Энтелис,
aentelis.livejournal.com
aentelis.livejournal.com
Здравствуйте Евгений. С надстройками я еще не возился, поскольку надобности особой не возникало - буду смотреть help.
System - и речь про excel все же и похоже я перемудрствовал: был искренне убежден, что одну модальную форму из другой открыть нельзя. Сейчас создал простой пример - все в порядке: без проблем открылась действительно одна из другой. Ну, бывает
, сорри. Искать корни заблуждения уже смысла нет - вопрос решен. Видимо действительно проблема была в другом и я решил что она связана с модальностью. Столкнусь по ходу работы с проблемой открытия окон - спрошу конкретнее. Про специфичные символы вообще впервые слышу.
В общем, ребята, информации для просвещения надавали выше крыши - сейчас буду разгребать. Макрос завершил пока с inputbox'ами - красоту наведу чуть позже: и времени не осталось и вроде нормально все работает и поэкспериментировать со всеми вашими премудростями надо, чтобы нормально на вооружение взять. Начну со спецсимволов
. СПАСИБО!
System - и речь про excel все же и похоже я перемудрствовал: был искренне убежден, что одну модальную форму из другой открыть нельзя. Сейчас создал простой пример - все в порядке: без проблем открылась действительно одна из другой. Ну, бывает

В общем, ребята, информации для просвещения надавали выше крыши - сейчас буду разгребать. Макрос завершил пока с inputbox'ами - красоту наведу чуть позже: и времени не осталось и вроде нормально все работает и поэкспериментировать со всеми вашими премудростями надо, чтобы нормально на вооружение взять. Начну со спецсимволов

- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Как говорится, не вынесла душа поэта 
Добавьте в приложение форму с именем FindReplDlg. Тип границы = "окна диалога".
Уберите в ней область выделения, полосы прокрутки и все остальное, включая кнопку закрытия окна, и сделайте ее модальной. (главное, теперь не запускайте ее просто так
)
Теперь добавьте на форму 2 поля
fldWhat и fldBy
а такде 2 кнопки
btnOk и btnCancel
Модуль формы выглядит так:
Евгений, по поводу надстроек: Есть одно но, надстройка не будет привязана к приложению, а только к Access. Т.е. приложение должно проверять, установлена ли данная надстройка, а потом говорить, типа, я в Вашем Аксесе работать не буду, мне нужна надстройка. И пользователь помимо установки приложения должен будет устанавливать еще и надстройку.
А в остальном надстройки только выигрывают. По крайней мере не будет такого извращения как
While IsNull(res): DoEvents: Wend
(Увы в данном случае его не избежать)

Добавьте в приложение форму с именем FindReplDlg. Тип границы = "окна диалога".
Уберите в ней область выделения, полосы прокрутки и все остальное, включая кнопку закрытия окна, и сделайте ее модальной. (главное, теперь не запускайте ее просто так

Теперь добавьте на форму 2 поля
fldWhat и fldBy
а такде 2 кнопки
btnOk и btnCancel
Модуль формы выглядит так:
Код: Выделить всё
Option Compare Database
Dim res As Variant
Public Function FindReplDlg(ByRef ioWhat As String, ByRef ioBy As String) As Boolean
DoCmd.OpenForm "FindReplDlg", acNormal, , , , acHidden
Me.fldWhat.Value = ioWhat
Me.fldBy.Value = ioBy
res = Null
Me.Visible = True
While IsNull(res): DoEvents: Wend
If res Then
ioWhat = Me.fldWhat.Value
ioBy = Me.fldBy.Value
End If
FindReplDlg = res
DoCmd.Close
End Function
Private Sub btnOk_Click()
res = True
End Sub
Private Sub btnCancel_Click()
res = False
End Sub
Sub Некий_мега_макрос_пользующийся_этим_окошком()
Dim a As String, b As String
a = "qweqweqweq": b = "zxczxczxczcz"
If Form_FindReplDlg.FindReplDlg(a, b) Then
MsgBox "введены значения:" & Chr(13) & a & Chr(13) & b
Else
MsgBox "нажали отмену"
End If
End Sub
Евгений, по поводу надстроек: Есть одно но, надстройка не будет привязана к приложению, а только к Access. Т.е. приложение должно проверять, установлена ли данная надстройка, а потом говорить, типа, я в Вашем Аксесе работать не буду, мне нужна надстройка. И пользователь помимо установки приложения должен будет устанавливать еще и надстройку.
А в остальном надстройки только выигрывают. По крайней мере не будет такого извращения как
While IsNull(res): DoEvents: Wend
(Увы в данном случае его не избежать)
Точно. Не вынесла. Довольно долго пронаслаждался самописными объемными кодами, пока не понял, что править их - мука смертная. Да и ошибок в них лепишь все-равно массу. Потом осваивал как от select избавиться. Затем циклы и intersect, позволивший наконец оторваться от абсолютных адресов. В общем какой-то базис освоил, позволяющий по крайней мере понимать о чем речь и развиваться дальше более-менее осознанно. Но пока приходится часто быть китайцем - препарировать сложные, но короткие процедуры написанные профессионалами, чтобы понять как все устроено. Вот и грызу гранит науки - медленно, но верно. Благо есть такие как вы - можно всегда спросить, если уж совсем затык.
Спасибо за код - будет чем заняться на выходных. Операционную сейчас только освобожу
.
Спасибо за код - будет чем заняться на выходных. Операционную сейчас только освобожу

-
- Сообщения: 526
- Зарегистрирован: 04 фев 2007, 18:37
- Откуда: Сургут
- Контактная информация:
Здравствуйте Naeel Maqsudov, district.
district Вы писали: "...чисто для своего удобства плюс без userform его легко потом перетащить в другие базы...".
Naeel Maqsudov пользователям не придется устанавливать надстройки, это как я понял инструмент автора.
Я тоже поначалу думал - речь о MS Access, но "...речь про excel все же..." и потому позволю предложить Вам district для изучения DataFromTable.rar (15.23 кб) .
Евгений.
district Вы писали: "...чисто для своего удобства плюс без userform его легко потом перетащить в другие базы...".
Naeel Maqsudov пользователям не придется устанавливать надстройки, это как я понял инструмент автора.
Я тоже поначалу думал - речь о MS Access, но "...речь про excel все же..." и потому позволю предложить Вам district для изучения DataFromTable.rar (15.23 кб) .
Евгений.