excel VBA根据条件从列表(在另一个表中)中select一个值
在表格“select”中,我在列A中input性别(M或F),在列B中input相应的值。
在“尺寸”表中,我列出了每个性别的可用尺寸,如下所示。
在“select”表中,我希望它在C列上写入相应的大小(必须始终高于B列)。 如果没有可用的大小,则必须写入“不可用”!
在Selection
表Cell C2
中input以下公式
=IFERROR(IF(A2="M",INDEX(Sizes!$A$3:$A$10,MATCH(TRUE,Sizes!$A$3:$A$10>B2,0)),INDEX(Sizes!$B$3:$B$10,MATCH(TRUE,Sizes!$B$3:$B$10>B2,0))),"Not Available")
这是一个数组公式,通过按Ctrl + Shift + Enter来提交。 根据需要拖放/复制。
请参阅图片以供参考
编辑:
以下是VBA解决scheme:
Sub Demo() With Application .ScreenUpdating = False 'stop screen flickering .Calculation = xlCalculationManual 'prevent calculation while execution End With Dim selectionSht As Worksheet, sizeSht As Worksheet Dim selectionLR As Long, sizeLR As Long, lastColumn As Long Dim dict As Object Dim rng As Range, cel As Range, genderRng As Range, valueRng As Range Dim key As Variant Dim colName As String Set dict = CreateObject("Scripting.Dictionary") Set selectionSht = ThisWorkbook.Sheets("Selection") 'Selection sheet Set sizeSht = ThisWorkbook.Sheets("Sizes") 'Sizes sheet selectionLR = selectionSht.Cells(selectionSht.Rows.Count, "A").End(xlUp).Row 'last row in Selection sheet sizeLR = sizeSht.Cells(sizeSht.Rows.Count, "A").End(xlUp).Row 'last row in Sizes sheet lastColumn = sizeSht.Cells(2, sizeSht.Columns.Count).End(xlToLeft).Column 'last column in Sizes sheet using row 2 Set valueRng = selectionSht.Range("B2:B" & selectionLR) 'data with value in Selection sheet 'storing all genders and corresponding column number from Sizes sheet in a dictionary With sizeSht Set rng = .Range(.Cells(2, 1), .Cells(2, lastColumn)) For Each cel In rng dict.Add cel.Value, cel.Column Next cel End With With selectionSht For Each cel In .Range(.Cells(2, 3), .Cells(selectionLR, 3)) '3 is column no for results to be displayed colName = Replace(.Cells(1, dict(CStr(cel.Offset(0, -2)))).Address(True, False), "$1", "") 'get column name from column 2 Set genderRng = sizeSht.Range(colName & "3:" & colName & sizeLR) 'set column for index/match formula cel.FormulaArray = "=IFERROR(INDEX(Sizes!" & genderRng.Address & ",MATCH(TRUE,Sizes!" & genderRng.Address & ">" & cel.Offset(0, -1) & ",0)),""Not Available"")" cel.Value = cel.Value Next cel End With With Application .ScreenUpdating = True .Calculation = xlCalculationAutomatic End With End Sub
如果有什么不清楚,请告诉我。
你可以在C2
使用这个(普通)公式并填写:
C2: =IFERROR(AGGREGATE(15,6,Sizes!$A$3:$B$10 /(Sizes!$A$2:$B$2=A2)/(Sizes!$A$3:$B$10>=B2),1), "Not Available!")