Excel 在我打开的任何CSV文件上运行宏,而不仅仅是我有文件名的文件
我使用Excel中的“记录宏”功能创建了一个宏 问题是我有多个CSV文件,录制的宏中硬编码了ActiveSource。如何在没有硬编码工作表标题的情况下在任何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
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建议您尝试整理宏记录器的输出也很好。也许我对你的回答会有帮助。我注意到,你的问题中只有一个得到了答案,但那没有帮助。你的问题太大太模糊了。录制的宏格式化以前导入的文本文件并创建图表。这是两个,可能是三个完全不同的问题,应该放在不同的问题中。