2016-07-21 54 views
1

# 更新代码设置验证

Function condition(ByRef objCmb As ComboBox) 
    If objCmb.Value ="" And objCmb.Value = "g" Then 
     Call MsgBox("gg", vbOKOnly, "error") 
    End If 
End Function 

Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    condition (ComboBox1) 
End Sub 

'other codes for reference: 
Private Sub CommandButton1_Click() 
    Dim lastrow As Integer 
    lastrow = Cells(Rows.Count, "A").End(xlUp).Row 


    For i = 1 To 3 
     For j = 1 To 5 
      With Me.Controls("ComboBox" & (i - 1) * 5 + j) 
       If .Text <> "" Then 
       Cells(lastrow + i, j) = .Text 
       Else 

       Exit Sub 

       End If 

      End With 
     Next j 
    Next i 


End Sub 

我在VBA用户面板50个组合和文本框。由于在每个组合框或文本框中设置约束条件太麻烦,我想要一个函数应用于每个组合框和文本框。

对于上面的代码,它显示了cant find object错误

如何解决?

顺便说一句,如何设置功能语句的文本框? 是Function condition2(ByRef objCmb As textbox)...

+0

你在你的函数接收'objCmb'。使用它,而不是'ComboBox'。 –

+0

Ken在说什么,是用If if objCmb.Value <>“”和objCmb.Value =“g”替换你的'If ComboBox.Value <>“”And ComboBox.Value =“g”Then'然后' –

+0

i尝试过,仍然无法找到条件(ComboBox1)中的对象错误' – Monchhichi

回答

1

您收到错误,因为ComboBox不是ByRef objCmb As ComboBox。调用子时不要使用括号。如果不使用函数返回值,则在调用函数时不要使用括号。如果一个函数没有返回值,它应该是一个子类。

Sub condition(ByRef objCmb As MSForms.ComboBox) 
    If objCmb.Value <> "" And objCmb.Value = "g" Then 
     MsgBox "gg", vbOKOnly, "error" 
     objCmb.Value = "" 
    End If 
End Sub 

Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    condition ComboBox1 
End Sub 

我写了一个函数来帮助你生成所有文本和组合框的退出事件代码。

Sub AddCodeToCipBoard(frm As UserForm) 

    Const BaseCode = " Private Sub @Ctrl_Exit(ByVal Cancel As MSForms.ReturnBoolean)" & vbCrLf & _ 
      "  condition ComboBox1" & vbCrLf & _ 
      " End Sub" & vbCrLf & vbCrLf 

    Dim s As String 
    Dim ctrl 
    Dim clip As DataObject 
    Set clip = New DataObject 

    For Each ctrl In frm.Controls 
     If TypeName(ctrl) = "ComboBox" Or TypeName(ctrl) = "TextBox" Then 
      s = s & Replace(BaseCode, "@Ctrl", ctrl.Name) 
     End If 
    Next 

    clip.SetText s 

    clip.PutInClipboard 

End Sub 

将这个代码模块中并调用它像这样:

AddCodeToCipBoard Userform1 

现在所有的退出事件代码将被复制到Windows剪贴板。进入你的UserForms代码模块并粘贴新代码。

输出示例:

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    condition ComboBox1 
End Sub 

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    condition ComboBox1 
End Sub 

Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    condition ComboBox1 
End Sub 

Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    condition ComboBox1 
End Sub 

Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    condition ComboBox1 
End Sub