excel VBA根据条件从列表(在另一个工作表中)中选择一个值

时间:2017-07-19 09:29:59

标签: excel vba

在表格"选择"我在A栏输入了一个性别(M或F),在B栏输入了一个相应的值。

enter image description here

在工作表"尺码"中,我列出了每种性别的可用尺码,如下所示。

enter image description here

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

enter image description here

2 个答案:

答案 0 :(得分:2)

Cell C2表格的Selection

中输入以下公式
=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 提交它。根据需要拖动/复制。

参见图片以供参考

enter image description here

编辑:

以下是VBA解决方案:

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

如果有什么不清楚,请告诉我。

答案 1 :(得分:1)

您可以在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!")

enter image description here