我正在尝试自动化数据输入任务,但传入数据的格式有些棘手。进来的是一个 CSV 文件,如下表所示。
ATLANTIC SPIRIT
Looe
Vessel Species Size Kg Date Location
POLLACK 2 2.5 23/04/2024
POLLACK 3 18.8 23/04/2024
POLLACK 41 5.4 23/04/2024
LING 3 1.9 23/04/2024
WHITING 2 0.4 23/04/2024
BEADY EYE
Plymouth
Vessel Species Size Kg Date Location
BASS 4 15.7 23/04/2024
BASS 5 3.2 23/04/2024
BOY JACK
Plymouth
Vessel Species Size Kg Date Location
PLAICE 1 0.8 23/04/2024
BLONDE RAY 1 14.3 23/04/2024
BLONDE RAY 3 1.6 23/04/2024
SPOTTED RAY 5 1.2 23/04/2024
THORNBACK RAY 1 6.3 23/04/2024
THORNBACK RAY 2 15.7 23/04/2024
THORNBACK RAY 3 10.9 23/04/2024
THORNBACK RAY 4 2.6 23/04/2024
LOBSTER 1 2.7 23/04/2024
LOBSTER 2 1.1 23/04/2024
RAY BACKS 1 42.1 23/04/2024
我想根据数据中已有的值填写“船只”和“位置”下的值。我想要的最终结果是这样的:
ATLANTIC SPIRIT
Looe
Vessel Species Size Kg Date Location
ATLANTIC SPIRIT POLLACK 2 2.5 23/04/2024 Looe
ATLANTIC SPIRIT POLLACK 3 18.8 23/04/2024 Looe
ATLANTIC SPIRIT POLLACK 41 5.4 23/04/2024 Looe
ATLANTIC SPIRIT LING 3 1.9 23/04/2024 Looe
ATLANTIC SPIRIT WHITING 2 0.4 23/04/2024 Looe
BEADY EYE
Plymouth
Vessel Species Size Kg Date Location
BEADY EYE BASS 4 15.7 23/04/2024 Plymouth
BEADY EYE BASS 5 3.2 23/04/2024 Plymouth
BOY JACK
Plymouth
Vessel Species Size Kg Date Location
BOY JACK PLAICE 1 0.8 23/04/2024 Plymouth
BOY JACK BLONDE RAY 1 14.3 23/04/2024 Plymouth
BOY JACK BLONDE RAY 3 1.6 23/04/2024 Plymouth
BOY JACK SPOTTED RAY 5 1.2 23/04/2024 Plymouth
BOY JACK THORNBACK RAY 1 6.3 23/04/2024 Plymouth
BOY JACK THORNBACK RAY 2 15.7 23/04/2024 Plymouth
BOY JACK THORNBACK RAY 3 10.9 23/04/2024 Plymouth
BOY JACK THORNBACK RAY 4 2.6 23/04/2024 Plymouth
BOY JACK LOBSTER 1 2.7 23/04/2024 Plymouth
BOY JACK LOBSTER 2 1.1 23/04/2024 Plymouth
BOY JACK RAY BACKS 1 42.1 23/04/2024 Plymouth
船舶和位置信息始终位于同一列中,但不同部分之间可以有任意数量的行。我尝试使用偏移量和 Vlookup,但没有任何方法可以接近工作。
我只是在逃避尝试这样做,还是有一种我没有想到的可行方法?
我会用一段简单的代码来做到这一点:
循环所有数据。查看每个块顶部定义船只/位置的列(我假设这是 B 列)。 将船只名称以及下一行的位置保存到变量中(我将它们命名为
vessel
和 location
)。
对于接下来的行,将容器和位置写入该行的相应单元格中(我假设列 A 和 F)。
如果你发现一个空行,你就知道一个新的数据块开始了——重置变量,整个过程再次开始。
Sub testSub()
With ActiveSheet
Dim row As Long, lastRow as long
lastRow = .Cells(.Rows.Count, "B").End(xlUp).row ' Get number of rows
Dim vessel As String, location As String
For row = 1 To lastRow
Dim cellValue As Variant
cellValue = .Cells(row, 2)
If cellValue = "" Then
' A new block starts
vessel = ""
location = ""
ElseIf vessel = "" Then
' First row of block: read Vessel
vessel = cellValue
ElseIf location = "" Then
' Second row of block: read Location
location = cellValue
Else
If .Cells(row, "A") = "" Then .Cells(row, "A") = vessel
If .Cells(row, "F") = "" Then .Cells(row, "F") = location
End If
Next row
End With
End Sub