查找具有特定值的最后一列

Posted

技术标签:

【中文标题】查找具有特定值的最后一列【英文标题】:Look for last column that has a specific value 【发布时间】:2020-02-27 19:02:23 【问题描述】:

我有一个文件,其中有 8 个以上的“销售”列分布在我的工作表中。我尝试了以下代码:如果任何销售单元格有“Title Transfer”,那么第 51 列将有一个“x”。

Option Explicit
Public Const colTTransfer As Long = 51

Private Sub Worksheet_Change(ByVal Target As Range)

Dim lastColumn As Long
Dim counter As Long

lastColumn = Me.Cells(1, Me.Columns.Count).End(xlToLeft).Column

    If Me.Cells(1, Target.Column).Value = "Sales" Then

        For counter = 1 To lastColumn

            If Me.Cells(Target.Row, counter).Value = "Title Transfer" Then

            Me.Cells(Target.Row, colTTransfer).Value = "x"

            End If

        Next counter

    End If

End Sub

但是,我意识到我最初的目的还有更多,而且上面的代码并不灵活。我的代码检查所有 Title Transfer 的销售单元格,但它们没有反映同一行中其他销售单元格的更改。

例如,如果我的第一个销售列中的一个单元格有 Title Transfer,那么第 51 列将返回一个 x。如果同一行中第二个销售列中的单元格具有不同的值,例如Green,第 51 列中的 x 应该被删除(我的代码不能)

所以我想知道是否有办法只为具有Title Transferlast 销售列返回x

例如,假设这些事件发生在同一行,其中:

第 1 个销售列有 Green,第 51 列保持空白 第 2 列的销售额为 Title Transfer,第 51 列的为 x 第 3 列的销售额为 Rollup,第 51 列变为空白 第 4 列的销售额为 Red,第 51 列保持不变 第 5 列有 Title Transfer,第 51 列现在有 x 等等

这是我的数据的样子:

| Title  | Engine   Family  | Market Segment | Customer | Engine Model | S/N | Build Spec | ACTL.FINISH | Sales Order | Item  | Committed Date | EPS Date   | Target | Sales | Production | Day 1 | Status | Sales          | Production | Day 2 | Status | Sales  | Production | Day 3 | Status | Sales | Production | Day 4 | Status | Sales          | Production | Day 5 | Status | Sales  | Production | Day 6 | Status | Sales          | Production | Day 7 | Status | Sales | Production | Day 8 | Status | Status | Comments | MB51 Shipped | FPS? | Plant | Title Transfer |
|--------|------------------|----------------|----------|--------------|-----|------------|-------------|-------------|-------|----------------|------------|--------|-------|------------|-------|--------|----------------|------------|-------|--------|--------|------------|-------|--------|-------|------------|-------|--------|----------------|------------|-------|--------|--------|------------|-------|--------|----------------|------------|-------|--------|-------|------------|-------|--------|--------|----------|--------------|------|-------|----------------|
| Rollup | PS               | APU            | HAC      | T-62T-46C12  | 1   | BS1        | 0000-00-00  | 0           | 0     | 2019/12/31     | 2019/12/31 |        | Green |            |       |        | Title Transfer |            |       |        | Rollup |            |       |        | Red   |            |       |        | Title Transfer |            |       |        | Rollup |            |       |        | Title Transfer |            |       |        |       |            |       |        |        |          |              |      |       |  x             |
|        |                  |                |          |              |     |            |             |             |       |                |            |        |       |            |       |        |                |            |       |        |        |            |       |        |       |            |       |        |                |            |       |        |        |            |       |        |                |            |       |        |       |            |       |        |        |          |              |      |       |                |
|        |                  |                |          |              |     |            |             |             |       |                |            |        |       |            |       |        |                |            |       |        |        |            |       |        |       |            |       |        |                |            |       |        |        |            |       |        |                |            |       |        |       |            |       |        |        |          |              |      |       |                |

Link to sample

请告知我如何使它以这种方式工作。非常感谢任何帮助。谢谢

【问题讨论】:

