Ваш код не может быть скомпилирован или выполнен по нескольким причинам.
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")
Эмпирическое правило, не запрашивайте у пользователя ввод данных, которые вы можете получить другими способами.