VBA代码中的Excel公式

所以,在Sheet1中我有一些名字的基础,看起来像这样:

在这里输入图像说明

在Sheet2中,我正在使用Sheet1中的这些名称。 我这样做是为了在列A中input代码值,在列BI中获取名称,在列CI中获取姓氏。 看起来像这样:

在这里输入图像说明

我已经用公式完成了这个,在公式栏中input。 对于列A(或名称),我已经使用了这个公式: =IFERROR(VLOOKUP(A2;Sheet1!A:C;2;FALSE);"")和列B(或姓氏)我已经使用这个: =IFERROR(VLOOKUP(A2;Sheet1!A:C;3;FALSE);"") 。 我已经把这些公式拖到第20行,而且效果很好。

现在,我想要做的就是把这些公式放入Excel VBA代码中,然后将它们用于指定的范围。 我刚刚开始使用VBA,我不知道如何去做,尝试了一些东西,但不起作用,…我已经做到了这一点。 我是新的这个Excel /macros/ VBA的东西,所以任何帮助,将不胜感激。

下面的代码将工作,如果您在sheet2键入您的Code值并突出显示它们,并运行此macros:

 Selection.Offset(0, 1).FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-1],Sheet1!C[-1]:C,2,FALSE),"""")" Selection.Offset(0, 2).FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-2],Sheet1!C[-2]:C,3,FALSE),"""")" Selection.Offset(0, 1).Value = Selection.Offset(0, 1).Value Selection.Offset(0, 2).Value = Selection.Offset(0, 2).Value 

编辑:如果你想要更新值键入使用(谢谢你@PeterAlbert增加优化!):

 Private Sub Worksheet_Change(ByVal Target As Range) 'end if the user made a change to more than one cell at once? If Target.Count > 1 Then End 'stop system activating worksheet_change event while changing the sheet Application.EnableEvents = False 'continue if column 1(A) was updated 'and 'dont continue if header or row 1 was changed If Target.Column = 1 And Target.Row <> 1 Then With Target.Offset(0, 1) 'alter the next cell, current column +1 (column B) 'RC1 = current row and column 1(A) eg if A2 was edited, RC1 = $B2 'C1:C2 = $A:$B .FormulaR1C1 = "=IFERROR(VLOOKUP(RC1,Sheet1!C1:C2,2,FALSE),"""")" .Value = .Value 'store value End With With Target.Offset(0, 2) 'alter the next cell, current column +2 (column C) 'C1:C3 = $A:$C .FormulaR1C1 = "=IFERROR(VLOOKUP(RC1,Sheet1!C1:C3,3,FALSE),"""")" .Value = .Value 'store value End With End If Application.EnableEvents = True 'reset system events End Sub 

RC的开发:

FormulaR1C1公式types适用于当前单元格引用单元格时。 有几条规则要记住:

  • R代表Row, C代表Column,后面的整数代表行或列;
  • 作为RC公式参考的基础;
  • 如果你在单元格A1并使用R[1]C[1]那么你将引用单元格B2 ;
  • RC之后的任何数字都是确切的,例如,如果您引用R2C2 ,则不pipe您所在的单元格是否也指向B2 ; 和

如果你在C5单元格,例如使用Range("C5").FormulaR1C1 =并编码如下:

  1. "=RC[-1]"引用单元格B5
  2. "=RC1"引用单元格A5 ,更正确的是$A5
  3. "=R[1]C[-2]"引用单元格A6
  4. "=Sum(C[-1]:C5)" =Sum(B:E) ,更合适=Sum(B:$E)

如果我正确理解你的问题和意见,你要确保列B&C总是根据你的公式显示正确的值,但也想保护(甚至可能隐藏公式)从用户。

我build议您使用表单保护,而不是:您只需解锁希望用户编辑的单元格,即select列A并在_格式单元格_对话框中取消选中“ 保护”选项卡中的“locking”。 同样,对于B&C列,选中“隐藏”。 现在右键单击工作表名称并select保护工作表 。 一旦完成,用户可以编辑列A – 但不会在B&C中看到公式,并且不能编辑这些单元格。

如果由于某些原因您需要在VBA中确保这一点,请使用以下代码:

 Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False 'to prevent endless loop With Target.Offset(, 2 - Target.Column).Resize(, 2) .FormulaR1C1 = "=IFERROR(VLOOKUP(RC1,Sheet1!C1:C3,COLUMN(RC),0),"""")" .Value = .Value End With Application.EnableEvents = True End Sub 

您需要将其放置在工作表的模块中。