Как я могу вернуть две строки заголовка? - PullRequest
0 голосов
/ 05 декабря 2018

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

Option Explicit

Sub CIB_Cuts()
    Dim j As Long, k As Long, x As Long
    Dim varArray() As Variant
    Dim varArray2() As Variant
    ReDim varArray(1 To 19, 1 To 1)

    With ThisWorkbook.Worksheets("Data")
        ReDim varArray(1 To UBound(varArray, 1), 1 To 1)
        x = 1
        For k = 1 To UBound(varArray, 1)
            varArray(k, x) = .Cells(1, k)
        Next

Что бы я изменил, чтобы извлечь первую строку для 19 столбцов, а затем вторую строку для 19 столбцов, прежде чем она получит конкретные данные, которые я хочу получить в другом месте?У меня есть две строки заголовка, и я могу извлечь только одну.

Могу ли я изменить ReDim varArray(1 To 19, 1 To 1) на ReDim varArray(1 To 19, 1 To 2 или мне придется изменить оператор with ниже этого?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Вы можете использовать статические массивы и динамические массивы соответственно.vDB - статический массив.

Dim j As Long, k As Long, x As Long
Dim varArray() As Variant
Dim varArray2() As Variant
Dim vDB As Variant

ReDim varArray(1 To 2, 1 To 19)

        With ThisWorkbook.Worksheets("Data")
            vDB = .Range("a1").Resize(2, 19) '<~~vDB It is itself a two-line header.
            'if you want to pass data to a varArray array
            For k = 1 To UBound(varArray, 1)
                For x = 1 To UBound(varArray, 2)
                    varArray(k, x) = vDB(k, x)
                Next x
            Next

        End With

Рабочее изображение.

enter image description here

0 голосов
/ 05 декабря 2018

Вставить диапазон в массив

Это все, что вам нужно (без зацикливания).

Sub CIB_Cuts()
    Dim varArray As Variant

    With ThisWorkbook.Worksheets("Data")
      varArray = .Range("A1:S2")
    End With

Это двумерный горизонтальный массив на основе одного, т.е. он содержитбольше столбцов, чем строк.Поэтому, когда вы проходите через него, оно может выглядеть следующим образом:

For j = LBound(varArray, 2) to UBound(varArray, 2) ' more data
  For i = LBound(varArray) to UBound(varArray)
    x = varArray(i, j)
  Next  
Next

вместо классического «вертикального» циклического массива:

For i = LBound(varArray) to UBound(varArray) ' more data
  For j = LBound(varArray, 2) to UBound(varArray, 2)
    x = varArray(i, j)
  Next
Next

Поэтому, если вы хотите просмотреть данные первой строки (теперь в первом столбце массива), вы должны сделать следующее:

For i = LBound(varArray) to UBound(varArray) ' more data
  x = varArray(1, i)
Next

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

For i = LBound(varArray) to UBound(varArray) ' more data
  x = varArray(2, i)
Next

Полный код может выглядеть следующим образом:

Option Explicit

Sub CIBCutsPaste()
    Dim varArray As Variant

    With ThisWorkbook.Worksheets("Data")
      varArray = .Range("A1:S2")
    End With

    ' Print contents to Immediate Window
    With ThisWorkbook.Worksheets("Data")
      Dim str1 As String
      Dim k As Integer
      Dim x As Integer
      For k = 1 To UBound(varArray)         ' 2 Rows
        For x = 1 To UBound(varArray, 2)    ' 19 Columns
          If x = 1 Then
            str1 = str1 & vbCr & varArray(k, x)
           Else
            str1 = str1 & "," & varArray(k, x)
          End If
        Next
      Next
      Debug.Print str1
    End With

End Sub

Если вы настаиваете на зацикливании, то есть копировании строк рабочего листа в столбцы массива, это может выглядеть так:

Sub CIBCutsLoop()
    k As Long, x As Long
    Dim varArray() As Variant
    ReDim varArray(1 To 19, 1 To 2)

    With ThisWorkbook.Worksheets("Data")
        For k = 1 To UBound(varArray)         ' 19 Rows
            For x = 1 To UBound(varArray, 2)  ' 2 Columns
                varArray(k, x) = .Cells(x, k)
            Next
        Next
    End With

    ' Print contents to Immediate Window
    With ThisWorkbook.Worksheets("Data")
        Dim str1 As String
        For k = 1 To UBound(varArray)         ' 19 Rows
            For x = 1 To UBound(varArray, 2)  ' 2 Columns
                If x = 1 Then
                    str1 = str1 & vbCr & varArray(k, x)
                  Else
                    str1 = str1 & "," & varArray(k, x)
                End If
            Next
        Next
        Debug.Print str1
    End With

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