【问题标题】:excel cells that display content based on cells "position" in a column根据列中单元格“位置”显示内容的excel单元格
【发布时间】:2015-12-06 12:04:44
【问题描述】:

我正在尝试根据特定列中单元格的相对位置(行)更改单元格的值。 举例说明:

Name    Up   Down   NoMove   New
Bob     0    0      1        0     
Fred    0    0      1        0 
Jane    0    0      1        0 
Peter   0    0      1        0 
etc

外部来源会改变人们(鲍勃、弗雷德)的立场。发生这种情况时,4 列应反映当前状态相对于前一个状态

Name    Up   Down   NoMove   New
Fred    1    0      0        0     
Bob     0    1      0        0 
Jane    0    0      1        0 
Alan    1    0      0        1 
etc

我查看了整个 Stackoverflow,但找不到任何可行的方法。我什至不确定这是否可能,但也许我没有正确的术语。有人可以告诉我在哪里寻找或提供解决方案吗? 谢谢!

【问题讨论】:

  • 不清楚您要做什么。 1)您希望这会发生在同一张纸上吗? (即之前和之后的表格是同一张表,第二个视图是同一张表格,由您所谓的external sources 更改)。这似乎是不可能的。您需要原始表格的副本进行比较。如果原始视图消失了,那么就没有什么可比的了。
  • 您需要更清楚地描述您的问题。在 VBA 中,您可以为 Worksheet_Change 事件编写一个事件处理程序——据此 (social.msdn.microsoft.com/Forums/en-US/…) 是由来自 DDE 外部链接的数据更改触发的。
  • 抱歉,如果不是很清楚。澄清一下:名称列中名称的位置是在外部更新的(它们只会从同一张表的另一部分引用)。理想情况下,同一张纸上只有一张桌子。但是,可以在另一张纸上进行计算。也许在更新之前拍摄了工作表的“快照”,然后将新工作表与快照进行比较?不确定这是否可行。步骤非常简单:更改名称位置会影响其他列,但我想实现起来很困难。
  • 您能帮助我们了解这需要什么目的吗?这是所需的最终输出还是您打算对这张表做些什么?如果这不是最终所需的输出,则可能有一种更简单的方法来获得最终所需的输出。至于怎么办。我会在加载过程中将所有名称和位置加载到数组或字典中,然后将加载位置与数组或字典进行比较。但这又取决于期望的最终结果。
  • @ScottCraner 感谢您的提问。实际上,这里的值最终会存储在 MySQL 数据库中。我在数据库中有一个带有名称、向上、向下等字段的表。本质上,我的 excel 电子表格包含一个简单的名称列表。名称的顺序将定期更改(并且会有新条目)。因此,更好的办法是找出一种在 SQL 中操作数据并直接从普通列表更新表的方法。但我试图先在电子表格中做到这一点。欢迎任何建议。也许列表会转到一个数组,然后可以在每次更改时对其进行操作。

标签: excel


【解决方案1】:

你可以试试这样的一段代码:-

Sub UpDown()

Dim LastRow As Long
Dim var As Variant
Dim name As String
Dim Position As Long

With ActiveSheet

    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

For i = 2 To LastRow

    Range("B:B").Cells(i) = 0
    Range("C:C").Cells(i) = 0
    Range("D:D").Cells(i) = 0
    Range("E:E").Cells(i) = 0

    var = Application.Match(Range("A:A").Cells(i), Range("F:F"), 0)
' Not found
    If (IsError(var)) Then
       Range("E:E").Cells(i) = 1
' Found
    Else
        Position = var
    ' Moved up
        If i < Position Then
            Range("B:B").Cells(i) = 1
        Else
    ' Stayed the same
            If i = Position Then
                Range("D:D").Cells(i) = 1
            Else
        ' Moved down
                Range("C:C").Cells(i) = 1
            End If
        End If
    End If
 Next i

'Copy names

For i = 2 To LastRow
    Range("F:F").Cells(i) = Range("A:A").Cells(i)
Next i

End With

End Sub

我将它分配给一个按钮以对其进行测试,但您也可以将其设置为更改事件处理程序,以便每次 A 列中的某些内容发生更改时它都会运行,或者如 here 所述在计时器上运行它。

开始条件:-

第一关:-

第二遍:-

【讨论】:

  • Position 应该声明为 Long,而不是 Integer,已更正此问题。
猜你喜欢
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
相关资源
最近更新 更多