【问题标题】:Cross-reference between two worksheets两个工作表之间的交叉引用
【发布时间】:2020-11-30 07:25:00
【问题描述】:

我有两个电子表格(OriginalData 和模板),我试图弄清楚如何创建一个 vba 代码,仅当模板中列中的特定单元格时才会将数据从 OriginalData 工作表拉入模板工作表工作表为空白。数据将填充到模板工作表上的另一列中,而不是替换原来的空白单元格。我还需要遍历数据范围内的每个空白单元格。我知道我可以使用 VLOOKUP 公式,但我试图尽可能地自动化这个过程,而不必每次都输入公式。

到目前为止,这是我能够提出的,但它不起作用,现在我被卡住了,所以任何帮助将不胜感激。我对 VBA 编码还是比较陌生,所以请放轻松。

Dim shOrg As Worksheet: Set shOrg = ThisWorkbook.Sheets("OriginalData")
Dim shTemp As Worksheet: Set shTemp = ThisWorkbook.Sheets("Template")
Dim CheckCell as Range
LastRowTemp = shTemp.Cells(Rows.Count, 1).End(xlUp).Row + 1

For Each CheckCell in shTemp.Range("B" & LastRowTemp)
   If CheckCell.Value = "" Then
      Range("C" & CheckCell).Value = Application.VLookup(CheckCell,shOrg.Range("A2:E"),5,FALSE)
   End If
Next CheckCell

End Sub

【问题讨论】:

  • 尝试将Range("C" & CheckCell).Value 更改为Range("C" & CheckCell.Row).Value。您也可以使用CheckCell.Offset(0, 1).Value
  • 它没有用。首先,它要求我定义 LastRowTemp,但我忘记了,所以我将 LastRowTemp 调暗为 Long。然后,当我运行宏时,我得到一个“运行时错误'1004':对象'_Worksheet'的方法'Range'失败,调试器将我带到 Range("C" & CheckCell.Row).Value = Application.VLookup(CheckCell, shOrg.Range("A2:E"), 5, False).
  • .Range("A2:E") 不是一个范围。需要在E后面指定行号。
  • 但是如果我需要从 E 列中的多行中提取数据,那么我该如何实现呢?我是否需要创建一个像 LastRowTemp 这样的变量,但除了 OriginalData 工作表的 LastRowOriginal 之外?当我使用宏记录器查看 VLOOKUP 是如何发挥作用时,这就是我所看到的,那么我将如何将其合并到我现有的代码中呢? ActiveCell.FormulaR1C1 ="=VLOOKUP(RC[-3],OriginalData!C[-3]:C[1],5,FALSE)"

标签: excel vba


【解决方案1】:

响应您上面的评论,以下代码将实现您想要的 - 即定义要评估的行数。

Option Explicit
Sub AutoVlookup()
Dim shOrg As Worksheet, shTemp As Worksheet
Dim OrgRng As String, TempRng As Range, CheckCell As Range

Set shOrg = Sheets("OriginalData")
Set shTemp = Sheets("Template")

'Define the lookup ranges i.e. the last rows
shOrg.Range("A2:E" & shOrg.Cells(Rows.Count, 1).End(xlUp).Row).Name = "OrgRng"
Set TempRng = shTemp.Range("B2:B" & shTemp.Cells(Rows.Count, 1).End(xlUp).Row)

For Each CheckCell In TempRng
    If CheckCell.Value = "" Then
        CheckCell.Offset(, 1).FormulaR1C1 = "=VLOOKUP(RC1,OrgRng,5,FALSE)"
        CheckCell.Offset(, 1).Value = CheckCell.Offset(, 1).Value
    End If
Next CheckCell

End Sub

【讨论】:

  • 不客气,如果您想按照原始帖子“尽可能地自动化此过程”,您可以考虑使用 Worksheet_Change() 触发器在模板表上使用私有子.
  • 明白了!但是我可以问一下潜艇与私人潜艇有什么区别吗?在哪些情况下我想使用私人潜艇?
  • 这是您研究的起点 :) powerspreadsheets.com/vba-sub-procedures/…
  • 您可以随时在 SO 中发布另一个问题,询问如何自动触发上述代码。这应该会开始您对私人潜艇的理解,并希望能吸引一些友好的回应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
相关资源
最近更新 更多