3

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

在此处输入图像描述

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

在此处输入图像描述

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

现在,我想做的是将这些公式放入 Excel VBA 代码中,并使其适用于指定的范围。我刚刚开始使用 VBA,但我不知道如何在其中使用,尝试了一些但不起作用,...,到目前为止我已经做到了。我是这个 Excel/Macro/VBA 的新手,所以任何帮助都将不胜感激。

4

2 回答 2

2

如果我正确理解您的问题和评论,您希望确保 B&C 列始终根据您的公式向您显示正确的值,但还希望保护(甚至可能隐藏公式)不让用户看到。

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

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

于 2013-02-17T22:00:02.770 回答
2

如果您输入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

RC的解释:

FormulaR1C1引用一个相对于当前单元格的单元格时,公式类型非常适合使用。有几条规则要记住:

  • TheR代表 Row 并且C是 Column 和它后面的整数,如果有的话,定义行或列;
  • 作为基础,RC公式引用自身;
  • RC包裹在后面的任何数字[]都是对自身的偏移,例如,如果您在单元格中A1并使用R[1]C[1],您将引用单元格B2
  • 此外,Rand之后的任何数字C都是精确的,例如,如果您引用R2C2无论您在哪个单元格中,都将指向B2; 和

如果您在 cell 中,会使事情复杂化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)
于 2013-02-17T05:27:16.997 回答