2015-01-04 22 views
0

我有一个城市列表作为搜索条件,我正在寻找拉取相应城市的邮政编码。找到匹配项后选择下一个条件

A列包含所有城市,B列为邮编列表,D列为用户输入要搜索的城市名称的标准列。搜索后,相应的邮政编码将列E列出。我有以下VBA中只抓取从D1的搜索条件,但我想知道是否有一种方法来搜索D2的标准后,初步搜索,并下降逐列,直到有上的空栏列D

Sub Test2() 
    Dim Find As String 
    Dim finalrow As Integer 
    Dim i As Integer 

    Find = Sheets("Test").Range("D1").Value 
    finalrow = Sheets("Test").Range("A10000").End(xlUp).Row 

    For i = 2 To finalrow 
     If Cells(i, 1) = Find Then 
      Range(Cells(i, 2), Cells(i, 3)).Copy 
      Range("E10000").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats 
     End If 
    Next i 
End Sub 
+0

要再次运行此子,但使用'D2'为您的标准(依此类推,直到有在D中没有值使用)? – NickSlash

+0

嗨,尼克,这是正确的。如何在列D中再次运行子行,直到列中有空单元格? – Sally

回答

0

试试这个:

Dim wsh as Worksheet 
Dim i As Integer 

Set wsh = ThisWorkbook.Worksheets("Sheet1") 
i = 0 
Do While wsh.Range("D1").Offset(ColumnOffset:=i)<>"" 
    'your code 
    i=i+1 
Loop 

始终上下文中使用的代码。为什么?简单范围(“A1”)是指ActiveSheet。选中此项:

Sub CodeContext 
    Sheets(1).Activate 
    Range("A1") = 1 
    Sheets(2).Activate 
    Range("A1") = 2 
End Sub 
0

尝试以下。您可以使用IsEmpty来确定列表的末尾,假设最后一个列表项目之后的单元格实际上是空的,并且列A中没有列表中间为空的空单元格。

Sub Test2() 

Dim rRngFind As Range 
Dim rRngCity As Range 
Dim rRngResult As Range 
Dim i As Integer 

'Set Input cell for Find, I chose D2 
Set rRngFind = Sheets("Test").Range("D2") 

'Set first city search row, presumably not the top row since you will have headings and such 
Set rRngCity = Sheets("Test").Range("A2") 

'Set Cell for first result, I chose E2 
Set rTngResult = Sheets("Test").Range("E2") 


Do Until IsEmpty(rRngCity) 

    If rRngFind.Value = rRngCity.Value Then 
     rTngResult.Value = Sheets("Test").Range("B" & rRngCity.Row).Value 
     i = rTngResult.Row + 1 
     Set rTngResult = Sheets("Test").Range("E" & i) 
    End If 
    'increment the row 
    i = rRngCity.Row + 1 
    Set rRngCity = Sheets("Test").Range("A" & i) 

Loop 

End Sub 
1

我知道您正在寻求一种基于VBA的解决方案,但标准公式可以完成同样的事情。

Index First Second Third

在E2的标准公式,

=IFERROR(INDEX(B$2:B$999, SMALL(INDEX(ROW($1:$998)+(A$2:A$999<>D$2)*1E+99, ,), ROW(1:1))), "")

向下填充足够数目的行,以捕获所有可能的匹配。在D2中键入城市将立即返回全套匹配的拉链。当它用完匹配时,它将简单地返回一个空字符串(因此需要填充足够的行以容纳最大的一组匹配)。我已经看到COUNTA用于比较列A中的匹配数量与列E中的匹配数量,并且如果公式未被充分填充以捕捉所有可能,则显示红色。

FWIW,如果我打算基于VBA的解决方案,我会用WorksheetFunction.Match,而不是通过每行循环,

+0

不错 - 很高兴有你在这里! – brettdj

相关问题