Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA代码中的Excel公式_Excel_Excel Formula_Vba - Fatal编程技术网

VBA代码中的Excel公式

VBA代码中的Excel公式,excel,excel-formula,vba,Excel,Excel Formula,Vba,所以,在Sheet1中,我有一些名字的基础,它看起来像这样: 在Sheet2中,我正在使用Sheet1中的这些名称。我在a列输入代码值,在B列输入名字,在C列输入姓氏。看起来是这样的: 我已经在公式栏中输入了公式。对于A列(或姓名),我使用了以下公式:=IFERROR(VLOOKUP(A2;Sheet1!A:C;2;FALSE);“”)对于B列(或姓氏),我使用了以下公式:=IFERROR(VLOOKUP(A2;Sheet1!A:C;3;FALSE);“”)。我把这些公式拖到了第20行,效果

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

在Sheet2中,我正在使用Sheet1中的这些名称。我在a列输入代码值,在B列输入名字,在C列输入姓氏。看起来是这样的:

我已经在公式栏中输入了公式。对于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,因此非常感谢您的帮助。

如果您在
sheet2
中键入
code
值并突出显示,然后运行此宏,则以下代码将起作用:

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子工作表\u更改(ByVal目标作为范围)
'如果用户同时更改了多个单元格,是否结束?
如果Target.Count>1,则结束
'更改工作表时停止系统激活工作表\u更改事件
Application.EnableEvents=False
'如果更新了第1(A)列,则继续
"及
'如果标题或行1已更改,则不要继续
如果Target.Column=1且Target.Row为1,则
使用Target.Offset(0,1)“更改下一个单元格,当前列+1(B列)
'RC1=当前行和列1(A),例如,如果A2已编辑,则RC1=$B2
'C1:C2=$A:$B
.FormulaR1C1=“=IFERROR(VLOOKUP(RC1,Sheet1!C1:C2,2,FALSE),”)
.Value=.Value'存储值
以
使用Target.Offset(0,2)“更改下一个单元格,当前列+2(C列)
'C1:C3=$A:$C
.FormulaR1C1=“=IFERROR(VLOOKUP(RC1,Sheet1!C1:C3,3,FALSE),”)
.Value=.Value'存储值
以
如果结束
Application.EnableEvents=True“重置系统事件”
端接头
解释RC:

相对于当前单元格引用单元格时,可以使用
公式1c1
公式类型。有几条规则需要记住:

  • R
    代表行,
    C
    代表列,后面的整数(如果有)定义行或列
  • 作为基础,
    RC
    公式引用自身
  • 包装在
    []
    中的
    R
    C
    后面的任何数字都是自身的偏移量,例如,如果您在单元格
    A1
    中并使用
    R[1]C[1]
    则您将引用单元格
    B2
  • 此外,
    R
    C
    后面的任何数字都是精确的,例如,如果您引用
    R2C2
    ,则无论您所在的单元格是什么,都会指向
    B2
    ;及
如果您在单元格
C5
,则要使事情复杂化,例如使用
范围(“C5”)。公式1C1=
,并对以下内容进行编码:

  • “=RC[-1]”
    引用单元格
    B5
  • “=RC1”
    引用单元格
    A5
    ,更准确地说是
    $A5
  • “=R[1]C[-2]”
    引用单元格
    A6
  • “=Sum(C[-1]:C5)”
    =Sum(B:E)
    ,更准确地说
    =Sum(B:$E)

  • 如果我正确理解您的问题和评论,您希望确保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
    

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

    实际上,不要将Excel用于该任务,而是使用关系数据库。这正是这些设计的目的。如果必须使用Microsoft Office,则可以使用Access。在这种情况下,Excel可以轻松地用作数据库的替代品。特别是在计算方面,它的功能更为广泛,不同的查找函数可以帮助您获得一些DB功能。您希望宏具体做什么?如果您只想将公式放在一个范围内,可以尝试类似于
    range(“B2:B20”)。公式=“=IFERROR(VLOOKUP(A2,Sheet1!a:C,2,FALSE);”)”””)
    显示“Excel VBA”代码(给出上下文)并解释它是如何工作的。请分享您在VBA中尝试的内容。你也可以记录一个宏,这是记录你在屏幕上做什么,然后去代码和调整它。谢谢你!这段代码确实满足了我的需要,但选择继续到列的末尾。我已经把它放进了工作表的更改程序中,事情就这样发生了。你知道为什么吗?如何解决这个问题?@glh:两个改进选项:1。将
    与选择一起使用
    语句2。不要使用
    rng.Copy/rng.PasteSpecial
    只需使用
    rng.Value=rng.Value
    @Sylca,这是因为我使用的方法会更改值,因此在到达最后一列之前会出现无休止的循环。谢谢@glh!我仍然没有完全理解VBA代码,所以我现在感兴趣的是,为了下一个示例,我需要在最后一次代码更新中更改哪些内容才能实现相同的效果?!假设我在B列和I列中输入这些代码值
    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