每当用户对单元格进行更改时调用模块函数

时间:2018-01-26 20:05:56

标签: excel vba

编辑:此当前代码返回编译错误"参数不是可选的。

我正在尝试从电子表格中的模块调用函数。用户随时进行更改 - > Private Sub Worksheet_Change(ByVal Target As Range)该用户更改子下的代码如下所示:

添加政策代码

        If CurCol(PolicyCode) Then
        'Policy Code
        Set PolicyCode = Call PolicyCodeFromOtherModuleHere

我试图用来计算单元格值的函数来自另一个模块,看起来像:

Function PolicyCode(gm As Double, Optional previous As String)

If gm > 1 Then
    gm = gm * 0.01
End If

    gm = Round(gm, 3)

    If previous = "E" Or previous = "O" Then
        PolicyCode = previous
    ElseIf previous Like "1?" Then
        If gm < 0.03 Then
            PolicyCode = "1B"
        ElseIf gm < 0.05 Then
            PolicyCode = "1C"
        ElseIf gm < 0.08 Then
            PolicyCode = "1D"
        ElseIf gm < 0.12 Then
            PolicyCode = "1E"
        ElseIf gm < 0.16 Then
            PolicyCode = "1F"
        ElseIf gm < 0.24 Then
            PolicyCode = "1G"
        ElseIf gm < 0.29 Then
            PolicyCode = "1H"
        ElseIf gm < 0.47 Then
            PolicyCode = "1J"
        Else: PolicyCode = "1K"
        End If
    ElseIf previous = "8" Or previous = "P" Or previous = "V" Or previous = "4" Or previous = "R" Then
        If gm < 0.35 Then
            PolicyCode = "8"
        ElseIf gm < 0.45 Then
            PolicyCode = "P"
        ElseIf gm < 0.58 Then
            PolicyCode = "V"
        ElseIf gm < 0.7 Then
            PolicyCode = "4"
        Else: PolicyCode = "R"
        End If
    Else
        If gm < 0.16 Then
            PolicyCode = "Y"
        ElseIf gm < 0.24 Then
            PolicyCode = "Z"
        ElseIf gm < 0.29 Then
            PolicyCode = "X"
        ElseIf gm < 0.36 Then
            PolicyCode = "9"
        ElseIf gm < 0.41 Then
            PolicyCode = "J"
        ElseIf gm < 0.47 Then
            PolicyCode = "N"
        ElseIf gm < 0.55 Then
            PolicyCode = "D"
        ElseIf gm < 0.63 Then
            PolicyCode = "S"
        ElseIf gm < 0.75 Then
            PolicyCode = "T"
        Else: PolicyCode = "U"
        End If
    End If

End Function

目标是让该函数根据gm(毛利率)列中的任何百分比计算应将哪些政策代码放入政策代码列。有谁知道如何做到这一点?

1 个答案:

答案 0 :(得分:0)

您有两个选项,处理模块/子中的位置放置或在您正在使用的选择子中当场处理它。

以下是在您的选择代码中处理它的示例。在这种情况下,我正在处理设置为“表单”的工作表上的特定单元格中弹出的日历。 当工作簿打开时,此单元格将通过= VBA.Date加载今天的日期。通过这种方式,该功能始终有一个种子,可以是今天的日期,也可以是日历上最后一次选择的日期。有一些可选代码可以始终将日历重点放在今天的日期上,但这对您所寻找的内容并不重要。这是一小段代码的背景故事,对你来说是有意义的。我在这个“表格”上有一堆这些选择代码。

此代码中的变量:

Dim msrSheet As Worksheet
Dim calendarLoc As Range

Set msrSheet = ThisWorkbook.Worksheets("Generate MSR")
Set calendarLoc = msrSheet.Range("E9")

   'Handle the Selection of the Calendar Cell
    If Not Intersect(Target, calendarLoc) Is Nothing Then
        'Check for a single cell selection
        If Target.Count = 1 Then
            'Handle it right here on the spot
            Target = CalendarForm.GetDate(Target.value)
        Else
            MsgBox "Please only select one cell within the range.  You have selected: " & Target.Count & " cells.", , "Choose only one cell"
        End If
    Else ' Do nothing
    End If

要传递给sub,它几乎与选择更改的代码相同:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

取决于,我通常使用模块和私人潜艇。

Private Sub mySub (ByVal myTarget as Range)
    'Perform code, you have the original Target passed in now as myTarget for the scope of this sub, you could name it the same if you want
End Sub

要从模块中的其他地方调用那些或WS或WB代码:

Application.Run "ModuleNameHere.SubNameHere", Arg1, Arg2 
'Say you pass Target to mySub, you have a module myModule with a private sub mySub in it
Application.Run "myModule.mySub", Target

有意义吗?

以下是Sid对另一个帖子的评论/回答:

是的:-)那么你知道吗?对于多张床单你可以使用

    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
         'Selection code or handlers
    End Sub

代替

Worksheet_Change(ByVal Target As Range) 

然后你必须把代码放在这个工作簿中,你可以通过在模块中创建一个子集来逃避;) - Siddharth Rout 2016年9月23日15:21