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 和其他地方的大量信息。
我已经在 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 和其他地方的大量信息。