【问题标题】:Excel Function to Access FunctionExcel函数访问函数
【发布时间】:2016-10-06 10:53:58
【问题描述】:

我在 excel 中创建了 UPC 校验位功能,该功能运行良好,但我现在需要在 MS Access 中创建相同的功能。

代码如下:

Public Function CHECKDIGIT(UPC As String) As String

    If Len(UPC) = 8 Then

        CHECKDIGIT = WorksheetFunction.RoundUp(WorksheetFunction.Sum(Mid(UPC, 1, 1), Mid(UPC, 3, 1), Mid(UPC, 5, 1), Mid(UPC, 7, 1)) * 3 + WorksheetFunction.Sum(Mid(UPC, 2, 1), Mid(UPC, 4, 1), Mid(UPC, 6, 1)), -1) - (WorksheetFunction.Sum(Mid(UPC, 1, 1), Mid(UPC, 3, 1), Mid(UPC, 5, 1), Mid(UPC, 7, 1)) * 3 + WorksheetFunction.Sum(Mid(UPC, 2, 1), Mid(UPC, 4, 1), Mid(UPC, 6, 1)))

    ElseIf Len(UPC) = 12 Then

        CHECKDIGIT = WorksheetFunction.RoundUp(WorksheetFunction.Sum(Mid(UPC, 1, 1), Mid(UPC, 3, 1), Mid(UPC, 5, 1), Mid(UPC, 7, 1), Mid(UPC, 9, 1), Mid(UPC, 11, 1)) * 3 + WorksheetFunction.Sum(Mid(UPC, 2, 1), Mid(UPC, 4, 1), Mid(UPC, 6, 1), Mid(UPC, 8, 1), Mid(UPC, 10, 1)), -1) - (WorksheetFunction.Sum(Mid(UPC, 1, 1), Mid(UPC, 3, 1), Mid(UPC, 5, 1), Mid(UPC, 7, 1), Mid(UPC, 9, 1), Mid(UPC, 11, 1)) * 3 + WorksheetFunction.Sum(Mid(UPC, 2, 1), Mid(UPC, 4, 1), Mid(UPC, 6, 1), Mid(UPC, 8, 1), Mid(UPC, 10, 1)))

    ElseIf Len(UPC) = 13 Then

        CHECKDIGIT = WorksheetFunction.RoundUp(WorksheetFunction.Sum(Mid(UPC, 1, 1), Mid(UPC, 3, 1), Mid(UPC, 5, 1), Mid(UPC, 7, 1), Mid(UPC, 9, 1), Mid(UPC, 11, 1)) + WorksheetFunction.Sum(Mid(UPC, 2, 1), Mid(UPC, 4, 1), Mid(UPC, 6, 1), Mid(UPC, 8, 1), Mid(UPC, 10, 1), Mid(UPC, 12, 1)) * 3, -1) - (WorksheetFunction.Sum(Mid(UPC, 1, 1), Mid(UPC, 3, 1), Mid(UPC, 5, 1), Mid(UPC, 7, 1), Mid(UPC, 9, 1), Mid(UPC, 11, 1)) + WorksheetFunction.Sum(Mid(UPC, 2, 1), Mid(UPC, 4, 1), Mid(UPC, 6, 1), Mid(UPC, 8, 1), Mid(UPC, 10, 1), Mid(UPC, 12, 1)) * 3)

    ElseIf Len(UPC) = 14 Then

        CHECKDIGIT = WorksheetFunction.RoundUp(WorksheetFunction.Sum(Mid(UPC, 1, 1), Mid(UPC, 3, 1), Mid(UPC, 5, 1), Mid(UPC, 7, 1), Mid(UPC, 9, 1), Mid(UPC, 11, 1), Mid(UPC, 13, 1)) * 3 + WorksheetFunction.Sum(Mid(UPC, 2, 1), Mid(UPC, 4, 1), Mid(UPC, 6, 1), Mid(UPC, 8, 1), Mid(UPC, 10, 1), Mid(UPC, 12, 1)), -1) - (WorksheetFunction.Sum(Mid(UPC, 1, 1), Mid(UPC, 3, 1), Mid(UPC, 5, 1), Mid(UPC, 7, 1), Mid(UPC, 9, 1), Mid(UPC, 11, 1), Mid(UPC, 13, 1)) * 3 + WorksheetFunction.Sum(Mid(UPC, 2, 1), Mid(UPC, 4, 1), Mid(UPC, 6, 1), Mid(UPC, 8, 1), Mid(UPC, 10, 1), Mid(UPC, 12, 1)))

    ElseIf Len(UPC) = 17 Then

        CHECKDIGIT = WorksheetFunction.RoundUp(WorksheetFunction.Sum(Mid(UPC, 1, 1), Mid(UPC, 3, 1), Mid(UPC, 5, 1), Mid(UPC, 7, 1), Mid(UPC, 9, 1), Mid(UPC, 11, 1), Mid(UPC, 13, 1), Mid(UPC, 15, 1)) + WorksheetFunction.Sum(Mid(UPC, 2, 1), Mid(UPC, 4, 1), Mid(UPC, 6, 1), Mid(UPC, 8, 1), Mid(UPC, 10, 1), Mid(UPC, 12, 1), Mid(UPC, 14, 1), Mid(UPC, 16, 1)) * 3, -1) - (WorksheetFunction.Sum(Mid(UPC, 1, 1), Mid(UPC, 3, 1), Mid(UPC, 5, 1), Mid(UPC, 7, 1), Mid(UPC, 9, 1), Mid(UPC, 11, 1), Mid(UPC, 13, 1), Mid(UPC, 15, 1)) + WorksheetFunction.Sum(Mid(UPC, 2, 1), Mid(UPC, 4, 1), Mid(UPC, 6, 1), Mid(UPC, 8, 1), Mid(UPC, 10, 1), Mid(UPC, 12, 1), Mid(UPC, 14, 1), Mid(UPC, 16, 1)) * 3)

    ElseIf Len(UPC) = 18 Then

        CHECKDIGIT = WorksheetFunction.RoundUp(WorksheetFunction.Sum(Mid(UPC, 1, 1), Mid(UPC, 3, 1), Mid(UPC, 5, 1), Mid(UPC, 7, 1), Mid(UPC, 9, 1), Mid(UPC, 11, 1), Mid(UPC, 13, 1), Mid(UPC, 15, 1), Mid(UPC, 17, 1)) * 3 + WorksheetFunction.Sum(Mid(UPC, 2, 1), Mid(UPC, 4, 1), Mid(UPC, 6, 1), Mid(UPC, 8, 1), Mid(UPC, 10, 1), Mid(UPC, 12, 1), Mid(UPC, 14, 1), Mid(UPC, 16, 1)), -1) - (WorksheetFunction.Sum(Mid(UPC, 1, 1), Mid(UPC, 3, 1), Mid(UPC, 5, 1), Mid(UPC, 7, 1), Mid(UPC, 9, 1), Mid(UPC, 11, 1), Mid(UPC, 13, 1), Mid(UPC, 15, 1), Mid(UPC, 17, 1)) * 3 + WorksheetFunction.Sum(Mid(UPC, 2, 1), Mid(UPC, 4, 1), Mid(UPC, 6, 1), Mid(UPC, 8, 1), Mid(UPC, 10, 1), Mid(UPC, 12, 1), Mid(UPC, 14, 1), Mid(UPC, 16, 1)))

    ElseIf Len(UPC) <> 8 Or Len(UPC) <> 12 Or Len(UPC) <> 13 Or Len(UPC) <> 14 Or Len(UPC) <> 17 Or Len(UPC) <> 18 Then

        CHECKDIGIT = "MISSING DIGITS"

    End If
