2017-05-30 53 views
-2

我正在努力解决下一个问题的出发点。实质上,我需要能够搜索整个电子表格中唯一的13位数字(这将是未知的,因此我不能预先参考),找到所有对该数字的引用,将行复制到新工作表中,然后然后查找下一个13位数字,直到所有不同的13位数字引用都被复制到新的工作表中。现在这个数字可能在A/B列中,但它也可能不是,我们没有给出集合模板中的数据,这就是为什么它需要搜索整个电子表格。任何人都可以给我一个想法,从哪里开始?如果事先知道数字,我有一个子程序的基础,但在这种情况下,我们不知道这些数字只是它们在那里。请帮忙?!这是我需要的VBA解决方案。 Sample Data搜索电子表格中的所有列以获取唯一值

现在唯一编号可能并不总是在列B中,这就是为什么在复制与其相关的所有行之前,宏需要能够识别13位数字所在的列。我希望这更有意义。

+0

请提供有关该问题的更多信息。你描述它的方式有点不清楚。你能举一个例子(虚构的数据是好的)让我们想象这个问题。另一种方式是使用屏幕截图(也可能是虚构数据)。 但是,根据我的理解,我想你需要一个VBA解决方案。 – ksauter

回答

2

这是一个通用的FindAll函数,可以作为开始。你将需要指定一个区域(例如.UsedRange)来搜索和搜索什么,它将返回一系列匹配的单元格。

Function FindAll(What, _ 
    Optional SearchWhat As Variant, _ 
    Optional LookIn, _ 
    Optional LookAt, _ 
    Optional SearchOrder, _ 
    Optional SearchDirection As XlSearchDirection = xlNext, _ 
    Optional MatchCase As Boolean = False, _ 
    Optional MatchByte, _ 
    Optional SearchFormat) As Range 

    'LookIn can be xlValues or xlFormulas, _ 
    LookAt can be xlWhole or xlPart, _ 
    SearchOrder can be xlByRows or xlByColumns, _ 
    SearchDirection can be xlNext, xlPrevious, _ 
    MatchCase, MatchByte, and SearchFormat can be True or False. _ 
    Before using SearchFormat = True, specify the appropriate settings for the Application.FindFormat _ 
    object; e.g. Application.FindFormat.NumberFormat = "General;-General;""-""" 

    Dim SrcRange As Range 
    If IsMissing(SearchWhat) Then 
     Set SrcRange = ActiveSheet.UsedRange 
    ElseIf TypeOf SearchWhat Is Range Then 
     Set SrcRange = IIf(SearchWhat.Cells.Count = 1, SearchWhat.Parent.UsedRange, SearchWhat) 
    ElseIf TypeOf SearchWhat Is Worksheet Then 
     Set SrcRange = SearchWhat.UsedRange 
    Else: SrcRange = ActiveSheet.UsedRange 
    End If 
    If SrcRange Is Nothing Then Exit Function 

    'get the first matching cell in the range first 
    With SrcRange.Areas(SrcRange.Areas.Count) 
     Dim FirstCell As Range: Set FirstCell = .Cells(.Cells.Count) 
    End With 

    Dim CurrRange As Range: Set CurrRange = SrcRange.Find(What:=What, After:=FirstCell, LookIn:=LookIn, LookAt:=LookAt, _ 
     SearchDirection:=SearchDirection, MatchCase:=MatchCase, MatchByte:=MatchByte, SearchFormat:=SearchFormat) 

    If Not CurrRange Is Nothing Then 
     Set FindAll = CurrRange 
     Do 
      Set CurrRange = SrcRange.Find(What:=What, After:=CurrRange, LookIn:=LookIn, LookAt:=LookAt, _ 
      SearchDirection:=SearchDirection, MatchCase:=MatchCase, MatchByte:=MatchByte, SearchFormat:=SearchFormat) 
      If CurrRange Is Nothing Then Exit Do 
      If Application.Intersect(FindAll, CurrRange) Is Nothing Then 
       Set FindAll = Application.Union(FindAll, CurrRange) 
      Else: Exit Do 
      End If 
     Loop 
    End If 
End Function 
相关问题