我想检查上一列中的值是否与新值excel匹配

时间:2014-03-14 13:54:33

标签: excel vba

我正在尝试创建一个打开用户窗体的Excel VBA,并允许用户从组合框中选择他们的名字,这是他们投注的F1比赛的一周,并从组合框中选择5个驱动程序和1个制造商打赌。这些数据将被输入到一个表格中,每个玩家有6行(每个驱动程序/制造商)和22列数周。所以我创建了一个elseif语句,用于检查播放器的名称并将其选择输入到适当的一周。

If UserForm1.Player = "Perry Bell" Then
With ThisWorkbook.Sheets("Players and Picks").Range("a3")
.Offset(1, Week) = UserForm1.Driver1
.Offset(2, Week) = UserForm1.Driver2
.Offset(3, Week) = UserForm1.Driver3
.Offset(4, Week) = UserForm1.Driver4
.Offset(5, Week) = UserForm1.Driver5
.Offset(6, Week) = UserForm1.Manufacturer
End With
ElseIf UserForm1.Player = "Christina Orchow" Then ...etc

我现在需要做的是创建一种方法来确保没有人可以连续两周选择相同的驱动程序/制造商。我打算在if语句中放置一个嵌套循环,以便在输入数据后,它将逐行检查重复选择。然而,这种方式太复杂了。我想使用find方法,但我无法理解语法。是否可以抵消要搜索的范围,以便始终查看上周的列?

提前致谢!

1 个答案:

答案 0 :(得分:1)

是的,找到你想要使用的东西。您可以选择所需的列范围,然后执行.Find off。请尝试参考此链接以获取语法: http://msdn.microsoft.com/en-us/library/office/ff839746(v=office.15).aspx

最终,如果您只搜索记录的一个存在,则使用单个查找方法非常简单。如果你需要使用.findnext来查找相同值的多个实例(主要是因为你必须设置一个停止点以防止无限循环),这会变得更加棘手。

对于单个搜索(假设您的列为C):

Dim Cell as Range
Dim targ as String

targ = "What I'm looking for"

Set Cell = oWksht.Range("C:C").Find(What:=targ, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchDirection:=xlNext, _
SearchFormat:=False)

If Not Cell Is Nothing Then
'Here you can do whatever you need to do when you find a value
End If

要引用变化的列,它会变得稍微复杂一些,但您可以使用单元格(http://msdn.microsoft.com/en-us/library/office/ff196273%28v=office.15%29.aspx)设置变量的范围,单元格用于列和行的数值。然而,这会强制您跟踪行值的开头和结尾(这很烦人)。或者,我非常确定有一种方法可以抵消Range.Column,但我必须使用它才能确定。

<强> - 编辑 -

这是我上周写的一些代码,用于帮助解决您在下面的评论中提到的类似问题。这会做很多额外的工作,所以你必须为你的目的调整它,但通常它应该做你想要的。

它遍历一个名为list的表单,其中包含我需要在名为code的表单中找到的大约80个值,然后它在代码表中搜索匹配的值,并在找到匹配的任何位置将它粘贴到第三个表单中结果

除了变量周列之外,您尝试做的所有事情都应该在这里。

Sub Search_Select()

Dim oWkbk As Excel.Workbook
Dim oWksht As Excel.Worksheet   'Code Sheet
Dim oRsht As Excel.Worksheet    'Results Sheet
Dim oLsht As Excel.Worksheet    'List Sheet
Dim Cell As Range
Dim Cell2 As Range
Dim firstaddress As String
Dim targ As String
Dim listrow As Integer
Dim pstrow As Integer
Dim found As String
Dim foundfull As String

Set oWkbk = ThisWorkbook
Set oWksht = oWkbk.Sheets("Code")
Set oLsht = oWkbk.Sheets("List")
Set oRsht = oWkbk.Sheets("Results")

pstrow = 1
oRsht.Cells.Clear 'Clear data from Results

For listrow = 2 To 79
    targ = oLsht.Cells(listrow, 2).Value                    'Search Target
    oRsht.Range("A" & pstrow).Value = oLsht.Cells(listrow, 1).Value & "." & targ                    'Column A in Results
    Set Cell = oWksht.Range("C:C").Find(What:=targ, LookAt:=xlPart,     SearchOrder:=xlByRows, _
    MatchCase:=False, SearchDirection:=xlNext, SearchFormat:=False)
    If Not Cell Is Nothing Then
        firstaddress = Cell.Address
        Do
            found = oWksht.Cells(Cell.row, 2).Value
            If Not (found = targ) Then
                foundfull = oWksht.Cells(Cell.row, 1).Value & "." & found
                oRsht.Range("B" & pstrow).Value = foundfull
                pstrow = pstrow + 1
            End If
        Set Cell = oWksht.Range("C:C").FindNext(Cell)
        Loop While Not Cell Is Nothing And Cell.Address <> firstaddress
    End If
pstrow = pstrow + 1
Next listrow

Set oWkbk = Nothing
Set oWksht = Nothing
Set oRsht = Nothing
Set oLsht = Nothing
MsgBox "Completed", vbOKOnly
End Sub