【问题标题】:How to Offset Index Match result in Excel VBA如何在 Excel VBA 中偏移索引匹配结果
【发布时间】:2016-05-26 14:09:34
【问题描述】:

如果在 Sheet1!A:A 上的字符串中找到 Sheet2!A2 值,则 Sheet1!"B2" = Offset(Sheet2!"A2",0,1) 即,我在 Sheet2 上有一个值范围,它们是 Sheet1 范围内值的一部分。如果在 Sheet1 上的值范围内找到 Sheet2 上的值,那么我希望我的结果是 Sheet1 上的相邻值是 Sheet2 的相邻值。 这在 VBA 中如何最好地完成?

这是我需要将公式合并到的代码: 代码现在可以正常工作了

Sub ListAllFiles()

    Dim objShell As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim ws As Worksheet
       Set ws = Sheets("Sheet1")
    Dim myExt1 As String
    Dim myExt2 As String
        myExt1 = "pptx"
        myExt2 = "pdf"

    Set ws = Sheets("Sheet1")
    Set objShell = CreateObject("Shell.Application")
'Get the folder object associated with the directory
Set objFolder = objShell.Namespace("\\sitefs\www\htdocs\c13\comm\IMS\Schedules\")

    Dim objFolderItems As FolderItems
    Dim objFolderItem As FolderItem
        Set objFolderItems = objFolder.Items()

'Loop through the Files collection
Dim fOwner As String
Dim fAuthor As String
Dim dlm As String

ws.UsedRange.Clear
 ws.Cells(1, 1).Value = "The current files found in " & objFolder & " are:"
 ws.Cells(1, 2).Value = "Date Last Modified"
 ws.Cells(1, 3).Value = "Owner"
 ws.Cells(1, 5).Value = "Report Date:"
 ws.Cells(1, 6).Value = Now
 Range("A1").EntireRow.Font.Bold = True
  For Each objFile In objFolder.Items
  dlm = objFolder.GetDetailsOf(objFile, 3)
  If InStr(objFile.Name, "FINAL") Then GoTo 50
   If Year(CDate(dlm)) < Year(Now) Then GoTo 50
   If InStr(objFile.Name, myExt1) Or InStr(objFile.Name, myExt2) Then
    Dim x As Integer
    x = ws.UsedRange.Rows.Count + 1
        ws.Cells(x, 1).Value = objFile.Name
        'Link cell to file
            Cells(x, 1).Select
                Selection.Hyperlinks.Add Anchor:=Selection, Address:=objFile.Path
        ws.Cells(x + 0, 2).Value = dlm
    End If
50 Next

'Added this and it's now working
 Dim oRng As Range
   Dim cRng As Range
   x = ws.UsedRange.Rows.Count
  Set oRng = Range("C2")
  Set cRng = Range("C2:C" & x)
    oRng.FormulaArray = _
        "=OFFSET(INDEX(Sheet2!$A$2:$A$19,MATCH(TRUE,INDEX((ISNUMBER(SEARCH(Sheet2!$A$2:$A$19,a2))),),0)),,2)"
   cRng.FillDown

 Columns("A:B").Sort key1:=Range("B2"), _
      order1:=xlDescending, Header:=xlYes
    Columns.AutoFit
     'Clean up!
    Set objFolder = Nothing
    Set objFile = Nothing
    Set objFSO = Nothing
    Set oRng = Nothing
Set cRng = Nothing 
End Sub

【问题讨论】:

  • (您可以复制/粘贴您的 Sheet1 和 Sheet2 表格吗?它将帮助我们将数据放入 Excel 以帮助您!)
  • 您在哪一行看到正在使用的公式?
  • @ScottCraner OP 说这是模仿您在下面询问的公式的代码。并不是真的试图将其合并到代码中。
  • @findwindow 在我阅读代码时,OP 正在加载 sheet1 列 A 与文件的链接。这就是代码当前正在做的事情。现在 OP 想弄清楚如何将这些文件名称中的关键字与另一个电子表格中的表匹配,并将电子表格 B 列中的值返回到工作表 1 的 B 列中。该部分不存在于上面的当前代码。不,不需要&gt;0,任何大于 0 的都将解析为 true。
  • 您可以随时使用 Worksheet.Evaluate Cells(x, 3).Value = ws.Evaluate("=INDEX(Sheet2!$B$2:$B$9,MATCH(TRUE,INDEX((ISNUMBER(SEARCH(Sheet2!$A$2:$A$9," &amp; Cells(x, 1).Address(0,0) &amp; "))),),0))")

标签: excel excel-formula vba


【解决方案1】:

此公式将在 Sheet 1 中的值中找到 Sheet 2 中的值并返回适当的值:

=INDEX(Sheet2!$B$2:$B$9,MATCH(TRUE,INDEX((ISNUMBER(SEARCH(Sheet2!$A$2:$A$9,A2))),),0))

发生了什么:

内部 INDEX 正在创建一个 TRUE/FALSE 数组,在这种情况下是 8 个对象。

因为当它遍历 Sheet2 上的值时,它要么返回一个数字,要么返回一个错误。

ISNUMBER 根据该结果返回 TRUE/FALSE。

然后 MATCH 遍历数组直到找到 TRUE 并将该索引返回到外部索引公式。

然后返回该数组中位于 MATCH 索引处的值。

【讨论】:

  • 不错!我应该考虑使用Search(),因为可能有“纽约”或“新墨西哥”等。
  • @NicholasPatton 它必须是数组公式的一部分,它不会自行完成。 INDEX 正在做的是创建一个 TRUE/FALSE 数组,在这种情况下是 8 个对象。因为当它遍历 Sheet2 上的值时,它要么返回一个数字,要么返回一个错误,然后 ISNUMBER 根据该结果返回 TRUE/FALSE。然后 MATCH 遍历数组,直到找到 TRUE 并将该索引返回到外部 Index 公式。然后返回该数组中位于 MATCH 索引处的值。
  • @ForwardEd 这是一个类似于 SUMPRODUCT 的非 CSE 数组公式
  • 非常好的公式斯科特!您的掌握程度和学习速度令人惊叹 :) 这是我提出的公式,与您的几乎相同:=INDEX(Sheet2!$B$2:$B$8,MATCH(1,INDEX(COUNTIF(A2,Sheet2!$A$2:$A$8&amp;"*"),),0))
  • 如果你想要vba,不要使用vba中的公式,简单模仿公式的作用。循环遍历第一张表 A 列中的每个单元格。在该循环内,遍历工作表 2 中 A 列中的每个单元格并使用 Instr() 函数测试工作表 2 中的值是否在工作表 1 的值中,如果是,则使工作表 1 中的 B 列中的值 = 列 b 中的值在它们各自行的第 2 页中,然后退出内部 for 循环。如果你想要 vba,我们需要看看你尝试了什么。 SO 不是我服务的代码。 @Adavid02
