【问题标题】:Calling a module function whenever a user makes a change to a cell [duplicate]每当用户对单元格进行更改时调用模块函数[重复]
【发布时间】:2018-01-27 05:31:37
【问题描述】:

编辑:当前代码返回编译错误“argument not optional .

我正在尝试从电子表格中的模块调用函数。任何时候用户进行更改 -> 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(毛利率)列中的任何百分比计算应将哪些策略代码放入策略代码列。有谁知道如何做到这一点?

【问题讨论】:

  • 代码不做吗?我看到你正在分配一个策略代码......?你只是说,Range("A1").Value = PolicyCode,不是吗?或者Cells(1, Target.Column).Value = PolicyCode
  • 我不断收到编译错误:“Argument not optional”,它在 CurCol 之前突出显示(PolicyCode)
  • 取决于您想要策略代码的位置,但这是非常可行的。您可以通过选择更改将目标传递给您的函数(我看到您没有),因此您可以更改目标单元格(修改后的单元格)或与目标偏移的单元格(比如右边或任何地方的下一个真的在纸上)。
  • 如果您的问题是关于错误的,那么它应该描述该错误是什么,说明导致它的行/指令,并包含minimal reproducible example。但是您的问题似乎与特定错误无关。我不知道你的问题在问什么。如果您只是想帮助完成您的代码,请参阅why is “Can someone help me?” not an actual question?
  • 抱歉,已编辑以反映错误。 - 我应该如何编码@Wookies-Will-Code

标签: excel vba


【解决方案1】:

您有 2 个选项,在您的模块/子中处理位置放置,或者在您正在工作的选择子中当场处理它。

这是在您的选择代码中处理它的示例。在这种情况下,我正在处理设置为“表单”的工作表上特定单元格中弹出的日历。 当工作簿打开时,此单元格通过 = 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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2020-02-11
    • 2017-01-11
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多