excel vba:制作输入框,以便用户可以输入他/她的名字并在每个msg框中使用

Kur*_*nco 1 excel vba excel-vba

所以我想问一下如何创建一个输入框并使用我的消息框的结果/输入,这样就不会有通常的"Hello User",而是它们的名字.这是我的尝试

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

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

End Sub
Run Code Online (Sandbox Code Playgroud)

Mat*_*don 6

由于多种原因,您的代码无法编译或运行.


If ActiveSheet("Sheet1").Select Then
Run Code Online (Sandbox Code Playgroud)

ActiveSheet是一个全局范围的对象,它表示活动工作表.如果您想使用Sheet1,请使用Sheet1:

If Sheet1.[...] Then
Run Code Online (Sandbox Code Playgroud)

如果Sheet1在编译时不存在,则需要从Workbook对象中检索它:

If ActiveWorkbook.Worksheets("Sheet1").[...] Then
Run Code Online (Sandbox Code Playgroud)

.SelectSub该过程选择指定的片材.它没有返回任何东西.If ... Then需要一个布尔表达式,因此只有.Select返回a Boolean或者可以隐式转换为一个值的代码才能使代码合法.

除此之外,您已经处于工作表模块的代码隐藏中:您可能希望使用工作表.如果是这样的话,那么你不需要做任何事情:该片刚刚启动(因为你正在处理的Activate事件),所以它ActiveSheet你不需要Select也无妨; 你可以Me用来引用那张表:

Me.Range("A1").Value = 42
Run Code Online (Sandbox Code Playgroud)
Sub WorksheetActivate()
Run Code Online (Sandbox Code Playgroud)

工作表事件(实际上是所有事件)遵循其处理程序的非常具体的命名方案:

Private Sub EventSource_EventName()
Run Code Online (Sandbox Code Playgroud)

就目前而言,WorksheetActivate只是另一个(隐式)Public过程可以从任何地方调用 - 但它不会处理Activate任何工作表的事件,因为它的签名ActivateWorksheet接口事件的处理程序的签名不匹配.

永远不要手工输入事件处理程序签名:签名必须完全匹配,包括参数(名称无关紧要,但排序和类型都有).

相反,请注意代码窗格顶部的两个下拉列表.最左边的下拉列表说(General); 单击它,然后选择Worksheet.这将为某个默认事件创建一个新的处理程序,或者如果它已经存在则将其带到它.现在,虽然左侧下拉列表显示Worksheet,但请查看其他下拉列表中的内容:Worksheet界面显示的每个事件都在那里!选择一个,编辑器自动生成具有正确签名的处理程序过程.

InputBox(msg,"dear user")
Run Code Online (Sandbox Code Playgroud)

这行代码实际上在编辑器中看起来像这样:

InputBox (msg,"dear user")
Run Code Online (Sandbox Code Playgroud)

注意InputBox参数列表之间的空格:编辑告诉你"我将把这些括号中的所有内容都考虑在内,将其作为表达式进行评估,然后将其传递ByVal给过程".并且由于(msg, "dear user")不是可以评估的表达式,因此代码无法编译.

如果你不关心函数的返回值(即用户的输入),你可以简单地删除括号:

InputBox msg, "dear user"
Run Code Online (Sandbox Code Playgroud)

但是你确实关心它 - 你想在以后的某个地方重用那个输入.声明一个变量来保存该值,在模块范围内,以便该模块中的每个过程都可以看到它:

Private UserName As String
Run Code Online (Sandbox Code Playgroud)

现在,您将使用InputBox函数的返回值分配该变量:

UserName = InputBox(msg, "dear user")
Run Code Online (Sandbox Code Playgroud)

请注意,编辑器之间InputBox(现在之间没有放置空格.

现在,您可以参考UserName该工作表的代码隐藏中的任何位置,以使用用户上次激活工作表时提供的值.

请注意,每次激活工作表Worksheet_Activate都会运行.所以你可以使条件为空:InputBoxUserName

If UserName = vbNullString Then
    UserName = InputBox(...)
End If
Run Code Online (Sandbox Code Playgroud)

最后,请注意,Application.UserName它将返回Excel本身正在使用的用户名:

MsgBox "Hi, " & Application.UserName
Run Code Online (Sandbox Code Playgroud)

例如,该值用于在保存工作簿时标识文档的作者.

您还可以使用Windows登录用户名,使用Environ$函数和USERNAME变量:

MsgBox "Hi, " & Environ$("USERNAME")
Run Code Online (Sandbox Code Playgroud)

经验法则,避免提示用户输入您可以通过其他方式获得的输入.