我一直在解决以下问题一段时间,并且我得到了一个非常基本的版本,可以在没有错误处理的情况下工作。我的目标是让这个宏从个人宏观工作簿中运行。从已关闭的工作簿填充正确的标题
我正在从各种来源导入管道分隔的文本文件,并且标题中的格式都不匹配(某些提供程序决定使用整个布局)。有了这个问题,我创建了一个名为Reference(又名Map)的Excel工作簿,其中包含传入文件布局和标准化/更正列的名称格式。
对我来说好消息是,文件ID将始终在A列。我每个月需要处理约65个文件,因此我需要尽量减少所有可能的步骤,因此需要关闭参考工作簿。
因此,我在网上环顾四周,将大部分解决方案放在一起,根据位于A3中的ID拉入新的标题。然而,仍然存在一个困境,有时A3上的ID不会存在于参考工作簿上 - 我需要让vlookup向下移动到下一行,直到结果不等于#N/A或0或空白。
在这一点上,我得到'Do Loop Until'为第一场比赛找到正确的一行 - 完全无法跟随它后面的任何代码。
只要vlookup找到一个包含现有ID的行,然后运行下面的代码片段来填充剩余的标头。下一步的唯一副作用是,由于某种原因,rID偏移+1行,如果最后一行不包含匹配的ID,则撤消'Do Loop'直到'。
'> Populate remining headers
For Each cell In rng1
cell.Value = ("=VLOOKUP(" & cID & rID & "," & map & "," & i & ",FALSE)")
i = i + 1
Next
这是我到目前为止有:
Sub DAc_lookup_headers()
Dim wb1 As Workbook 'Current text/file
Dim map As String 'reference Map
Dim cID As String 'wb1 look up column A
Dim rID As String 'wb1 starting row number
Dim rng1 As Range 'wb1 Collection header range
Dim i As Long 'Index number per cell in range
Set wb1 = ActiveWorkbook
Set rng1 = wb1.ActiveSheet.[A1:G1]
map = ("'C:\Users\x165422\Desktop\New folder\[Reference.xlsx]Ref'!$A$1:$I$13")
rID = 3 'Row where ID is - will increment + 1 if not found
cID = "A" 'Column where ID is
i = 3 'Starting vlookup Index number - to increment per cell in range
'>Look for ID until value is found
Do
wb1.ActiveSheet.[a1].Value = ("=VLOOKUP(" & cID & rID & "," & map & "," & i & ",FALSE)")
rID = rID + 1
Loop Until wb1.ActiveSheet.[a1].Text <> "#N/A" Or "0"
'> Populate remining headers
For Each cell In rng1
cell.Value = ("=VLOOKUP(" & cID & rID & "," & map & "," & i & ",FALSE)")
i = i + 1
Next
'> Convert to values
With rng1
.Value = .Value
End With
End Sub
旨在为数字您的任何头?我发现.txt文件在分隔后经常会有拖尾/前导空格,而这会将它们转换为字符串。 – TMH8885
所有标题都是文本 - 清理的目的是为了能够减少通过查询运行的Microsoft Access文件的数量来清理数据。我每个月处理几百万个单独的条目。如果所有文件具有相同的头文件,那么导入Access的过程将是一个巨大的缓解。 – ExcelNovice2015
我最终取消了列计数验证,因为我可以编辑vlookup并添加更多字段。 – ExcelNovice2015