End Function

有什么简单的方法可以将它转换为 MS Access 吗? 据我所知,并非所有公式都会直接转移到 Access,所以我想我也需要在 Access 中构建自定义函数。

知道该怎么做吗?

谢谢, 斯拉夫

【问题讨论】:

  • WorksheetFunction.Sum(x, y) = x + yWorksheetFunction.RoundUp(x) = Round(x + 0.5)。其他一切都一样。

标签: vba excel ms-access


【解决方案1】:

以下代码在 Excel 和 Access 中应该同样适用:

Public Function CHECKDIGIT(UPC As String) As String
    Dim n As Integer
    Dim i As Integer

    Select Case Len(UPC)
        Case 8, 12, 13, 14, 17, 18
            n = 0
            For i = 1 To Len(UPC) - 1
                If ((Len(UPC) - i) Mod 2) = 1 Then
                    n = n + CInt(Mid(UPC, i, 1)) * 3
                Else
                    n = n + CInt(Mid(UPC, i, 1))
                End If
            Next
            CHECKDIGIT = CStr(Int(n / 10 + 0.99) * 10 - n)

        Case Else

            CHECKDIGIT = "MISSING DIGITS"

    End Select
End Function

【讨论】:

  • 好的,完美。这个工作就像一个魅力。我可以将其用作 Access 中的功能吗?就像在 excel 中一样,我只需键入 =CHECKDIGIT(A1) 但在访问中我知道它会有所不同。我应该将此视为 Access 内置功能的一部分吗?
  • 我想通了。我只是在查询或表单中调用它。 YowE3K .....伙计,你摇滚。这太棒了。非常感谢。
  • @Slavisha - man you rock - 嗯,通常当人们在同一个句子中同时提到我和石头时,它是用“YowE3K 的脑袋里有石头”的表达。
  • 否 :-) 就我而言,您实际上为我节省了很多精力。如果你曾经在亚特兰大... 你可以请我喝一杯。现在我要研究你的逻辑。我很难理解你一行一行到底做了什么。它给出了与我的函数相同的结果,但你的方法更优雅。
  • 我的只是查看每个字符(除了最后一个,校验位,字符),判断它是偶数还是奇数,然后决定乘以 1 还是 3。然后可以从下一个更高的 10 倍数中减去这些以得到校验位。 (实际上,我刚刚意识到最后一步可能是 CHECKDIGIT = CStr((1000 - n) Mod 10) 而不是 CHECKDIGIT = CStr(Int(n / 10 + 0.99) * 10 - n) - 这可能更简单。)
【解决方案2】:

感谢您提供代码 YowE3K。我认为该代码中缺少某些内容。当我针对结果运行它时,我使用我的代码它失败了。

UPC CHCKDIGIT   NEW CHKDIGIT
018371009355    5   5
00018371009355  5   5
7501206634004   4   10
00018371019354  4   14
018371019354    4   14

另外,通过使用函数,我发现我不能将该函数用作数据输入验证的一部分。我将不得不使用上面共产国际建议的公式。

感谢你们两位对此提供的帮助。

【讨论】:

  • 我发现我的代码中有两个错误 - (a) 我没有注意到偶数和奇数长度 UPC 代码之间的函数差异,并且 (b) 我应该使用 @ 987654322@ 而不是Round。我在回答中修复了这两个错误,以防其他人将来需要 UPC 校验码功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-03-18
相关资源
最近更新 更多