VBA 或将 2x CSV 文件连接到 1x XLSX 的函数
VBA or function to connect 2x CSV files into 1x XLSX
问候,
我得到这个场景有 3 个不同的文件;
1) 一个 CSV 文件的 A 列(-第一行)包含需要复制到 XLSX 文件(也在 A 列)中的缩写
+
2) 另一个 CSV 有很多行和列,其中是对第一种情况(缩写)的解释,我必须在那个大文件中寻找解释(所以我使用了 vlookup)。
=
3) xlsx 文件是单独的,必须将两个 CSV 合并为一个文件,在 A 列中我将有缩写词,在 B 列中我将对某些术语进行解释。
我尝试使用函数并简单地定义范围:
Column A1 ='C:\Users\MirzaV\Desktop\[0528-matrix.csv]0528-matrix'!A3
Column B1 =VLOOKUP(A1;'C:\Users\MirzaV\Desktop\[variantendb.csv]variantendb'!$C:$D;2;0)
所以似乎没有什么困难,但问题是我有 XXX 这些 CSV 文件和一个带解释的主要 CSV 文件(声明为 "varianten"),它们将定期更新 - 所有的文件。
而不是同时打开三个文件只是为了刷新我的功能,用代码或其他功能是不是更快一点??我想把它放在 XLSX 文件中。
我尝试录制一个宏,但效果不佳,我想我可以将它用于其余文件,但总是出错。
Application.Left = 2318.5
Application.Top = 89.5
Windows("0528-matrix1.xlsx").Activate
Range("A1").Select
ActiveCell.FormulaR1C1 = "='0528-matrix.csv'!R[1]C"
Range("A1").Select
Selection.AutoFill Destination:=Range("A1:A500"), Type:=xlFillDefault
Range("A1:A500").Select
ActiveWindow.Close
ActiveWindow.ScrollRow = 1
Application.Left = 2161
Application.Top = 1
Application.Width = 720
Application.Height = 780
Windows("0528-matrix1.xlsx").Activate
Range("B1").Select
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-1],variantendb.csv!C3:C4,2,0)"
Range("B1").Select
Selection.AutoFill Destination:=Range("B1:B500")
Range("B1:B500").Select
Application.Left = 1896.25
Application.Top = 32.5
Application.Width = 864
Application.Height = 493.5
Windows("variantendb.xlsx").Activate
ActiveWindow.Close
Application.Left = 1669
Application.Top = 1
ChDir "C:\Users\MirzaV\Desktop"
由于您使用的是 Office 365,我们可以使用 Get & Transform 功能为您的 CSV 文件创建 link。只要您在 CSV 上保持相同的文件名,这将使 Excel 能够自动更新数据。
我们将分 3 个阶段完成此数据合并:
- Link 参考 CSV(您列出的第二个文件)到 table
- Link到数据CSV(第一个文件)到table
- 编写一个 Index/Match 函数来提取描述。
第 1 阶段:Link将参考文件转换为 table
- 在新的 Excel 工作簿中,单击“数据”选项卡,然后单击“获取和转换”部分中的“新建查询”下拉列表。将鼠标悬停在 "From File >" 和 select "From CSV"
上
- 导航到 CSV 2 并单击“导入”
- 在弹出的下一个 window 中,单击 "Load"
- 您的查找数据现在将加载到新 sheet 上的 table 中。现在让我们清理这里的引用:
- 单击“公式”选项卡,然后单击“名称管理器”
- Select 您的新 table(它将与您的文件同名)
- 将名称更改为 "Reference",然后单击“确定”。
- 转到您的 table 并将列名称从 "Column 1" 和 "Column 2" 更改为 "Abbr" 和 "Desc"
第 1 阶段就到此为止!现在我们已经设置了引用 table 并 link 编辑了,我们可以继续加载数据 table 我们想要找到其描述。
第 2 阶段:Link将数据文件转换为 table
- 我们将 link 以与处理参考文件相同的方式访问数据文件。转到数据 > 获取和转换 > 新查询 > 从文件 > 从 CSV。 Select 您的文件并单击“导入”,然后单击“加载”。
- 在新的 table 上,将第 1 列重命名为 "Code"(我会使用缩略语,但代码将有助于使下一步看起来清晰)。
- 在此 table 添加另一列。最简单的方法是单击 B1,键入 "Desc"(或您选择的任何名称)并按 Enter。
第 3 阶段:神奇的索引函数
- 在描述列为空白的新数据 table 上,单击第一个数据单元格。
- 输入函数
=INDEX(Reference[Desc],MATCH([@Code],Reference[Abbr],0))
并按 Enter。
- 当 Excel 将我们的公式复制到该 table 列中的每个单元格时,观看魔法发生!
通过以这种方式将我们的 CSV 文件设置为外部连接,我们能够创建一个动态 table,它将始终使用 CSV 进行更新。
通过使用 Index/Match,我们能够摆脱 VLookup 的限制(left-most 字段中的数据,按字母顺序排序),并转移到一个允许我们查找的系统我们需要的任何字段中任何顺序的值。
分解,索引returns指定数组的目标行和列中提供的单元格的值或table。因为我们将目标数组指定为单列数据,所以我们可以使用Index([array], [row number])
,或者使用上面的代码Index(Reference[Desc], [row number])
。真正使这项工作成功的是 Match
的使用。匹配returns一个目标值数组中的行号,所以我们使用MATCH([@Code],Reference[Abbr],0)
。这 returns 行号到 Index
,然后从所需的单元格中提取数据。
我们可以使用 Power Query 编辑器执行一些额外的步骤,以确保列 headers 始终保持不变,但这是另一天的教程。希望这对您有所帮助!
问候,
我得到这个场景有 3 个不同的文件;
1) 一个 CSV 文件的 A 列(-第一行)包含需要复制到 XLSX 文件(也在 A 列)中的缩写
+
2) 另一个 CSV 有很多行和列,其中是对第一种情况(缩写)的解释,我必须在那个大文件中寻找解释(所以我使用了 vlookup)。
=
3) xlsx 文件是单独的,必须将两个 CSV 合并为一个文件,在 A 列中我将有缩写词,在 B 列中我将对某些术语进行解释。
我尝试使用函数并简单地定义范围:
Column A1 ='C:\Users\MirzaV\Desktop\[0528-matrix.csv]0528-matrix'!A3
Column B1 =VLOOKUP(A1;'C:\Users\MirzaV\Desktop\[variantendb.csv]variantendb'!$C:$D;2;0)
所以似乎没有什么困难,但问题是我有 XXX 这些 CSV 文件和一个带解释的主要 CSV 文件(声明为 "varianten"),它们将定期更新 - 所有的文件。
而不是同时打开三个文件只是为了刷新我的功能,用代码或其他功能是不是更快一点??我想把它放在 XLSX 文件中。
我尝试录制一个宏,但效果不佳,我想我可以将它用于其余文件,但总是出错。
Application.Left = 2318.5
Application.Top = 89.5
Windows("0528-matrix1.xlsx").Activate
Range("A1").Select
ActiveCell.FormulaR1C1 = "='0528-matrix.csv'!R[1]C"
Range("A1").Select
Selection.AutoFill Destination:=Range("A1:A500"), Type:=xlFillDefault
Range("A1:A500").Select
ActiveWindow.Close
ActiveWindow.ScrollRow = 1
Application.Left = 2161
Application.Top = 1
Application.Width = 720
Application.Height = 780
Windows("0528-matrix1.xlsx").Activate
Range("B1").Select
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-1],variantendb.csv!C3:C4,2,0)"
Range("B1").Select
Selection.AutoFill Destination:=Range("B1:B500")
Range("B1:B500").Select
Application.Left = 1896.25
Application.Top = 32.5
Application.Width = 864
Application.Height = 493.5
Windows("variantendb.xlsx").Activate
ActiveWindow.Close
Application.Left = 1669
Application.Top = 1
ChDir "C:\Users\MirzaV\Desktop"
由于您使用的是 Office 365,我们可以使用 Get & Transform 功能为您的 CSV 文件创建 link。只要您在 CSV 上保持相同的文件名,这将使 Excel 能够自动更新数据。
我们将分 3 个阶段完成此数据合并:
- Link 参考 CSV(您列出的第二个文件)到 table
- Link到数据CSV(第一个文件)到table
- 编写一个 Index/Match 函数来提取描述。
第 1 阶段:Link将参考文件转换为 table
- 在新的 Excel 工作簿中,单击“数据”选项卡,然后单击“获取和转换”部分中的“新建查询”下拉列表。将鼠标悬停在 "From File >" 和 select "From CSV" 上
- 导航到 CSV 2 并单击“导入”
- 在弹出的下一个 window 中,单击 "Load"
- 您的查找数据现在将加载到新 sheet 上的 table 中。现在让我们清理这里的引用:
- 单击“公式”选项卡,然后单击“名称管理器”
- Select 您的新 table(它将与您的文件同名)
- 将名称更改为 "Reference",然后单击“确定”。
- 转到您的 table 并将列名称从 "Column 1" 和 "Column 2" 更改为 "Abbr" 和 "Desc"
第 1 阶段就到此为止!现在我们已经设置了引用 table 并 link 编辑了,我们可以继续加载数据 table 我们想要找到其描述。
第 2 阶段:Link将数据文件转换为 table
- 我们将 link 以与处理参考文件相同的方式访问数据文件。转到数据 > 获取和转换 > 新查询 > 从文件 > 从 CSV。 Select 您的文件并单击“导入”,然后单击“加载”。
- 在新的 table 上,将第 1 列重命名为 "Code"(我会使用缩略语,但代码将有助于使下一步看起来清晰)。
- 在此 table 添加另一列。最简单的方法是单击 B1,键入 "Desc"(或您选择的任何名称)并按 Enter。
第 3 阶段:神奇的索引函数
- 在描述列为空白的新数据 table 上,单击第一个数据单元格。
- 输入函数
=INDEX(Reference[Desc],MATCH([@Code],Reference[Abbr],0))
并按 Enter。 - 当 Excel 将我们的公式复制到该 table 列中的每个单元格时,观看魔法发生!
通过以这种方式将我们的 CSV 文件设置为外部连接,我们能够创建一个动态 table,它将始终使用 CSV 进行更新。
通过使用 Index/Match,我们能够摆脱 VLookup 的限制(left-most 字段中的数据,按字母顺序排序),并转移到一个允许我们查找的系统我们需要的任何字段中任何顺序的值。
分解,索引returns指定数组的目标行和列中提供的单元格的值或table。因为我们将目标数组指定为单列数据,所以我们可以使用Index([array], [row number])
,或者使用上面的代码Index(Reference[Desc], [row number])
。真正使这项工作成功的是 Match
的使用。匹配returns一个目标值数组中的行号,所以我们使用MATCH([@Code],Reference[Abbr],0)
。这 returns 行号到 Index
,然后从所需的单元格中提取数据。
我们可以使用 Power Query 编辑器执行一些额外的步骤,以确保列 headers 始终保持不变,但这是另一天的教程。希望这对您有所帮助!