VBA Excel - 根据另一列的值和条件填充列

VBA Excel - Fill columns based on values from another column and conditional

我已经在 Python 中解决了这个问题,但我希望在 VBA 中解决这个问题,这样任何人都可以 cut/paste 将它添加到他们的工作簿中并使用它,因为大多数与我一起工作的人不 Python 识字,在编程方面甚至是最自由意义上的新手。

感兴趣的列(见下文)是 B、C、D。B 列表示与最高顺序(A 列)的分离水平。如果 Col B 中的任何值为 1,则该行的 Col D == A (John)。当 BX > 1(X 为任意行号)时,DX 取 B 中第一行的值,即 正好 比 BX 小 1。例如,D4 == B3,但 D8 == B7,B9 == B6 等等。

在python中,我是这样解决的(我知道这不是很优雅):


import pandas as pd
df = pd.read_csv('workbook.csv', header=0)

levels = df['col2'].to_list()
child = df['col3'].to_list()
parent = []

length = len(levels)
indexing_container = {}

for idx in range(length):
    if levels[idx]==1:
        parents.append('John')
    elif levels[idx]>1:
        index_container.update({str(levels[idx]):child[idx]})
        parents.append(index_container[str(levels[idx]-1)])

df['Parents'] = parents

这很好用,问题是我不知道 VBA。同时阅读文档,但不确定它会如何进行。我如何在 VBA 脚本中编写它?

我们使用 Office 2019,如果这有影响的话。

下面的代码相当简单:它创建了一个名称数组。 B 列给出了数组的索引,C 列给出了名称。
代码遍历所有行,将名称填充到数组中,然后查找上一个索引的名称。

Sub xy()
    Const MaxNames = 10
    
    Dim wb As Workbook, lastRow As Long
    Set wb = Workbooks.Open("workbook.csv")
    
    Dim names(1 To MaxNames) As String
    With wb.Sheets(1)
        names(1) = .Cells(2, 1)
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).row
        Dim row As Long
        For row = 2 To lastRow
            Dim index As Long
            index = .Cells(row, 2)
            names(index) = .Cells(row, 3)
            If index > 1 Then index = index - 1
            .Cells(row, 4) = names(index)
        Next
    End With
End Sub

请注意,我只是将 CSV 文件作为工作簿打开。根据 CSV 文件的内容和 Excel 中的设置,这可能有效也可能无效。如果您遇到问题(例如,将一整行数据写入一个单元格),您需要确定哪种读取数据的方法适合您的需要 - 关于 SO 和其他地方的大量信息。