excel vba: создание поля ввода, чтобы пользователь мог указать свое имя и использовать его в каждом окне сообщений - PullRequest
0 голосов
/ 12 октября 2018

поэтому я хотел бы спросить, как сделать поле ввода и использовать результат / ввод для моих ящиков сообщений, чтобы вместо обычного «Привет, пользователь», это было бы их имя.это была моя попытка

Sub WorksheetActivate()
Dim Msg
Msg = "please enter your name"

 If ActiveSheet("Sheet1").Select Then
    InputBox(msg,"dear user")
 End If

End Sub

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Ваш код не может быть скомпилирован или выполнен по нескольким причинам.


If ActiveSheet("Sheet1").Select Then

ActiveSheet - это объект глобальной области, который представляет, ну, в общем, активный лист .Если вы хотите работать с Sheet1, тогда работайте с Sheet1:

If Sheet1.[...] Then

Если Sheet1 не существует во время компиляции, вам нужно извлечь его из объекта Workbook:

If ActiveWorkbook.Worksheets("Sheet1").[...] Then

.Select - это процедура Sub, при которой выбирает указанный лист .Это ничего не возвращает.If ... Then требуется логическое выражение , поэтому ваш код будет допустимым только в том случае, если .Select вернет Boolean или значение, которое можно неявно преобразовать в единицу.

За исключениемвы уже в коде модуля модуля рабочего листа: вы предположительно хотите работать с этим листом.Если это так, то вам не нужно ничего делать: лист был просто активирован (потому что вы обрабатываете событие Activate), поэтому - это ActiveSheet, и вы нев любом случае, нам нужно Select;вы можете использовать Me для ссылки на этот лист:

Me.Range("A1").Value = 42

Sub WorksheetActivate()

События рабочего листа (на самом деле все события) следуют оченьКонкретная схема именования для их обработчиков:

Private Sub EventSource_EventName()

В нынешнем виде WorksheetActivate - это просто еще одна (неявно) Public процедура, которая может быть вызвана из любого места, но она не будет обрабатывать Activateсобытие любого рабочего листа, потому что его подпись не совпадает с сигнатурой обработчика для события Activate интерфейса Worksheet.

Никогда не вводите сигнатуры обработчика событий вручную:подпись должна точно соответствовать , включая параметры (имена не имеют значения, но порядок и типы имеют значение).

Вместо этого обратите внимание на два раскрывающихся списка в верхней частипанель кода.Самый левый выпадающий список говорит (General);щелкните по нему и выберите Worksheet.Это либо создаст новый обработчик для какого-либо события по умолчанию, либо приведет вас к нему, если он уже существует.Теперь, когда в левом раскрывающемся списке указано «1070 *», посмотрите, что находится в другом раскрывающемся списке: каждое событие, открываемое интерфейсом Worksheet, присутствует!Выберите один, и редактор автоматически сгенерирует процедуру обработчика с правильной подписью.

InputBox(msg,"dear user")

Эта строка кода действительно выглядит в редакторе так:

InputBox (msg,"dear user")

Обратите внимание на пробел между InputBox и списком аргументов: это редактор, который говорит вам: «Я собираюсь взять все между этими скобками, оценить его как выражение и передать ByVal процедуре».А поскольку (msg, "dear user") не является выражением, которое может быть оценено, код не может быть скомпилирован.

Если вам не нужно возвращаемое значение функции (т.е. ввод пользователя), вы можете просто отброситькруглые скобки:

InputBox msg, "dear user"

Но вы делаете заботитесь об этом - вы хотите повторно использовать этот ввод где-нибудь, позже .Объявите переменную для хранения этого значения, в области видимости модуля , чтобы каждая процедура в этом модуле могла видеть его:

Private UserName As String

Теперь вы собираетесь присвоить эту переменную с возвращаемым значениемфункции InputBox:

UserName = InputBox(msg, "dear user")

Обратите внимание, что редактор теперь не ставит пробелы между InputBox и (.

А теперь вы можете обратиться к UserNameгде-нибудь в коде этой таблицы, чтобы использовать значение, указанное пользователем при последней активации листа.

Обратите внимание, что Worksheet_Activate будет запускать каждый раз, когда лист активируется.Таким образом, вы можете сделать InputBox условным, чтобы UserName было пустым:

If UserName = vbNullString Then
    UserName = InputBox(...)
End If

Наконец, обратите внимание, что Application.UserName вернет имя пользователя, которое использует сам Excel:

MsgBox "Hi, " & Application.UserName

Это значение используется, например, для идентификации автора документа при сохранении книги.

Вы также можете использовать имя пользователя для входа в Windows, используя функцию Environ$ и USERNAME переменная:

MsgBox "Hi, " & Environ$("USERNAME")

Эмпирическое правило, не запрашивайте у пользователя ввод данных, которые вы можете получить другими способами.

0 голосов
/ 12 октября 2018

Попробуйте этот код на листе, который вы хотите вызвать всплывающее окно:

Private Sub Worksheet_Activate()


    MsgBox ("dear " & Application.UserName) 'this will work if the username that logs is the user name


End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...