能否请edit your question 提供样本数据和期望的结果? 您需要显示多行来证明您的问题... 显示一些示例数据,清楚地显示您要解决的问题。看到实际存在的问题可能会使调试变得更容易。 @cybernetic.nomad 抱歉,我已在帖子中添加了数据。期望的结果也写在您在帖子中看到的那些要点中。谢谢 @urdearboy 抱歉,我的问题与我相信的行级别有关,我真的不知道如何通过更多行来反映这一点。我已经在帖子中的这些要点下进行了解释 “第一个销售列有绿色”--> 我在您的示例行中看不到“绿色”...与“标题转移”和“红色”相同。因此需要更多的行。 This may help 【参考方案1】:

您只需将 Title Transfer 字段更新移动到循环的末尾,并将每个 Sales 列评估到末尾。更新的代码应该可以解决这个问题。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column < colTTransfer Then
        If Trim(UCase(Me.Cells(1, Target.Column).Value)) = "SALES" Then
            Dim lastColumn As Long
            Dim counter As Long
            Dim rowIsTitleTransfer As Boolean

            lastColumn = Me.Cells(1, Me.Columns.Count).End(xlToLeft).Column
            rowIsTitleTransfer = False

            ' loop
            For counter = 1 To lastColumn
                If Trim(UCase(Me.Cells(1, Target.Column).Value)) = "SALES" Then
                    rowIsTitleTransfer = Me.Cells(Target.Row, counter).Value = "Title Transfer"
                End If
            Next counter

            ' assign title transfer column
            If rowIsTitleTransfer Then
                Me.Cells(Target.Row, colTTransfer).Value = "x"
            Else
                Me.Cells(Target.Row, colTTransfer).Value = ""
            End If
        End If
    End If
End Sub

【讨论】:

非常感谢您提供的代码。我把它们和你重写的完全一样,但是即使我输入“标题转移”,第 51 列仍然是空白的。你知道为什么吗? 您现有的代码似乎希望用户点击“销售”列之一,否则它不会触发。这是设计使然吗?您是否在测试时单击了其中一个销售列来触发它? 您好,您问的问题是肯定的。我的团队会手动输入这些销售列的值,因此每当销售单元发生变化时,我必须让事件发生/更新 抓错了。已更新。 很抱歉再次告诉您,但没有成功。我已经包含了示例文件的链接。在这一点上,我真的不知道我的文件发生了什么。代码应在“主工作表”中【参考方案2】:

我找到了答案。不过还是谢谢大家的帮助

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim r As Range, r1 As Range, lastColumn As Long, counter As Long
  Dim MaxCol As Variant, rg As Range, j As Long

  If Not Intersect(Target, Range("N:AP")) Is Nothing And Target.Column Mod 4 = 2 Then
    Set r = Intersect(Target, Cells(1, 1).CurrentRegion, Columns(Target.Column).Resize(, 3))
    Call DoCells(r)
  End If

  ' Get last column based on first row
  lastColumn = Me.Cells(1, Me.Columns.Count).End(xlToLeft).Column
  If Me.Cells(1, Target.Column).Value = "MB51 Shipped" Then
    For counter = 1 To lastColumn
      If (Me.Cells(1, counter).Value = "Sales" Or Me.Cells(1, counter).Value = "Production") And IsEmpty(Me.Cells(Target.Row, counter).Value) Then
        Me.Cells(Target.Row, counter).Value = "Rollup"
      End If
    Next counter
  End If

  If Not Intersect(Target, Range("N:AP")) Is Nothing And Target.Column Mod 4 = 2 Then
    If Target.CountLarge > 1 Then Exit Sub
    Set rg = Range("N" & Target.Row & ":AP" & Target.Row)
    MaxCol = 0
    For j = Columns("AP").Column To Columns("N").Column Step -4
      If Cells(Target.Row, j) <> "" Then
        If j > MaxCol Then MaxCol = j
      End If
    Next
    If MaxCol Mod 4 = 2 Then
      If Cells(Target.Row, MaxCol).Value = "Title Transfer" Then
        Cells(Target.Row, 51).Value = "x"
      Else
        Cells(Target.Row, 51).Value = ""
      End If
    End If
  End If
End Sub

【讨论】:

以上是关于查找具有特定值的最后一列的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:查找只有空值的列

Pandas - 在两列中查找具有匹配值的行并在另一列中相乘

jQuery 查找具有特定属性值的特定类

SQL 查询以查找具有相同列值的多行

查找具有特定值的最新记录

如何根据一列是不是具有特定值来查找重复行并删除输出?