我正在尝试创建一个打开用户窗体的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方法,但我无法理解语法。是否可以抵消要搜索的范围,以便始终查看上周的列?
提前致谢!
答案 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