VBA 将参数传递给用户窗体
VBA pass argument to userform
我有一个用户表单,我希望将范围传递给它。我尝试了几种不同的方法,但似乎没有用。
子代码如下:
Option Explicit
Sub Additional_Comments_Normal()
Dim MSG1 As Integer
Dim msg As String
Dim act As Range
On Error GoTo ErrHandler
'Calls userform
MSG1 = MsgBox("Would you like to add comments", vbYesNo, "Add comments")
If MSG1 = vbYes Then
With AddComments
On Error Resume Next
Set act = Application.InputBox(Prompt:="Please choose files you wish to add comments to", Type:=8)
If act Is Nothing Then
Exit Sub
End If
Application.ScreenUpdating = True
.Show
End With
Else
Exit Sub
End If
ErrHandler:
If Err.Number <> 0 Then
msg = "Error # " & Str(Err.Number) & " was generated by " _
& Err.Source & Chr(13) & Err.Description
MsgBox msg, , "Error", Err.HelpFile, Err.HelpContext
End If
End Sub
用户表单代码在这里:
Public act As Range
Private Sub CommandButton1_Click()
Dim ctl As Control
Dim rng As Range
Dim MSG2 As Integer
Dim sfile As String
If act.Column > 1 Then
MsgBox ("Please choose File name from Column 1")
Exit Sub
End If
If act.Row < 4 Then
MsgBox ("Please choose a valid file")
Exit Sub
End If
If Me.TxtComment.Value = "" Then
MsgBox "Please add comments", vbExclamation, "Additional Comments"
Me.TxtComment.SetFocus
Exit Sub
End If
If Me.TxtName.Value = "" Then
MsgBox "Please add your name", vbExclamation, "Additional Comments"
Me.TxtName.SetFocus
Exit Sub
End If
MSG1 = MsgBox("Add Comments ?", vbYesNo, "Add comments")
If MSG1 = vbNo Then
End If
If MSG1 = vbYes Then
act.Offset(0, 16).Value = act.Offset(0, 16).Text & " " & Me.TxtComment.Value
act.Offset(0, 17).Value = act.Offset(0, 17).Text & " " & Me.TxtName.Value
For Each ctl In Me.Controls
If TypeName(ctl) = "TextBox" Then
ctl.Value = ""
End If
Next ctl
AddComments.Hide
Application.DisplayAlerts = False
ActiveWorkbook.Save
Application.DisplayAlerts = True
End If
End Sub
Private Sub CommandButton2_Click()
End Sub
Private Sub CommandButton3_Click()
Unload Me
End Sub
Private Sub UserForm_Click()
End Sub
然后我得到一个关于行为未定义变量的错误。
任何人都可以阐明更好的流程吗?
您已在代码顶部设置 Option Explicit
。这意味着需要定义所有变量(这被认为是良好的编程习惯)。因此,您有两种选择来解决此问题:
(1) 从您的代码中删除行 Option Explicit
或
(2) 使用 Dim
命令定义所有变量。在这种情况下,您必须将 Dim act as Range
添加到表单上的 Sub CommandButton1_Click
。
如果您想将一个变量传递给另一个子程序,那么您可以像这样用该变量调用该子程序:
Call Additional_Comments_Normal(act)
子 header 需要像这样更改:
Sub Additional_Comments_Normal(ByVal act as Range)
'(your code)'
End Sub
如果 "passing a variable to another sub" 太麻烦,那么您还可以将范围保存在文件中的某处,如下所示:
SomeHiddenSheet.Range("A1").Value2 = act
在另一个子中你可以再次开始行动:
act = SomeHiddenSheet.Range("A1").Value2
我有一个用户表单,我希望将范围传递给它。我尝试了几种不同的方法,但似乎没有用。
子代码如下:
Option Explicit
Sub Additional_Comments_Normal()
Dim MSG1 As Integer
Dim msg As String
Dim act As Range
On Error GoTo ErrHandler
'Calls userform
MSG1 = MsgBox("Would you like to add comments", vbYesNo, "Add comments")
If MSG1 = vbYes Then
With AddComments
On Error Resume Next
Set act = Application.InputBox(Prompt:="Please choose files you wish to add comments to", Type:=8)
If act Is Nothing Then
Exit Sub
End If
Application.ScreenUpdating = True
.Show
End With
Else
Exit Sub
End If
ErrHandler:
If Err.Number <> 0 Then
msg = "Error # " & Str(Err.Number) & " was generated by " _
& Err.Source & Chr(13) & Err.Description
MsgBox msg, , "Error", Err.HelpFile, Err.HelpContext
End If
End Sub
用户表单代码在这里:
Public act As Range
Private Sub CommandButton1_Click()
Dim ctl As Control
Dim rng As Range
Dim MSG2 As Integer
Dim sfile As String
If act.Column > 1 Then
MsgBox ("Please choose File name from Column 1")
Exit Sub
End If
If act.Row < 4 Then
MsgBox ("Please choose a valid file")
Exit Sub
End If
If Me.TxtComment.Value = "" Then
MsgBox "Please add comments", vbExclamation, "Additional Comments"
Me.TxtComment.SetFocus
Exit Sub
End If
If Me.TxtName.Value = "" Then
MsgBox "Please add your name", vbExclamation, "Additional Comments"
Me.TxtName.SetFocus
Exit Sub
End If
MSG1 = MsgBox("Add Comments ?", vbYesNo, "Add comments")
If MSG1 = vbNo Then
End If
If MSG1 = vbYes Then
act.Offset(0, 16).Value = act.Offset(0, 16).Text & " " & Me.TxtComment.Value
act.Offset(0, 17).Value = act.Offset(0, 17).Text & " " & Me.TxtName.Value
For Each ctl In Me.Controls
If TypeName(ctl) = "TextBox" Then
ctl.Value = ""
End If
Next ctl
AddComments.Hide
Application.DisplayAlerts = False
ActiveWorkbook.Save
Application.DisplayAlerts = True
End If
End Sub
Private Sub CommandButton2_Click()
End Sub
Private Sub CommandButton3_Click()
Unload Me
End Sub
Private Sub UserForm_Click()
End Sub
然后我得到一个关于行为未定义变量的错误。
任何人都可以阐明更好的流程吗?
您已在代码顶部设置 Option Explicit
。这意味着需要定义所有变量(这被认为是良好的编程习惯)。因此,您有两种选择来解决此问题:
(1) 从您的代码中删除行 Option Explicit
或
(2) 使用 Dim
命令定义所有变量。在这种情况下,您必须将 Dim act as Range
添加到表单上的 Sub CommandButton1_Click
。
如果您想将一个变量传递给另一个子程序,那么您可以像这样用该变量调用该子程序:
Call Additional_Comments_Normal(act)
子 header 需要像这样更改:
Sub Additional_Comments_Normal(ByVal act as Range)
'(your code)'
End Sub
如果 "passing a variable to another sub" 太麻烦,那么您还可以将范围保存在文件中的某处,如下所示:
SomeHiddenSheet.Range("A1").Value2 = act
在另一个子中你可以再次开始行动:
act = SomeHiddenSheet.Range("A1").Value2