【发布时间】:2017-09-12 09:06:53
【问题描述】:
我有一个 Excel 工作簿,其中包含 2 个主工作表和一个数据输入工作表。
项目负责人:
|Project No |Asset No |
|------------|------------|
|P01 |A01 |
资产大师:
|Asset No |Description |
|-----------|--------------|
|A01 |Testing |
对于我的数据输入表,我想使用项目编号作为参考,并使用 VBA 中的索引/匹配公式来搜索其他 2 个字段。在这种情况下:
|Project No |Asset No |Description |
|------------|-----------|-------------|
|P01 |A01 |Testing |
我还希望数据输入表只更改选定的行,而不是在更改单个单元格时刷新整个表。所以在 VBA 数据输入表中我使用了代码:
Private Sub worksheet_change(ByVal target As Range)
If Not Intersect(target, Range("a9:a9999")) Is Nothing Then
'---------------------------------------------------------------
With target.Offset(0, 1)
.FormulaR1C1 = "=IF(ISNA(INDEX(ProjectEntry,MATCH(rc1,ProjectEntry[Project No],FALSE),2)),"""",INDEX(ProjectEntry,MATCH(rc1,ProjectEntry[Project No],FALSE),2))"
.Value = .Value
End With
With target.Offset(0, 2)
.FormulaR1C1 = "=IF(ISNA(INDEX(AssetMaster,MATCH(rc1,AssetMaster[Asset No],FALSE),2)),"""",INDEX(AssetMaster,MATCH(rc1,AssetMaster[Asset No],FALSE),2))"
.Value = .Value
End With
End If
End Sub
当我使用此代码时,只有资产 no 出现,而 description 保持为空。每当我选择的范围内的单元格 (a9:a9999) 的值发生更改时,代码应该在行中执行更改。
这是由于代码限制必须参考 2 个主表,它仅指项目主表,而资产主表被忽略?有没有办法解决这个问题?
【问题讨论】:
-
根据经验,使用 VBA 编写工作表函数并不是一个好主意。这个布丁的证据就是你几乎卡在第一行代码上。
-
是的。然而,这只是一个更大的项目的测试平台,该项目正在进行中,以前所有的公式都在工作表中。每当我尝试过滤主表时,这都会导致主服务器严重减速。我发现将公式放在 VBA 中然后让它保存值只会有助于防止这个问题。
-
你为什么用 VBA 做这个。只需在相关单元格中编写公式即可。如果您不想在单元格中显示错误,请使用 IFERROR(yourlongformula,"")
-
@Variatus 问题清楚地 说明这是一个需要打破经验法则的特殊情况。 (正如 hjh93 针对您的评论所证明的那样。)
-
我同意你的逻辑。但是,您的要求不是“将公式放入 VBA”。它是使用 VBA 将公式写入工作表。如果下一步是保存由公式计算的值,我的观点将得到证明:让 VBA 计算值并将它们写入工作表。无论如何,我在下面发布了一些代码,如果对您有帮助,我会很高兴。