使用其他工作表中的最大列值在新工作表中创建新表

时间:2014-11-22 23:26:13

标签: excel excel-vba csv vba

晚上好,我正在尝试加载多个csv文件,然后计算从E列到最后一列的每列的最大值(每次运行的最后一列可能不同)并将值粘贴到新工作表中。

在我学习VBA时,我试图分阶段打破我的指导:

步骤1.打开文件夹选择对话框的代码,并将每个文本文件加载到具有文件名的不同工作表中的Excel

步骤2.打开新工作表并命名为“结果”的代码

一些样本数据步骤1和2如下所示[图1]:

enter image description here

最后

步骤3.代码查找E列到最后一列的最大值,并在结果表中粘贴工作表名称中的年份编号和高数,例如,如下所示:

enter image description here

到目前为止,在这个论坛的帮助下,我设法创建了一个带有简单用户形式的程序,其运行按钮如下所示:

enter image description here

我已经完成了步骤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步中想出的最好的方法。非常感谢提前!

1 个答案:

答案 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

<强>输出

enter image description here

要查找列中的最大值,可以使用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

<强>输出

enter image description here