【问题标题】:How to set value in a cell based on another cell value from another column using formula or VBA?如何使用公式或 VBA 根据另一列中的另一个单元格值设置单元格中的值?
【发布时间】:2018-11-21 10:22:54
【问题描述】:

我有两张床单:

表 1: 由三列组成(状态成本版本

表 2: 用作具有两列(公式版本号)的操作页面。

问题:

我想在表格 2 的第二列中设置版本号,并让公式或按钮使用 VBA 代码执行以下操作:

  1. 用户在第 2 列 [版本号] 表 2 中设置 value = 5
  2. 系统从 [版本号] 单元格中获取值
  3. 系统在工作表 1 列 [Version] 中搜索所有包含 [Version Number] 值 = 5 的行
  4. 系统将 [Status] 列中具有 [Version] 值 = 5 的每个单元格替换为 Status Value = “已交付”。

任何帮助请抛出公式或使用 VBA 代码。

问候

【问题讨论】:

  • 您将需要 VBA 来实现这一点。但请注意,由于这不是免费的代码编写服务,因此有必要显示您迄今为止尝试过的内容以及卡住的地方或错误(通过显示您的代码),或者至少显示您的研究和努力制作。否则,它只是要求我们为您完成所有工作。

标签: excel vba formula


【解决方案1】:

如果这就是您想要实现的全部目标,并且您可以在 Sheet1 中的 [Status] 字段中使用公式,那么您可能想要做的就是使用以下公式:

=IF(C2 = 5, "Delivered", "Pending")

这基本上是查看您的 Version 列并检查您的版本号是否为 5,然后将文本更改为 Delivered,否则使用待处理(或任何您需要的)。

【讨论】:

  • 感谢 DarXyde 的帮助。而您提供的解决方案是在单元格本身内设置一个公式。但是我的问题是不同的,每个单元格都有一个下拉列表,所以我不需要在里面设置公式,我会附上一张图片供您参考,它将更多地描述我的问题。
  • 现在有点清楚了,是的,你需要一些 VBA 来帮助你。正如@Pᴇʜ 指出的那样,不幸的是,这也需要您做一些工作。我只能说,工作表事件很可能会有所帮助,这可能会让您了解如何使用这些事件:excel-pratique.com/en/vba/worksheet_events.php
  • 我建议使用按钮而不是事件。这是用户所熟悉的,也更容易实现。
【解决方案2】:

非常感谢大家的建议,在搜索了关键代码以知道如何返回特定表中填充的行数之后,我找到了解决方案,现在我可以做我的逻辑了。以下是我对上述问题的解决方案。

步骤:

  1. 创建变量以保存值
  2. 以下变量将保存需要更新的插入值
  3. 下面的变量将保存表中的项目版本列号
  4. 下面的变量将保存列 [Get_Version_Item_Column] 下的每一行的值,以便在比较每一行的值时使用
  5. 以下变量将保存表中的项目进度列编号
  6. 以下变量将保存列 [Get_Item_Progress_Column] 下每一行的值,以便在比较值或每一行时使用
  7. 以下变量用于获取表中已使用的总行数
  8. 下面的变量用作计数器,为所有行抛出循环

创建一个按顺序执行以下操作的函数:

  1. 从表 1 Sheet1 中获取列号,其中标题名称 = [在版本中固定]

  2. 从表 1 Sheet1 中获取列号,其中标题名称 = [项目进度]

  3. 选择 Sheet 2 以获取插入到单元格 B1 中的值

  4. 从位于 Sheet2 内的单元格中获取插入的值

  5. 设置 Counter value = 1 以从表 1 Sheet 1 中标题后的第一行开始循环

  6. 如果计数器

  7. 使用 Cells 方法开始在表格中逐行移动: Cells(counter, Get_Version_Item_Column) ' 在 cells 方法中我们设置了 [Row]=> 以 value = 1 开始的计数器变量,[Column] => Get_Version_Item_Column '

  8. 获取我们要放入条件的第二列的值,方法同步骤7

  9. 使用 IF Else 开始设置条件

  10. 如果 Get_Fixed_In_Version_Value = Get_Version_Inserted_Value And Get_Item_Progress_Value = "Approved" Then 'IF CORRECT NUMBER' 做某事 示例 [用 value = "" 替换此行、此列、此单元格中的值]

    李>
  11. Else ' 做其他事

  12. 计数器加 1

  13. 关闭 While 循环

代码解决方案:

Public Get_Version_Inserted_Value As String
Public Get_Version_Item_Column As Integer
Public Get_Fixed_In_Version_Value As String
Public Get_Item_Progress_Column As Integer
Public Get_Item_Progress_Value As String
Public QATotal_Items_Row As Integer
Public counter As Integer

Function Change_Version_Item_Progress() As String

Get_Version_Inserted_Value = ThisWorkbook.Worksheets("Sheet2").Range("B1").Value2

Get_Version_Item_Column = Application.Match("Fixed in Version", Sheets("Sheet1").Rows(1), 0)

Get_Item_Progress_Column = Application.Match("Item Progress", Sheets("Sheet1").Rows(1), 0)

Sheets(Sheet1).Select
QATotal_Items_Row = WorksheetFunction.CountA(Range("B:B")) - 1 
counter = 1
 While counter <= QATotal_Items_Row

    Get_Fixed_In_Version_Value = ThisWorkbook.Worksheets("Sheet1").Range("Table1").Cells(counter, Get_Version_Item_Column).Value2

    Get_Item_Progress_Value = ThisWorkbook.Worksheets("Sheet1").Range("Table1").Cells(counter, Get_Item_Progress_Column).Value2

    If Get_Fixed_In_Version_Value = Get_Version_Inserted_Value And Get_Item_Progress_Value = "Approved" Then 

        Get_Item_Progress_Value = ThisWorkbook.Worksheets("Sheet1").Range("Table1").Cells(counter, Get_Item_Progress_Column).Value = "Delivered"

    Else 
        Get_Item_Progress_Value = ThisWorkbook.Worksheets("Sheet1").Range("Table1").Cells(counter, Get_Item_Progress_Column).Value = Get_Item_Progress_Value

    End If
        counter = counter + 1 
    Wend

End Function

希望它会有所帮助。

问候

【讨论】:

  • 感谢 Patrick 提供的格式,我在将代码自定义为这种格式时总是遇到问题。哈哈哈哈哈