excel VBA根据条件从列表(在另一个表中)中select一个值

在表格“select”中,我在列A中input性别(M或F),在列B中input相应的值。

在这里输入图像说明

在“尺寸”表中,我列出了每个性别的可用尺寸,如下所示。

在这里输入图像说明

在“select”表中,我希望它在C列上写入相应的大小(必须始终高于B列)。 如果没有可用的大小,则必须写入“不可用”!

在这里输入图像说明

SelectionCell 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!") 

在这里输入图像说明