Расчет среднего размера переменных данных с использованием VBA и Excel - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть задача загрузить несколько текстовых файлов на несколько листов и вычислить среднее значение ниже этих данных. Некоторые текстовые файлы имеют 200 строк, а некоторые содержат 5 строк с различным количеством данных в каждой строке. Я успешно разделил каждый файл, но не могусделать функцию средней. Пример текстового файла: https://ufile.io/7ii41

Sub CombineTextFiles()
    Dim xFilesToOpen As Variant
    Dim I As Integer
    Dim xWb As Workbook
    Dim xTempWb As Workbook
    Dim xDelimiter As String
    Dim xScreen As Boolean
    Dim lRow As Long
    Dim lCol As Long
    Dim Rws As Long
    Dim Col As Integer
    Dim r As Range
    Dim FrNg As Range
    On Error GoTo ErrHandler
    xScreen = Application.ScreenUpdating
    Application.ScreenUpdating = False
    xFilesToOpen = Application.GetOpenFilename("Text Files (*.txt), *.txt", , "Open", , True)
    If TypeName(xFilesToOpen) = "Boolean" Then
        MsgBox "No files were selected", , "Error"
        GoTo ExitHandler
    End If
    I = 1
    Set xTempWb = Workbooks.Open(xFilesToOpen(I))
    xTempWb.Sheets(1).Copy
    Set xWb = Application.ActiveWorkbook
    xTempWb.Close False
    xWb.Worksheets(I).Columns("A:A").TextToColumns _
      Destination:=Range("A1"), DataType:=xlDelimited, _
      TextQualifier:=xlDoubleQuote, _
      ConsecutiveDelimiter:=False, _
      Tab:=False, Semicolon:=False, _
      Comma:=True, Space:=False, _
      Other:=False
      lRow = Cells.Find(what:="*", _
                    after:=Range("A1"), _
                    LookAt:=xlPart, _
                    LookIn:=xlFormulas, _
                    SearchOrder:=xlByRows, _
                    SearchDirection:=xlPrevious, _
                    MatchCase:=False).Row
     average=??

    Do While I < UBound(xFilesToOpen)
        I = I + 1
        Set xTempWb = Workbooks.Open(xFilesToOpen(I))
        With xWb
            xTempWb.Sheets(1).Move after:=.Sheets(.Sheets.Count)
            .Worksheets(I).Columns("A:A").TextToColumns _
              Destination:=Range("A1"), DataType:=xlDelimited, _
              TextQualifier:=xlDoubleQuote, _
              ConsecutiveDelimiter:=False, _
              Tab:=False, Semicolon:=False, _
              Comma:=True, Space:=False, _
              Other:=False
        End With
        lRow = Cells.Find(what:="*", _
                    after:=Range("A1"), _
                    LookAt:=xlPart, _
                    LookIn:=xlFormulas, _
                    SearchOrder:=xlByRows, _
                    SearchDirection:=xlPrevious, _
                    MatchCase:=False).Row
    average=??

    Loop

ExitHandler:
    Application.ScreenUpdating = xScreen
    Set xWb = Nothing
    Set xTempWb = Nothing
    Exit Sub
ErrHandler:
    MsgBox Err.Description, , "Error"
    Resume ExitHandler
End Sub

1 Ответ

0 голосов
/ 06 февраля 2019

Вот две быстрые функции, которые вы можете добавить в свою книгу, которые могут вычислять среднее значение столбца.

Private Function ColumnAvg(colRng As Range)

    ColumnAvg = 0
    On Error Resume Next

    ColumnAvg = Application.WorksheetFunction.Sum(Columns(colRng.Column)) / _ 
                Application.WorksheetFunction.CountA(Columns(colRng.Column))

End Function

Private Function RowAvg(rowRng As Range)

    RowAvg = 0
    On Error Resume Next

    RowAvg = Application.WorksheetFunction.Sum(Rows(rowRng.Row)) / _ 
             Application.WorksheetFunction.CountA(Rows(rowRng.Row))

End Function

ПРИМЕЧАНИЕ: они помечены как частные функции, так как они вычисляют ВЕСЬ столбец или строку,Эти функции предназначены для вызова внутри VBA, а не внутри таблицы.Убедитесь, что вы поместили эти функции в один и тот же модуль.

Пример кода:

1 - x = ColumnAvg(Range("A1"))

2 - x = ColumnAvg(Range("A:A"))

3- x = ColumnAvg(Cells(1,1))

Если вы хотите рассчитать среднее значение по всей таблице, то вы можете использовать эту функцию ...

Private Function AvgEverything()
Dim Text As String

    Text = "A1:" & Split(Cells(1, ActiveSheet.Columns.Count).Address(True, False), "$")(0) _ 
                 & ActiveSheet.Rows.Count
    AvgEverything = Application.WorksheetFunction.Sum(Range(Text)) / _
                    Application.WorksheetFunction.CountA(Range(Text))

End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...