【解决方案2】:

您的主要想法是,如果您在表 1 中包含“Texas”,上校。 A,您希望“Gardner”出现在 col 中。乙?

您可以在 Sheet1 B2 单元格中使用此公式:

=INDEX(Sheet2!$B$2:$B$4,MATCH(TRIM(LEFT(A2,SEARCH(" ",A2))),Sheet2!$A$2:$A$4,0))

(根据需要扩大范围)

【讨论】:

  • 这不适用于他列表中的最后一个。但是,如果这是一个错字,并且状态之后总是有一个空格并且状态总是第一个单词,那么这是最好的解决方案。
  • 这是一个很好的方法——但它可能会在像纽约这样的价值观上搞砸。例如,如果您将新墨西哥州添加到您的州列表中 - 那么这个等式将根据纽约或新墨西哥州是否在表 2 上的列表更靠前而返回相同的所有者。
  • 基本上——如果您在格式化 PPTX 文件的名称时明智地将 Scott 和我的 cmets 牢记在心,则可以使用此解决方案。否则,您必须制作大量嵌套的“IF”语句,按状态名称(列)创建一个 PPTX 文件(行)表并在每个单元格中搜索,或者使用 VBA 并进行一些循环。
  • 我认为您最好的选择是使用 VBA 创建一个内部构建二维数组的宏。您可以循环遍历并检查是否存在匹配项,然后动态创建要放置在每个单元格中的公式。然后为每一行填写公式。
  • @NicholasPatton - 啊,“纽约”的好点子。我确定有更好的方法(咳嗽 ScottCraner cough)。
猜你喜欢
  • 1970-01-01
  • 2019-02-20
  • 2017-11-04
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
相关资源
最近更新 更多