【问题标题】:How do I find the cell address of duplicates using VBA如何使用 VBA 找到重复项的单元格地址
【发布时间】:2016-04-10 15:42:34
【问题描述】:

我是在 Excel 中使用 VBA 的新手。我什至不能 100% 确定如何正确插入模块,所以这将是一个很大的帮助。

我已经设置了一个工作表,可以将 1 到 100 之间的数字随机化。

B3  =RANDBETWEEN(C6,F6)

我有 13 位参赛者。每个人都可以猜一个数字。目标是最接近随机数。 (猜 x 和 y 之间的数字。最接近的赢得“奖品”)

参赛者名单在 A9:B21 中。 (即“参赛者#1”)

他们的猜测列在 C9:C21 中。

随机数与猜测的差值列于 D9:D21

D9:D21  =IF(C9>$B$3,C9-$B$3,IF($B$3>C9,$B$3-C9,0))

单元格 F9:F21 让您知道谁赢了,并且不计算任何小于 1 和大于 100 的猜测。

F9:F21  =IF(C9<1,,IF(C9>100,,IF(D9=MIN($D$9:$D$21),A9&" Wins",)))

不幸的是,每次我尝试在单元格 C6 或 F6 中引用而不是 1 或 100 时,我只能得到 0 的结果。

在 F8 中,如果出现平局,我会弹出一个通知。仍然不确定此代码是否是执行此操作的最佳方法。

F8  =IF(COUNTIF(F9:F21,"*")>1,"Tie Breaker Needed","")

这是我的问题。我知道如何识别重复项,如果我愿意,我可以突出显示它们。即使平局,我似乎也无法让一个单元格准确地告诉我谁赢了。

即;如果参赛者 #7 获胜 --- 单元格会说“参赛者 #7 获胜” 如果参赛者 #7 和 #10 获胜 --- 单元格应该说参赛者 #7 和参赛者 #10 并列。

是否有可以为我执行此操作的命令或 VBA 模块?我尝试了下面找到的 VBA 模块,但它只返回#NAME?不管我做什么。

要么此代码有效,但我没有正确插入模块,要么此模块不适用于我的情况,我需要一些新的东西。

帮助我哦,在线领域的伟大卓越圣贤。

Image of My Excel Worksheet

Option Explicit

Function LookupCSVResults(lookupValue As Integer, lookupRange As Range, resultsRange As Range) As String

    Dim s As String 'Results placeholder
    Dim sTmp As String  'Cell value placeholder
    Dim r As Long   'Row
    Dim c As Long   'Column
    Const strDelimiter = "|||"  'Makes InStr more robust

    s = strDelimiter
    For r = 1 To lookupRange.Rows.Count
        For c = 1 To lookupRange.Columns.Count
            If lookupRange.Cells(r, c).Value = lookupValue Then
                'I know it's weird to use offset but it works even if the two ranges
                'are of different sizes and it's the same way that SUMIF works
                sTmp = resultsRange.Offset(r - 1, c - 1).Cells(1, 1).Value
                If InStr(1, s, strDelimiter & sTmp & strDelimiter) = 0 Then
                    s = s & sTmp & strDelimiter
                End If
            End If
        Next
    Next

    'Now make it look like CSV
    s = Replace(s, strDelimiter, ",")
    If Left(s, 1) = "," Then s = Mid(s, 2)
    If Right(s, 1) = "," Then s = Left(s, Len(s) - 1)

    LookupCSVResults = s 'Return the function

End Function

【问题讨论】:

  • 你需要在VBA中做吗?可以通过公式来完成....
  • 不必在 VBA 中完成。直到现在,我还没有找到一种在不使用 VBA 的情况下在单个单元格中执行此操作的方法。
  • 我的参赛者在 A1:C11 中,B 和 C 是他们的预测。实际结果在 E2 & F2
  • H2 到 H11,你有数组公式 =IFERROR(SMALL(IF((($B$2:$B$11=$E$2)*($C$2:$C$11=$F) $2)),ROW($B$2:$B$11)-1),ROWS($B$2:$B3)),"")
  • I2 到 I11,你有正常的公式 =IFERROR(INDEX($A$2:$A$11,H2,1),"")

标签: excel vba find duplicates


【解决方案1】:

下面的UDF()怎么样:

Option Explicit

Public Function ListWinners(people As Range, deltas As Range) As String
   Dim wf As WorksheetFunction
   Dim i As Long, delta As Long, msg As String
   Dim WinningValue As Long
   Set wf = Application.WorksheetFunction
   ListWinners = ""
   msg = " wins"
   WinningValue = wf.Min(deltas)
   For i = 1 To deltas.Rows.Count
      If deltas(i) = WinningValue Then
         If ListWinners = "" Then
            ListWinners = people(i)
         Else
            ListWinners = ListWinners & " & " & people(i)
            msg = " tie"
         End If
      End If
   Next i
   ListWinners = ListWinners & msg
End Function

在您发布的示例中,像这样使用它:

=ListWinners(A9:A21,C9:C21)

单个单元格中显示获胜者列表。

编辑#1:

用户定义函数 (UDF) 非常易于安装和使用:

  1. ALT-F11 调出 VBE 窗口
  2. ALT-I ALT-M 打开一个新模块
  3. 粘贴内容并关闭 VBE 窗口

如果您保存工作簿,UDF 将与它一起保存。 如果您使用的是 2003 年以后的 Excel 版本,您必须保存 文件为 .xlsm 而不是 .xlsx

要删除 UDF:

  1. 如上所示打开 VBE 窗口
  2. 清除代码
  3. 关闭 VBE 窗口

要使用 Excel 中的 UDF:

=ListWinners(A1:A100,B1:B100)

要了解有关宏的更多信息,请参阅:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

有关 UDF 的详细信息,请参阅:

http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

必须启用宏才能正常工作!

【讨论】:

  • 谢谢。这有帮助,除了 1 件事。当我按 F9 刷新页面并获得一个新的随机数时,我没有得到正确的获胜者。我已将此代码复制到 VBA 中,然后使用 ListWinners 命令,但它并不总是给我正确的答案。有什么建议吗?
  • 我发现了我的问题。我有“=ListWinners(A9:B21,D9:D21)”,它必须是 A9:A21。现在它起作用了。太感谢了。我们有机会在这段代码中添加一个子句吗?现在,如果参赛者没有猜出答案并将他们的答案留在“0”并且随机数选择“1”,即使他们没有参加比赛,他们也会获胜。是否可以先检查“C”列以确保输入了随机数的指定 Max 和 Min 之间的数字?
  • 只需将默认值设为 9999 而不是 0
  • 我刚刚关闭了我的页面,当我重新打开此工作簿时,我收到了 ListWinners 的名称错误。想想我做错了什么?我是否以某种方式搞砸了将模块插入 VBA 中?
  • 我还注意到代码的第 5 行有“delta”的单数拼写,而代码中的其他任何地方都是“deltas”。是故意的吗?
猜你喜欢
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 2023-01-29
  • 2017-06-13
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 2015-10-13
相关资源
最近更新 更多