【问题标题】:Searching for matching cells and copying row data搜索匹配的单元格并复制行数据
【发布时间】:2013-07-23 14:11:13
【问题描述】:

我对 Visual Basic 很陌生,所以如果这是一个基本问题,我深表歉意。

我有两个 Excel 文档,一个包含公司名称列表及其对应的识别号(总共约 4000 个)。在一个单独的文档中,我有一个人员列表以及他们为谁工作(这些与第一个文档中的公司相同,但有时每个公司会有不止一行,因为我们与该公司的多个人一起工作)。这里大约有 7000 个条目。我想将所有公司 ID 号转移到所有公司人员的文档中。我有代码的概念,但不幸的是,我对 Excel VBA 语法的了解不够,无法编写此代码。我写了一些代码,但它不起作用,我不知道为什么。

Sub Firm_Number_Transfer()
    Dim i As Integer
    Dim x As Integer
    Dim row As Integer
    Dim oldRow As Integer
    Dim found As Boolean

    row = 1
    oldRow = 1

    For i = Workbooks("PM Firm Contacts - Step 2 - REVIEWED").Worksheets("Sheet2").Cells("B1") To Workbooks("PM Firm Contacts - Step 2 - REVIEWED").Worksheets("Sheet2").Cells("B7122") Step 1
        row = row + 1
        For x = Workbooks("PM Firms - Step 1 - REVEIWED").Sheets("Sheet1").Cells("B2") To Workbooks("PM Firms - Step 1 - REVEIWED").Sheets("Sheet1").Cells("B4843") Step 1
            oldRow = oldRow + 1
            If i = x Then
                Workbooks("PM Firm Contacts - Step 2 - REVIEWED").Sheets("Sheet2").Cells(row, 1) = Workbooks("PM Firm Contacts - Step 2 - REVIEWED").Sheets("Sheet2").Cells(oldRow, 1)
                found = True
            End If
        Next x
        found = False
        oldRow = 1
    Next i
End Sub

我有什么明显的遗漏吗?任何帮助表示赞赏。

编辑

我还应该补充一点,表格的设置方式是公司位于右侧,公司编号位于左侧。据我了解,VLOOKUP() 仅在公司位于左侧且我要复制的公司编号位于右侧时才有效。否则我会使用VLOOKUP()

【问题讨论】:

  • 您需要添加一些错误捕获,并且可能应该尝试单步执行代码以查看问题发生在哪里。
  • 它给了我一个“下标超出范围错误”,并在我运行它时突出显示第一个语句。
  • 您可以尝试使用 Vlookup,假设人员工作簿中的所有公司名称都与您的公司 ID 工作簿匹配,并且公司 ID 工作簿中没有重复项。
  • 您不能按照设置的方式迭代该 For 循环。给我几分钟,我会发布一个答案来帮助你开始
  • 你熟悉 VLOOKUP() 函数吗?通过这种方式,您可以更轻松地查找每个人所在公司的公司 ID 号。

标签: excel vba


【解决方案1】:

您可以使用VLOOKUP 公式避免代码:

在人员表中,添加目标列:

= VLOOKUP(PARAM1, PARAM2, Param3)

地点:

Param1 - 人事表中包含公司名称的单元格

Param2 - 公司表中的范围(从列到列,如 A:C),从包含公司名称的列到包含其 ID 的列

Param3 - 包含与名称相关的 ID 的列的索引(例如,如果 ID 在 C 列中,而名称在 A 列中,则索引为 3 - 第三列)

你把那个公式拖到所有的人身上。

使用IndexMatch 的其他选项

= index(IDColumn; match(CellWithCompanyNameInPersonelSheet; CompanyNameColumn; 0))

在必须使用列的地方,为列“B”放置类似“B:B”的内容。

【讨论】:

  • 是的,我知道 VLOOKUP(),但它会在单独的文档中查找数据,我认为你做不到。
  • 另外,我在表格的右侧搜索,并在左侧复制数据。看起来好像 VLOOKUP 只在左侧搜索并在右侧复制数据。
  • @bspymaster 你应该可以,除非你的公司使用 Citrix - 在服务器上有 excel - 这有时会导致引用另一个 excel 文件时出现问题。但无论如何,您都可以轻松地将数据复制并粘贴到其他工作簿中。 VLOOKUP 将成为您想要的方式。
  • INDEXMATCH 完全可以参考其他工作簿
  • 我将如何使用INDEXMATCH?我从来没有听说过其中任何一个,我很困惑如何使用它们。我假设类似INDEX(MATCH()),但我不知道要输入什么数据。
【解决方案2】:

这应该可以帮助您入门。 If 块中的语句是错字吗?我认为您可能打算从一个工作簿/工作表复制到另一个(不是从同一个)?

Sub Firm_Number_Transfer()
        Dim i As Integer
        Dim x As Integer
        Dim row As Integer
        Dim oldRow As Integer
        Dim found As Boolean
        Dim xlBook As Workbook, xlBook2 As Workbook
        Dim xlSheet As Worksheet, xlSheet2 As Worksheet
        Dim rng As Range, cell As Range, rng2 As Range, cell2 As Range

    xlBook2 = Workbooks("PM Firms - Step 1 - REVEIWED")
    xlSheet2 = xlBook2.Worksheets("Sheet1")
    Set rng2 = xlSheet2.Range("B2:B4843")

    xlBook = Workbooks("PM Firm Contacts - Step 2 - REVIEWED")
    xlSheet = xlBook.Worksheets("Sheet2")
    Set rng = xlSheet.Range("B1:B7122")

    row = 1
    oldRow = 1

    For Each cell In rng
        row = row + 1
        For Each cell2 In rng2
            oldRow = oldRow + 1
            If cell.Value2 = cell2.Value2 Then
                xlSheet.Cells(row, 1) = xlSheet.Cells(oldRow, 1)
                found = True
            End If

        Next
        found = False
        oldRow = 1

    Next

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多