VBA行位置
我目前正在处理由其他人编译的Excel工作表(因此我无法删除或添加列)。我正在使用VBA为工作表用户创建一个界面。在其中一个选项卡中,有三列我希望能够找到给定两个参数的行,这两个参数将在前面的两列中找到,以便我可以输入一个数字。作为参考,我使用下拉选项供用户选择前两个参数,并在输入框中输入第三个参数。需要找到两个输入匹配的位置,并能够在不同的列中指定相同的行 例如(查找pear green的行)[答案是第9行,在第9行中输入输入]VBA行位置,vba,excel,Vba,Excel,我目前正在处理由其他人编译的Excel工作表(因此我无法删除或添加列)。我正在使用VBA为工作表用户创建一个界面。在其中一个选项卡中,有三列我希望能够找到给定两个参数的行,这两个参数将在前面的两列中找到,以便我可以输入一个数字。作为参考,我使用下拉选项供用户选择前两个参数,并在输入框中输入第三个参数。需要找到两个输入匹配的位置,并能够在不同的列中指定相同的行 例如(查找pear green的行)[答案是第9行,在第9行中输入输入] Fruit Color Amount Apple
Fruit Color Amount
Apple Red
Apple Green
Apple Blue
Orange Red
Orange Green
Orange Blue
Pear Red
Pear Green
Pear Blue
这是一个起点:
Function FindOccurence(Fruit As String, Color As String) As Long
Dim WS As Worksheet
Set WS = ActiveSheet
Dim L As Long
L = WS.Cells(WS.Rows.Count, 1).End(xlUp).Row
For Each Cell In WS.Range("A2:A" & L)
If Cell.Value = Fruit And Cell.Offset(0, 1).Value = Color Then
FindOccurence = Replace(Cell.Address(0, 0), "A", "")
Exit Function
End If
FindOccurence = 0
Next Cell
End Function
Sub Main()
Debug.Print (FindOccurence("Apple", "Green"))
End Sub
请注意,这会让您找到第一次出现的还有另一种方法。这是一个起点,可以进行调整以查找工作表中的所有引用。这将使用
.findnext
属性
Sub FindValue()
Dim ws As Worksheet
Dim NoRow As Integer
Dim rng As Range
Dim firstaddress As String
Dim c
Set ws = ThisWorkbook.Sheets("Fruit") ' Change to your sheet name
With ws
NoRow = .Range("A" & .Rows.Count).End(xlUp).Row
Set rng = .Range("A2:A" & NoRow)
With rng
Set c = .Find("Pear", LookIn:=xlValues) ' Change Pear to your test value
If Not c Is Nothing Then
firstAddress = c.Address
Do
If c.Offset(0, 1) = "Green" Then ' Change this to the second cell value
MsgBox c.Address
End If
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
End With
End Sub
子FindValue()
将ws设置为工作表
Dim NoRow作为整数
变暗rng As范围
将第一个地址设置为字符串
dimc
将ws=ThisWorkbook.Sheets(“水果”)更改为工作表名称
与ws
NoRow=.Range(“A”&.Rows.Count).End(xlUp).Row
设置rng=.Range(“A2:A”和NoRow)
带rng
设置c=.Find(“Pear”,LookIn:=xlValues)”将Pear更改为您的测试值
如果不是,那么c什么都不是
firstAddress=c.地址
做
如果c.Offset(0,1)=“绿色”,则“将其更改为第二个单元格值”
MsgBox c.地址
如果结束
集合c=.FindNext(c)
循环而不是c为Nothing,c.Address为firstAddress
如果结束
以
以
端接头
这应该比使用for循环更快此方法非常有效。比如说有一个单独的方法,这样未来的编辑器可以更容易地更新代码。谢谢