在 VBA 中从另一个转移后如何 return 列表框中的范围索引
How to return index of ranges in listbox after they've been transferred from another in VBA
我正在处理一个值数组,其中一些值的主要名称(A 列)相同,并通过附加名称(B 列)进行区分。在这里,它是第一个(文本)和第一个(子),这是将它们输入到左侧列表框然后将一个转移到右侧的方式。选择值并将其传输到正确的列表框后。我希望能够在第 2 行上按 Go 和 运行 操作,因为那是右侧 ListBox 中的值所在的位置。我如何 return 所选项目的索引(或什至只是行号)?我打算让它的最终版本对将放置在正确列表框中的不同数量的项目进行操作,因此我需要能够有一个动态数量的索引来进行操作。
'This is how I've added the entries manually so far. I intend to add them as a dynamic array in the future.
Dim RMs(1 To 3) As String
RMs(1) = Range("A1").Value
RMs(2) = Range("A2").Value
RMs(3) = Range("A3").Value
Dim List(1 To 3) As String
List(1) = RMs(1) & " (" & Range("B1").Value & ")"
List(2) = RMs(2) & " (" & Range("B2").Value & ")"
List(3) = RMs(3) & " (" & Range("B3").Value & ")"
With Sheet1.ListBox1
.AddItem List(1)
.AddItem List(2)
.AddItem List(3)
End With
我不是 100% 了解你所追求的,但也许你可以得到一些想法(如果我没有完全错的话)
要加载具有动态范围的 ListBox1
,您可以尝试:
Sub LoadLB1()
Dim arr As Variant, lr As Long, x As Long
With ThisWorkbook.Sheets("Sheet1") 'Change accordingly
.ListBox1.Clear
lr = .Cells(.Rows.Count, "A").End(xlUp).Row
arr = .Range("A1:B" & lr)
For x = LBound(arr) To UBound(arr)
.ListBox1.AddItem arr(x, 1) & "," & arr(x, 2)
Next x
End With
End Sub
你注意到我用逗号分隔了主要名称和名称。这在下面的第二部分可能会派上用场。
当您填充 ListBox2
并且想要遍历 ListBox2
的所有列表项时,您可以尝试:
Sub GetRowLB2()
Dim arr As Variant, lr As Long, x As Long, rw As Long
With ThisWorkbook.Sheets("Sheet1") 'Change accordingly
lr = .Cells(.Rows.Count, "A").End(xlUp).Row
For x = 0 To .ListBox2.ListCount - 1
arr = Split(.ListBox2.List(x), ",")
rw = .Evaluate("MATCH(1,(A1:A" & lr & "=""" & arr(0) & """)*(B1:B" & lr & "=""" & arr(1) & """),0)")
Debug.Print rw 'Or do some other calculations on this row
Next x
End With
End Sub
你现在可以明白为什么逗号派上用场了,因为我们可以做一个简单的 Split
.
同样,不确定这是否是您想要的。还有一些关于此代码的注释,如果由于某种原因您的数据不包含主要值和指定组合,MATCH
将引发错误。
我正在处理一个值数组,其中一些值的主要名称(A 列)相同,并通过附加名称(B 列)进行区分。在这里,它是第一个(文本)和第一个(子),这是将它们输入到左侧列表框然后将一个转移到右侧的方式。选择值并将其传输到正确的列表框后。我希望能够在第 2 行上按 Go 和 运行 操作,因为那是右侧 ListBox 中的值所在的位置。我如何 return 所选项目的索引(或什至只是行号)?我打算让它的最终版本对将放置在正确列表框中的不同数量的项目进行操作,因此我需要能够有一个动态数量的索引来进行操作。
'This is how I've added the entries manually so far. I intend to add them as a dynamic array in the future.
Dim RMs(1 To 3) As String
RMs(1) = Range("A1").Value
RMs(2) = Range("A2").Value
RMs(3) = Range("A3").Value
Dim List(1 To 3) As String
List(1) = RMs(1) & " (" & Range("B1").Value & ")"
List(2) = RMs(2) & " (" & Range("B2").Value & ")"
List(3) = RMs(3) & " (" & Range("B3").Value & ")"
With Sheet1.ListBox1
.AddItem List(1)
.AddItem List(2)
.AddItem List(3)
End With
我不是 100% 了解你所追求的,但也许你可以得到一些想法(如果我没有完全错的话)
要加载具有动态范围的 ListBox1
,您可以尝试:
Sub LoadLB1()
Dim arr As Variant, lr As Long, x As Long
With ThisWorkbook.Sheets("Sheet1") 'Change accordingly
.ListBox1.Clear
lr = .Cells(.Rows.Count, "A").End(xlUp).Row
arr = .Range("A1:B" & lr)
For x = LBound(arr) To UBound(arr)
.ListBox1.AddItem arr(x, 1) & "," & arr(x, 2)
Next x
End With
End Sub
你注意到我用逗号分隔了主要名称和名称。这在下面的第二部分可能会派上用场。
当您填充 ListBox2
并且想要遍历 ListBox2
的所有列表项时,您可以尝试:
Sub GetRowLB2()
Dim arr As Variant, lr As Long, x As Long, rw As Long
With ThisWorkbook.Sheets("Sheet1") 'Change accordingly
lr = .Cells(.Rows.Count, "A").End(xlUp).Row
For x = 0 To .ListBox2.ListCount - 1
arr = Split(.ListBox2.List(x), ",")
rw = .Evaluate("MATCH(1,(A1:A" & lr & "=""" & arr(0) & """)*(B1:B" & lr & "=""" & arr(1) & """),0)")
Debug.Print rw 'Or do some other calculations on this row
Next x
End With
End Sub
你现在可以明白为什么逗号派上用场了,因为我们可以做一个简单的 Split
.
同样,不确定这是否是您想要的。还有一些关于此代码的注释,如果由于某种原因您的数据不包含主要值和指定组合,MATCH
将引发错误。