查找具有特定值的最后一列
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 Transfer
的last 销售列返回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
【讨论】:
以上是关于查找具有特定值的最后一列的主要内容,如果未能解决你的问题,请参考以下文章