inputbox с двумя полями ввода

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

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

district
Сообщения: 56
Зарегистрирован: 13 ноя 2007, 23:03
Откуда: Москва

Уважаемые, вдруг такое возможно: можно ли inputbox делать с двумя полями для ввода? Одно, к примеру, для ввода информации КОТОРУЮ надо заменить, второе - КАКОЙ информацией надо заменить.

Тружусь над макросом замены гиперссылок и ссылок и рисовать userform ну очень не хочется (макрос чисто для своего удобства плюс без userform его легко потом перетащить в другие базы), а последовательно выбрасываемые inputbox с одним полем для ввода каждое несколько раздражают.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Вот именно inputbox не получится.
Не вижу проблем с переносом формы.
В редакторе VBA слева, в браузере проекта по правой кнопке есть экспорт и импорт компонентов. Любой модуль или модуль формы можно легко перенести куда угодно.
district
Сообщения: 56
Зарегистрирован: 13 ноя 2007, 23:03
Откуда: Москва

Понял. Спасибо!
Я просто пытаюсь сделать действительно универсальный макрос, то есть а) не требущий никакой доработки при переносе в другие БД; б) копирующимся в другое место за один раз (не отдельно код, отдельно форма, а все вместе). Даже при условии, что весь код засуну в форму остается одна проблема:

в некоторых базах я намерен мой макрос включать в состав другого макроса с формой 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 введенных значения.
Такую форму можно будет просто мышью из одного проекта в другой таскать.
Если что не получится, обращайтесь.
Teslenko_EA
Сообщения: 526
Зарегистрирован: 04 фев 2007, 18:37
Откуда: Сургут
Контактная информация:

Здравствуйте district.
Если планируется создание "универсального инструмента", его лучше создавать отдельной-надстройкой. Это позволит легко тиражировать его и подключать к приложению в котором работаете.
Евгений.
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

А если всё таки хотите оставить InputBox, что мешает использовать специфический символ
(b.е. " | " или " \ " ) как разделитель строк поиска и замены при вводе ?
Андрей Энтелис,
aentelis.livejournal.com
district
Сообщения: 56
Зарегистрирован: 13 ноя 2007, 23:03
Откуда: Москва

Здравствуйте Евгений. С надстройками я еще не возился, поскольку надобности особой не возникало - буду смотреть help.
System - и речь про excel все же и похоже я перемудрствовал: был искренне убежден, что одну модальную форму из другой открыть нельзя. Сейчас создал простой пример - все в порядке: без проблем открылась действительно одна из другой. Ну, бывает :) , сорри. Искать корни заблуждения уже смысла нет - вопрос решен. Видимо действительно проблема была в другом и я решил что она связана с модальностью. Столкнусь по ходу работы с проблемой открытия окон - спрошу конкретнее. Про специфичные символы вообще впервые слышу.
В общем, ребята, информации для просвещения надавали выше крыши - сейчас буду разгребать. Макрос завершил пока с inputbox'ами - красоту наведу чуть позже: и времени не осталось и вроде нормально все работает и поэкспериментировать со всеми вашими премудростями надо, чтобы нормально на вооружение взять. Начну со спецсимволов :) . СПАСИБО!
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Как говорится, не вынесла душа поэта :)

Добавьте в приложение форму с именем 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

(Увы в данном случае его не избежать)
district
Сообщения: 56
Зарегистрирован: 13 ноя 2007, 23:03
Откуда: Москва

Точно. Не вынесла. Довольно долго пронаслаждался самописными объемными кодами, пока не понял, что править их - мука смертная. Да и ошибок в них лепишь все-равно массу. Потом осваивал как от select избавиться. Затем циклы и intersect, позволивший наконец оторваться от абсолютных адресов. В общем какой-то базис освоил, позволяющий по крайней мере понимать о чем речь и развиваться дальше более-менее осознанно. Но пока приходится часто быть китайцем - препарировать сложные, но короткие процедуры написанные профессионалами, чтобы понять как все устроено. Вот и грызу гранит науки - медленно, но верно. Благо есть такие как вы - можно всегда спросить, если уж совсем затык.
Спасибо за код - будет чем заняться на выходных. Операционную сейчас только освобожу :) .
Teslenko_EA
Сообщения: 526
Зарегистрирован: 04 фев 2007, 18:37
Откуда: Сургут
Контактная информация:

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