2015-06-30 3 views
0

У меня есть пользовательская форма, которой я хочу передать диапазон. Я пробовал несколько разных способов сделать это, но, похоже, не работает.Аргумент аргумента VBA для пользовательской формы

Вот код суб:

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

И код UserForm здесь:

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

я тогда получить ERR или о действии, не определяемом переменной.

Может ли кто-нибудь пролить свет на лучший процесс для этого?

ответ

1

Вы установили Option Explicit в верхней части вашего кода. Это означает, что необходимо определить все переменные (что считается хорошей практикой программирования). Таким образом, у вас есть два варианта решения этой проблемы:

(1) Удалите строку Option Explicit из кода или

(2) определяют все переменные с помощью команды Dim. В этом случае вам нужно добавить Dim act as Range к вашему Sub CommandButton1_Click на форме.

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

Call Additional_Comments_Normal(act)

и заголовком к югу neeeds изменить следующий образ:

Sub Additional_Comments_Normal(ByVal act as Range) 

'(your code)' 

End Sub 

Если «передача переменного в другие подразделы» слишком много проблем, то вы можете также сохранить диапазон где-то в файле так:

SomeHiddenSheet.Range("A1").Value2 = act 

и другие подразделы вы можете начать действовать снова:

act = SomeHiddenSheet.Range("A1").Value2 
+0

Я пошел с вариантом 2, это вызывает ошибку 91, он не признает, что я определил закон в субе. – Samatar

+0

Вы не определили его в суб, но снаружи. Тем не менее это должно сработать. – Ralph

+0

Я пытаюсь передать действие диапазона в пользовательскую форму, поэтому процедура вызова не работает одинаково? – Samatar