我的实验室能够进行 20 多种不同的分析,我们从大约 15 家公司获得了对这些分析进行组合的合同。我创建了一个 Excel 电子表格来跟踪工作,其中列是我们可以运行的 20 种不同的分析,行是公司。我输入复选标记或“NA”,这取决于该公司是否要求进行特定分析。(每个公司都要求自己的分析组合)。
我需要以下方面的帮助:
如果我在单元格 A100 中输入“公司 1”,我希望单元格 B100 显示“NA”。如果我输入“公司 2”,我希望单元格 D100 显示“NA”。例如,如果我输入“公司 3”,则什么都不做。我可以手动添加复选标记,因为还有其他变量不需要提及。
现在,我已经能够在某种程度上在 VBA 中开发一些玩具解决方案(请参阅下面的代码)。但是,我有两个问题:
为了运行代码,我必须切换到 VBA 编辑器并在每次输入后按 F5。相反,我希望它像使用单元格公式一样工作。换句话说,如果我在 A 列的任何单元格中输入“公司 1”并点击“Enter”,我希望“NA”自动显示在该行的相应单元格中。我想我可以为此录制一个宏,但是该文件与许多人共享,我宁愿避免这种情况。
未来我需要添加更多的公司和分析,所以我需要一个可以快速进入和更新的代码。或者也许有一个我添加到的公司列表并将其以某种方式链接到我的代码。
Sub writeNA()
For i = 1 To 20 Step 1
x = Cells(i, 1).Value
If x = "Company 1" Then
Cells(i, 2).Value = "NA"
End If
If x = "Company 2" Then
Cells(i, 3).Value = "NA"
End If
If x = "Company 3" Then
Cells(i, 4).Value = "NA"
End If
Next
End Sub
谢谢!
您可以使用公式执行此操作,只要您不需要编辑结果
NAME
表,例如: tblTests
它可能看起来像:
B2
工作表中,输入公式:对于 O365:
=IFERROR(FILTER(tblTests[[Test1]:[Test20]],tblTests[Company]=A2),"")
对于早期版本:
=IFERROR(INDEX(tblTests[[Test1]:[Test20]],MATCH(A4,tblTests[Company],0),0),"")
并根据需要填写。
(如果您的 Excel 版本没有动态数组,您可能需要在 20 个单元格的整个行段中将其作为数组公式输入)
如果您现在在 A 列中输入公司名称,它将自动使用您设置的模式填充该行。
如果这必须是一个宏,或者如果您在填写单元格后可能需要修改它们,您可以使用类似的方法,使用一个宏引用您在工作簿或代码中设置的查找表,以及让宏由worksheet_change
针对 A 列的事件触发
例如,输入以下代码作为Worksheet Code
您记录公司的工作表:(请注意,我们仍在工作簿中的某些工作表上使用模板表)
Option Explicit
Option Compare Text
Private Sub Worksheet_Change(ByVal Target As Range)
Dim R As Range, C As Range, V, I As Long, J As Long
Dim tblTests As Variant
Set R = Columns(1)
Set C = Intersect(Target, R)
If Not C Is Nothing Then
If C.Count > 1 Then
MsgBox "Enter only one company at a time"
Exit Sub
End If
'tblTests is on Sheet1
tblTests = Sheet1.ListObjects("tblTests").DataBodyRange
Application.EnableEvents = False
With C
Range(.Cells(1, 2), .Cells(1, 21)).ClearContents
'with only 20 companies, can loop the table
'if you have thousands, may be more efficient to read the lookup table into a dictionary
I = 1
Do Until tblTests(I, 1) = C.Value
I = I + 1
If I > UBound(tblTests, 1) Then Exit Do
Loop
If I > UBound(tblTests, 1) Then
If Len(C) > 0 Then .Offset(0, 1) = "Company not in template table"
Else
ReDim V(1 To 21)
For J = 1 To 21
V(J) = tblTests(I, J)
Next J
.Resize(columnsize:=21) = V
End If
End With
Application.EnableEvents = True
End If
End Sub
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句