Excel 在我打开的任何CSV文件上运行宏,而不仅仅是我有文件名的文件

Excel 在我打开的任何CSV文件上运行宏,而不仅仅是我有文件名的文件,excel,vba,Excel,Vba,我使用Excel中的“记录宏”功能创建了一个宏 问题是我有多个CSV文件,录制的宏中硬编码了ActiveSource。如何在没有硬编码工作表标题的情况下在任何CSV上运行宏 另外,我不想像下面的例子那样使用固定列。我想根据列的标题选择列。例如,如果A1中的列标题是volts,那么我希望图形中的列A Sub CreateThermalPlot() ' ' CreateThermalPlot Macro ' Create new thermal plot of .csv that contains

我使用Excel中的“记录宏”功能创建了一个宏

问题是我有多个CSV文件,录制的宏中硬编码了ActiveSource。如何在没有硬编码工作表标题的情况下在任何CSV上运行宏

另外,我不想像下面的例子那样使用固定列。我想根据列的标题选择列。例如,如果
A1
中的列标题是
volts
,那么我希望图形中的列
A

Sub CreateThermalPlot()
'
' CreateThermalPlot Macro
' Create new thermal plot of .csv that contains Reported CPU temp, Diode Temp, and Td.
'
' Keyboard Shortcut: Ctrl+j
'
    Rows("1:1").Select
    Selection.Delete Shift:=xlUp
    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
        Semicolon:=False, Comma:=True, Space:=True, Other:=False, FieldInfo:= _
        Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7 _
        , 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array _
        (14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array(20, 1), _
        Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1)), _
        TrailingMinusNumbers:=True
    ActiveWindow.ScrollColumn = 2
    ActiveWindow.ScrollColumn = 3
    ActiveWindow.ScrollColumn = 4
    ActiveWindow.ScrollColumn = 5
    ActiveWindow.ScrollColumn = 6
    ActiveWindow.ScrollColumn = 7
    Range("A:A,T:T,U:U,W:W").Select
    Range("W1").Activate
    ActiveSheet.Shapes.AddChart.Select
    ActiveChart.ChartType = xlLine
    ActiveChart.SetSourceData Source:=Range( _
        "monitor_ENGtrevorSBTSITND_4910_!$A:$A,monitor_ENGtrevorSBTSITND_4910_!$T:$T,monitor_ENGtrevorSBTSITND_4910_!$U:$U,monitor_ENGtrevorSBTSITND_4910_!$W:$W" _
        )
    ActiveChart.Location Where:=xlLocationAsNewSheet
End Sub

对于第一个问题,使用在运行时选择的文件路径/文件名,我将在工作簿的第一页上有一个单元格,我将文件名和路径粘贴到其中,可能是Sheet1单元格A1,然后我将使用

ActiveSheet.QueryTables.Add(Worksheets("Sheet1").range("A1").value,Destination:=Range("$A$1")).TextFileCommaDelimiter = True
您可能需要根据需要调整更多属性(请尝试录制使用数据的宏)→ 如果您不确定所关心的属性或如何指定属性,请使用文本功能)

对于第二个问题,如果列的名称总是完全相同的,拼写没有变化,并且它们总是在最上面一行,那么我倾向于使用For循环和Case Select。以下是我的一些代码:

        'Loop through all the columns to find the ones we want to graph
        For j = 2 To act_cols
            Select Case ws.Cells(1, j).value
                Case "FT410": ft410_col = j
                Case "FT410FlowCheck": ft410check_col = j
                Case "VSD410": vsd410_col = j
                Case "Set Point": sp_col = j
                Case "% Error (Avg)": error_avg_col = j
            End Select
        Next j
你的第三期应该有自己的帖子,内容要详细一点


希望对您有所帮助。

您也可以动态打开所有要使用的文件。这里不需要在VBA或工作表中硬编码任何内容,而且您可以有一个主xlsm文件,可以同时处理大量文件

Function SelectFilesToWorkWith() As Collection
    Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    Dim files As New Collection

    With fd
        .AllowMultiSelect = True
        .Show
        For Each file In .SelectedItems
            files.Add (file)
        Next file
    End With
 Set SelectFilesToWorkWith = files
End Function

Sub work()

    Dim filesToWorkWith As New Collection
    Set filesToWorkWith = SelectFilesToWorkWith

    Dim CSVfile As String

    For Each CSVfile In filesToWorkWith

        Workbooks.Open (CSVfile)
        '...do work with file
    Next CSVfile

End Sub

从录制宏开始做得很好。这也应该给你关键词来搜索和找到更多的拼图部分,例如:VBA帮助是你的朋友(F1)。例如,我猜想对
ScrollColumn
的调用对您没有任何帮助,因此可以删除它们。同时也要去掉所有的
Select选项
verbosity。因此,不要选择
列(“A:A”)。选择
选择。TextToColumns
只需说
列(“A:A”)。TextToColumns
。那些乱七八糟的
Array
业务是什么?在
TextToColumns
help中查找。也许您可以删除一些
TextToColumns
参数。一旦你完成了所有这些,你的宏对你自己(和我们)来说就会变得更加清晰,增加了你在上面构建宏的机会。Remou的建议会让你很好地回答一个关于将7000个文件读入工作簿的问题,尽管我希望你从较少的文件开始。Jean-François建议您尝试整理宏记录器的输出也很好。也许我对你的回答会有帮助。我注意到,你的问题中只有一个得到了答案,但那没有帮助。你的问题太大太模糊了。录制的宏格式化以前导入的文本文件并创建图表。这是两个,可能是三个完全不同的问题,应该放在不同的问题中。