如何使用 VBA 找到重复的单元格地址
How do I find the cell address of duplicates using VBA
我是在 excel 中使用 VBA 的新手。我什至不能 100% 确定如何正确插入模块,所以这将是一个很大的帮助。
我已经设置了一个工作表,可以在 1 到 100 之间随机分配一个数字。
B3 =RANDBETWEEN(C6,F6)
我有13个参赛者。每个人都可以猜一个数字。目标是最接近随机数。 (猜猜 x 和 y 之间的数字。最接近的获胜 "The Prize")
参赛者列在A9:B21中。 (即;"Contestant #1")
他们的猜测列在C9:C21。
随机数和猜测的差值列在D9:D21
D9:D21 =IF(C9>$B,C9-$B,IF($B>C9,$B-C9,0))
单元格 F9:F21 让您知道谁赢了,并且不计算任何小于 1 和大于 100 的猜测。
F9:F21 =IF(C9<1,,IF(C9>100,,IF(D9=MIN($D:$D),A9&" Wins",)))
不幸的是,每次我尝试在单元格 C6 或 F6 中引用而不是 1 或 100 时,我只会得到 0 的结果。
在 F8 中,如果出现平局,我会弹出一条通知。仍然不确定此代码是否是执行此操作的最佳方法。
F8 =IF(COUNTIF(F9:F21,"*")>1,"Tie Breaker Needed","")
这是我的问题。我知道如何识别重复项,如果需要,我可以突出显示它们。我似乎无法找到一种方法让单个单元格准确地告诉我谁赢了,即使有平局。
即;如果参赛者 #7 获胜 --- Cell 会说 "Contestant #7 Wins"
如果参赛者#7 和#10 获胜 --- Cell 应该说参赛者#7 和参赛者#10 平局。
是否有可以为我执行此操作的命令或 VBA 模块?我尝试了下面找到的 VBA 模块,但它只有 returns #NAME?不管我做什么。
要么这段代码有效,但我没有正确插入模块,要么这个模块不适合我的情况,我需要一些新的东西。
帮帮我哦太好了Excel网络圣贤
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
下面的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) 非常易于安装和使用:
- ALT-F11 调出 VBE window
- ALT-I
ALT-M 打开一个新模块
- 粘贴内容并关闭 VBE window
如果保存工作簿,UDF 也会随之保存。
如果您使用的 Excel 版本晚于 2003, 您必须保存
文件为 .xlsm 而不是 .xlsx
删除 UDF:
- 如上所述调出 VBE window
- 清除代码
- 关闭 VBE window
要使用来自 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
必须启用宏才能工作!
我是在 excel 中使用 VBA 的新手。我什至不能 100% 确定如何正确插入模块,所以这将是一个很大的帮助。
我已经设置了一个工作表,可以在 1 到 100 之间随机分配一个数字。
B3 =RANDBETWEEN(C6,F6)
我有13个参赛者。每个人都可以猜一个数字。目标是最接近随机数。 (猜猜 x 和 y 之间的数字。最接近的获胜 "The Prize")
参赛者列在A9:B21中。 (即;"Contestant #1")
他们的猜测列在C9:C21。
随机数和猜测的差值列在D9:D21
D9:D21 =IF(C9>$B,C9-$B,IF($B>C9,$B-C9,0))
单元格 F9:F21 让您知道谁赢了,并且不计算任何小于 1 和大于 100 的猜测。
F9:F21 =IF(C9<1,,IF(C9>100,,IF(D9=MIN($D:$D),A9&" Wins",)))
不幸的是,每次我尝试在单元格 C6 或 F6 中引用而不是 1 或 100 时,我只会得到 0 的结果。
在 F8 中,如果出现平局,我会弹出一条通知。仍然不确定此代码是否是执行此操作的最佳方法。
F8 =IF(COUNTIF(F9:F21,"*")>1,"Tie Breaker Needed","")
这是我的问题。我知道如何识别重复项,如果需要,我可以突出显示它们。我似乎无法找到一种方法让单个单元格准确地告诉我谁赢了,即使有平局。
即;如果参赛者 #7 获胜 --- Cell 会说 "Contestant #7 Wins" 如果参赛者#7 和#10 获胜 --- Cell 应该说参赛者#7 和参赛者#10 平局。
是否有可以为我执行此操作的命令或 VBA 模块?我尝试了下面找到的 VBA 模块,但它只有 returns #NAME?不管我做什么。
要么这段代码有效,但我没有正确插入模块,要么这个模块不适合我的情况,我需要一些新的东西。
帮帮我哦太好了Excel网络圣贤
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
下面的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) 非常易于安装和使用:
- ALT-F11 调出 VBE window
- ALT-I ALT-M 打开一个新模块
- 粘贴内容并关闭 VBE window
如果保存工作簿,UDF 也会随之保存。 如果您使用的 Excel 版本晚于 2003, 您必须保存 文件为 .xlsm 而不是 .xlsx
删除 UDF:
- 如上所述调出 VBE window
- 清除代码
- 关闭 VBE window
要使用来自 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
必须启用宏才能工作!