Как сослаться на весь столбец или строку в матрице переменных в VBA? - PullRequest
0 голосов
/ 19 сентября 2018

Я потратил много времени на поиски способа обращения к диапазону (столбцу или строке) в матрице, которую я создал в VBA.

Простым примером является циклическое переключение4-я строка матрицы 4 на x для суммирования столбцов с 1 по 3 для столбца x.

Приведенный ниже код является длинным способом сделать это:

x = 10

Dim Matrix() As Variant
ReDim Matrix(1 to 4, 1 to x)

For c = 1 to x

   Matrix(4, c) = Application.WorksheetFunction.Sum(Matrix(1, c), Matrix(2, c), Matrix(3, c))

Next

Я ищу способ сделать это без ошибок:

For c = 1 to x

   Matrix(4, c) = Application.WorksheetFunction.Sum(Range(Matrix(1, c), Matrix(3, c)))

Next

При попытке запуска появляется следующая ошибка:

*Run-time error '1004': Method 'range' of object '_Global' failed*

Не могли бы вы помочь исправить это, так как другие обходные пути кажутся довольно трудоемкими.

Спасибо!

Энди

1 Ответ

0 голосов
/ 19 сентября 2018

Как сказал Джеймс Поаг, диапазон не является глобальной функцией и должен вызываться вместе с рабочим листом.Если вы хотите использовать WorksheetFunction.Sum, вам придется скопировать матрицу на лист.В приведенном ниже примере:

  1. Создание матрицы случайных чисел 4 x 10,
  2. Создание нового рабочего листа,
  3. Копирование матрицы на рабочий лист,
  4. Используйте WorksheetFunction.Sum для добавления строк диапазона и
  5. Удалите лист, добавленный макросом VBA

    Option Explicit
    
    Public Sub Matrixer()
        Dim x As Long
        x = 10
        Dim matrix() As Double
        ReDim matrix(1 To 4, 1 To x)
    
        'Generate the matrix
        Dim rowNDX As Long
        Dim colNDX As Long
        For rowNDX = 1 To UBound(matrix, 1)
            For colNDX = 1 To UBound(matrix, 2)
                Randomize
                matrix(rowNDX, colNDX) = Rnd
            Next colNDX
        Next rowNDX
    
        'Write the maxtrix to a sheet
        'First add a worksheet to do the calculation
        Dim wb As Workbook: Set wb = ActiveWorkbook
        Dim strName As String: strName = "MATRIXCALC"
    
        Dim ws As Worksheet
        Set ws = wb.Worksheets.Add(Type:=xlWorksheet)
        With ws
            .Name = strName
        End With
    
        'Write the maxtrix to the sheet
        'This code was provide/adapted from Chip Pearson's blog at
        'http://www.cpearson.com/excel/ArraysAndRanges.aspx
        Dim Destination As Range
        Set Destination = ws.Range("A1")
        Destination.Resize(UBound(matrix, 1), UBound(matrix, 2)).Value = matrix
    
        'Use the worksheet function to Sum the range
        Dim RowSum(4) As Double
        Dim rngSum As Range
        For rowNDX = 1 To 4
            Set rngSum = ws.Range("A" & Trim(CStr(rowNDX)) & ":A" & Trim(CStr(UBound(matrix, 2))))
            RowSum(rowNDX) = WorksheetFunction.Sum(rngSum)
    
        Next rowNDX
    
        'Delete the worksheet added by the macro
        'Prevent asking user if it's ok to delete worksheet
        Application.DisplayAlerts = False
        ws.Delete
        'Turn application display alerts back on.
        Application.DisplayAlerts = True
    End Sub
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...