如何获取excel工作表中具有特定字符串的列,并将其写入新的excel文件中

如何获取excel工作表中具有特定字符串的列,并将其写入新的excel文件中,excel,excel-automation,vba,Excel,Excel Automation,Vba,我有excel文件“file1”和一些表格。我只对一个有许多列的工作表“sheet1”感兴趣,并且我只对该工作表中具有特定名称的少数列感兴趣(excel工作表的第一行包含变量的名称)。我希望找到与特定字符串集匹配(等于)的列(例如,10个变量名),并将它们与这些列中的所有行一起复制,然后将它们粘贴到新的excel文件“file2”中。我想用脚本自动生成第二个excel文件(这个第二个excel文件只有一张工作表) 我开始为此编写一些VBA脚本(我只是通过一点搜索学习了一些,所以我不熟悉VBA),

我有excel文件“file1”和一些表格。我只对一个有许多列的工作表“sheet1”感兴趣,并且我只对该工作表中具有特定名称的少数列感兴趣(excel工作表的第一行包含变量的名称)。我希望找到与特定字符串集匹配(等于)的列(例如,10个变量名),并将它们与这些列中的所有行一起复制,然后将它们粘贴到新的excel文件“file2”中。我想用脚本自动生成第二个excel文件(这个第二个excel文件只有一张工作表)

我开始为此编写一些VBA脚本(我只是通过一点搜索学习了一些,所以我不熟悉VBA),但我遇到了一些错误。我的第一个问题是什么是完成这项任务的最佳工具,然后是如何做。我感谢你的帮助

这是我非常简单的代码,当我知道列数和#行数时可以使用(但两者都会改变,这就是我想处理字符串的原因)


我可能会将ODBC用于Excel和LINQPad,但添加您尚未使用的外部工具似乎有些过头了。使用工作簿中的查询如何?

有时候,复制所有内容并删除不需要的内容更容易

Option Explicit

Sub makeCopy()
    Dim c As Long, cols As Variant

    cols = Array("date", "foo", "bar")

    ThisWorkbook.Worksheets("sheet1").Copy

    With ActiveWorkbook.Worksheets(1)
        For c = .Cells(1, .Columns.Count).End(xlToLeft).Column To 1 Step -1
            If IsError(Application.Match(.Cells(1, c).Value2, cols, 0)) Then
                .Cells(1, c).EntireColumn.Delete
            End If
        Next c
        .Parent.SaveAs Filename:="newFoo", FileFormat:=xlOpenXMLWorkbook
    End With
End Sub

您能详细解释一下“从工作簿查询”的含义吗?Excel功能区,数据选项卡,新查询,从文件,从工作簿。现在,您可以使用Power Query M语言(或查询UI)编辑查询并调整要检索的内容。如果您实际发布您尝试过的脚本并寻求帮助,您可能会得到更好的答案-现在您的问题只是“为我做这件事”,效果不太好。谢谢您的评论。我添加了我的简单代码。感谢您编写代码。我还没有测试它,但我更喜欢非删除选项。这是一个艰难的改变吗?@Ari为什么你更喜欢“非删除”选项?(a)复制整个工作表,然后删除除所需位以外的所有位,与(b)仅复制所需位之间的区别是什么?(除了选项(b)通常更难实施。)@YowE3K我误解了吉普的答案。“我想他会删除原始文件的。”谢谢。你的代码可以正常工作。它在“应用程序定义的错误或对象定义的错误”结尾给出一个错误。它也非常慢,在我的工作笔记本电脑上需要5分钟(我测试的原始文件有7900列和40行)。输出文件是生成的,但没有保存。我猜在保存过程中发生了错误?@ari-(a)将
.Parent.Save
更改为
.Parent.SaveAs
(b)工作表中是否有要复制的公式,或者只是数据?
Option Explicit

Sub makeCopy()
    Dim c As Long, cols As Variant

    cols = Array("date", "foo", "bar")

    ThisWorkbook.Worksheets("sheet1").Copy

    With ActiveWorkbook.Worksheets(1)
        For c = .Cells(1, .Columns.Count).End(xlToLeft).Column To 1 Step -1
            If IsError(Application.Match(.Cells(1, c).Value2, cols, 0)) Then
                .Cells(1, c).EntireColumn.Delete
            End If
        Next c
        .Parent.SaveAs Filename:="newFoo", FileFormat:=xlOpenXMLWorkbook
    End With
End Sub