Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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中基于一个单元格更改另一个单元格的值_Vba_Excel - Fatal编程技术网

Vba 在Excel中基于一个单元格更改另一个单元格的值

Vba 在Excel中基于一个单元格更改另一个单元格的值,vba,excel,Vba,Excel,我是Excel和VBA新手。我正在制作一个项目列表,其中我有两个状态栏,Status和Status in Words。在前者中,我需要以数字形式输入状态,例如50%或80%,在后者中,我需要以文字形式输入项目状态,例如打开、关闭、进行中等。我的问题是,当我在第一列中写入50%时,另一列中的状态应自动更改为in Progress,反之亦然。如果我在第二列中键入Closed,则第一列中的状态应更改为100%。谁能告诉我如何在Excel vba中处理此问题。这可能会奏效。将1更改为较低的列号,将2更改

我是Excel和VBA新手。我正在制作一个项目列表,其中我有两个状态栏,
Status
Status in Words
。在前者中,我需要以数字形式输入状态,例如50%或80%,在后者中,我需要以文字形式输入项目状态,例如打开、关闭、进行中等。我的问题是,当我在第一列中写入50%时,另一列中的状态应自动更改为
in Progress
,反之亦然。如果我在第二列中键入
Closed
,则第一列中的状态应更改为
100%
。谁能告诉我如何在Excel vba中处理此问题。

这可能会奏效。将1更改为较低的列号,将2更改为较大的列号。我不知道如何告诉Excel检查它是否等于“100%”或“50%”,所以我不得不使用1和.5。如果有人知道,请随意编辑或发表评论

'This is a global variable, prevents endless loops in worksheet change.
Dim running As Boolean

'When any change is made on the worksheet, sends target as the changed cell
Private Sub Worksheet_Change(ByVal Target As Range)
    'Checks to see if a worksheet change is already running, if it is, then it quits 
    If running = True Then Exit Sub
    'We are running code now, so prevent endless loops
    running = True
    Dim YourFirstColumn, YourOtherColumn As Integer

    'Set to your values
    YourFirstColumn = 1
    YourOtherColumn = 2

    'If this is a column you want to change
    If Target.Column = YourFirstColumn Then

        'Change values
        If Target.Value = "In Progress" Then
            Target.Offset(0, Abs(YourFirstColumn - YourOtherColumn)).Value = "50%"
        ElseIf Target.Value = "Closed" Then
            Target.Offset(0, Abs(YourFirstColumn - YourOtherColumn)).Value = "100%"
        End If

    'If this is the other column you want to change
    ElseIf Target.Column = YourOtherColumn Then

        'Change values
        If Target.Value = 0.5 Then
            Target.Offset(0, -Abs(YourFirstColumn - YourOtherColumn)).Value = "In Progress"
        ElseIf Target.Value = 1 Then
            Target.Offset(0, -Abs(YourFirstColumn - YourOtherColumn)).Value = "Closed"
        End If
    End If
    running = false
End Sub

在没有VBA的情况下,仅使用2个单元格无法进行“反之亦然”的单元格更改。如果在单元格中手动键入值,它将覆盖用于检查其他单元格的任何公式。您的非VBA选项是使用4列-其中2列为“输入”,2列为“输出”。这样,您可以在前2个字段中输入数据,第2个字段将选择正确的值。我很乐意使用VBA。你能指导我如何进行VBA吗@除非你能读懂你正在运行的代码,否则不要使用VBA。如果你能阅读VBA代码,请先自己尝试,因为这个网站是为特定的问答服务,而不是代码编写服务。如果您对如何使代码正常工作有疑问,我们很乐意提供帮助。事实上,这个问题太宽泛了,无法回答。@Grade'Eh'Bacon我完全同意!请只在你明白你在做什么的情况下使用这个。我写代码,但我做了很多调试。你不需要vba!一个公式就足够了。非常感谢代码,我想这就是我想要的。我有一个问题,我应该把它作为一个新的模块,然后尝试修改并运行它吗?啊,对不起,不。这应该进入工作表的代码,因为它是特定于工作表的,否则,是的。然而,我会在第一行放一个断点,并用“F8”逐行遍历它,以确保它不会弄乱工作表中的任何其他内容。您甚至可能希望在运行它之前保存。在单元格中使用vba代码更改值的一个缺点是,您将无法再执行撤消操作。@seadogie01该代码似乎工作得很好。但是Excel在实现代码后崩溃。有什么想法吗<代码>“方法‘对象范围’\u工作表失败”这是我得到的错误。如果愿意,您可以删除它,但问题可能会因为太宽而结束@Nikky我的意思是,如果您需要VBA解决方案,您不必为此而生气,只是为了鼓励您自己学习如何使用VBA编写代码。否则,您将面临很大的风险,要么运行在不知情的情况下在线发现的恶意代码,要么由于无法修复他人所做的工作而使自己无法完成工作。如果您遇到编码问题时有特定的问题,那么这绝对是解决这些问题的正确地方。