2013-02-16 151 views
2

所以,在Sheet1我有一些名称的基础,它看起来像这样:Excel公式

enter image description here

在Sheet2中,我从工作表Sheet1这些名称的工作。我这样做是为了在列A中输入代码值并在列B中输入名称,在列C中输入姓氏。这看起来是这样的:

enter image description here

我做这个用的公式,在公式编辑栏中输入密码。对于列A(或名称),我已经使用了这个公式:=IFERROR(VLOOKUP(A2;Sheet1!A:C;2;FALSE);"")和列B(或姓氏)我已经使用这个:=IFERROR(VLOOKUP(A2;Sheet1!A:C;3;FALSE);"")。我已将这些公式拖到第20行,并且效果很好。

现在,我想要做的就是将这些公式放入Excel VBA代码中,并将它们用于指定的范围。我刚开始使用VBA,我不知道如何去做,尝试了一些东西,但没有奏效,......我到目前为止已经做到了这一点。我是新来的这个Excel /宏/ VBA的东西,所以任何帮助,将不胜感激。

+0

你究竟想要宏做什么?如果你只想在一个范围内放置一个公式,你可以尝试类似'Range(“B2:B20”)。Formula =“= IFERROR(VLOOKUP(A2,Sheet1!A:C,2,FALSE);” “”)“' – 2013-02-16 22:57:28

+1

显示”Excel VBA“代码(给出上下文)并解释*如何*它不起作用。 – 2013-02-16 23:05:07

+0

好吧,首先你可以很容易地从单元格中删除公式,而不是你想要的。与宏,我认为这是另一回事。 – Sylca 2013-02-16 23:05:53

回答

1

如果您在Codesheet2键入下面的代码将工作,并强调他们,并运行此宏:

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) e.g. 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 

Explinatioin RC的:

FormulaR1C1公式类型在引用与当前单元格相关的单元格时很适用。有一些规则要记住:

  • R代表行和C是柱和它,如果有的话,定义了行或列后的整数;
  • 作为RC公式引用的基础;
  • 中包含的RC之后的任何数字都是自身的偏移量,例如,如果您位于单元格A1中并使用R[1]C[1],那么您将引用单元格B2;
  • 此外,RC之后的任何数字都是确切的,例如,如果您参考R2C2,则无论您所在的单元格是否也指向B2;和

如果您在单元格C5(例如,使用Range("C5").FormulaR1C1 =和编码的follwing:

  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)
+0

谢谢!这段代码确实做了我所需要的,但是选择仍然继续到列的末尾。我已经把它放到了Worksheet_Change过程中,发生了。你有什么想法为什么?如何解决这个问题? – Sylca 2013-02-17 20:40:58

+1

@glh:两个改进选项:1.使用'WITH Selection'语句2.而不是'rng.Copy/rng.PasteSpecial'只使用'rng.Value = rng.Value' – 2013-02-17 21:46:38

+1

@Sylca,这是因为方法我已经使用更改值,因此无限循环将发生,直到到达最后一列。 – glh 2013-02-18 01:56:38

2

如果我正确理解您的问题和意见,您希望确保列B & C始终根据您的公式向您显示正确的值,但也希望保护(甚至可能隐藏公式)给用户。

我建议您使用表保护,而不是:您只需解锁希望用户编辑的单元格,即选择列A并在_格式单元格_对话框中取消选中“锁定”保护选项卡。同样,对于列B & C,请选中“隐藏”。现在右键单击表名并选择保护表。完成此操作后,用户可以编辑列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 

您需要将这个工作表的模块中。

+0

我想在VBA中确保这一点!原因是,例如,我不知道如何SUMPRODUCT有公式的单元格。另一个,如果我拖动公式到下一页该页面将被激活,我不需要那个。 – Sylca 2013-02-17 22:31:32

+0

另外,在您的答案中,您已从Sheet1的B行取得了值。如何从Sheet1中的C列获取价值?我不完全了解你如何引用特定的列/行/单元格。再次感谢您的努力,您对我的帮助很大!谢谢!!! – Sylca 2013-02-17 22:39:30

+0

您可以使用公式将SUMPRODUCT应用于单元格,方法与将其应用于值的方式相同!不知道我是否理解了拖动公式的问题(答案中的宏也无法解决这个问题):关于公式,我将两个公式组合在一起 - 分别用'2'和'3'替换了'2'和'3', COLUMN(RC)'。这将返回单元格的列号,即列B中的'2'和列C中的'3'。 – 2013-02-18 07:00:42