晚上好,我正在尝试加载多个csv文件,然后计算从E列到最后一列的每列的最大值(每次运行的最后一列可能不同)并将值粘贴到新工作表中。
在我学习VBA时,我试图分阶段打破我的指导:
步骤1.打开文件夹选择对话框的代码,并将每个文本文件加载到具有文件名的不同工作表中的Excel
步骤2.打开新工作表并命名为“结果”的代码
一些样本数据步骤1和2如下所示[图1]:
最后
步骤3.代码查找E列到最后一列的最大值,并在结果表中粘贴工作表名称中的年份编号和高数,例如,如下所示:
到目前为止,在这个论坛的帮助下,我设法创建了一个带有简单用户形式的程序,其运行按钮如下所示:
我已经完成了步骤1和步骤2(请参阅下面的代码),但现在确实坚持第3步。
到目前为止,对于第3步,我已经设法编写了一些可以计算列'E'的最大值的东西但是却无法弄清楚如何计算每个工作表中“E”列以后的所有列并粘贴到结果片。我可以使用以下代码计算col E max,但代码中的第5行不会复制到其他列:
Sub SumData()
Dim lastrow As Long
lastrow = Range("A1").End(xlDown).Row
Cells(lastrow + 2, "E").Formula = "=MAX(E2:E" & lastrow & ")"
Cells(lastrow + 2, "E").AutoFill , Type:=xlFillDefault
End Sub
我非常感谢我对第3步的任何建议,并让您更容易理解我在下面的下拉框链接中复制了我的示例csv文件: https://www.dropbox.com/sh/hqhzd901vwlgbl9/AAApxVc_CAsESxR9iZ4cHoOua?dl=0
我为第1步和第2步创建的代码位于下方并为我工作:
Private Sub FilePath_Button_Click()
get_folder
End Sub
Private Sub Run_Button_Click()
load_file
End Sub
Public Sub get_folder()
Dim FolderName As String
With Application.FileDialog(msoFileDialogFolderPicker)
.AllowMultiSelect = False
.Show
On Error Resume Next
FolderName = .SelectedItems(1)
Err.Clear
On Error GoTo 0
End With
TextBox1.Text = FolderName
End Sub
Sub load_file()
Dim strFile As String
Dim WS As Worksheet
Dim test As String
Dim wb As Workbook
test = TextBox1.Text
strFile = Dir(Me.TextBox1.Text & "\*.plt")
Set wb = Workbooks.Add
'added workbook becomes the activeworkbook
With wb
Do While Len(strFile) > 0
Set WS = ActiveWorkbook.Sheets.Add
WS.Name = strFile
With WS.QueryTables.Add(Connection:= _
"TEXT;" & test & "\" & strFile, Destination:=Range("$A$1"))
.Name = strFile
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 437
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
strFile = Dir
Loop
End With
Dim WS2 As Worksheet
Set WS2 = Sheets.Add
Sheets.Add.Name = "Result"
MsgBox "Job Complete"
End Sub
Private Sub UserForm_Click()
End Sub
可能有很多简单的编写代码的方法,但这是我在第1步和第2步中想出的最好的方法。非常感谢提前!
答案 0 :(得分:1)
如果所有工作表名称具有相同的格式,即XXX_XXX_XX_XXXX
,则提取这些值非常简单。您可以使用Split
功能。这是一个例子
Sub Sample()
Dim sName(1 To 4) As String
Dim i As Long
sName(1) = "HP5_1gt_60_2010"
sName(2) = "HP5_1gt_70_2010"
sName(3) = "HP5_1gt_100_2008"
sName(4) = "HP5_1gt_110_2008"
For i = 1 To 4
Debug.Print "Height --> " & Split(sName(i), "_")(2)
Debug.Print "Year --> " & Split(sName(i), "_")(3)
Debug.Print "-----"
Next i
End Sub
<强>输出强>
要查找列中的最大值,可以使用VBA中的Max
工作表函数。这是一个例子
Sub Sample()
Dim ws As Worksheet
Dim rng As Range
Set ws = ThisWorkbook.Sheets("Sheet1")
Set rng = ws.Columns(5)
Debug.Print Application.WorksheetFunction.Max(rng)
End Sub
<强>输出强>