Как в VBA создать диапазон из ячеек над таблицей? - PullRequest
0 голосов
/ 16 ноября 2018

Обновление: я решил это с помощью следующего фрагмента кода. Спасибо за помощь всем. tableList - это объект Range, созданный из таблицы в рабочей книге, в которой перечислены детали различных таблиц в рабочей книге. Объект Range не требует указания листа, на котором расположена таблица .


For rowNumber = 1 To tableList.Rows.Count
    If tableList.Item(rowNumber, actionColumn).Value = actionType Then
       tableName = tableList.Item(rowNumber, nameColumn).Value
       Set activeTable = Range(tableName)
       With activeTable
           .Rows(.Rows.Count + 1).Value = activeTable.Rows(-1).Value
       End With
    End If
Next

У меня есть формулы в строке прямо над строкой заголовка моей таблицы / диапазона. Я хочу скопировать значения формул и вставить их в последнюю (новую) строку таблицы / диапазона. Я знаю, как заставить код работать, за исключением ссылки на строку с формулами.

Это код, который я пытался использовать для ссылки на ячейку на две строки выше первой ячейки в моей таблице (которую я установил / определил как диапазон).

Set rangeTopLeft = rangeActive.Cells(1, 1).Offset(-2)

Я получаю ошибку 1004 при попытке запустить код VBA.

Затем в коде я создаю диапазон путем изменения размера rangeTopLeft и выполняю другие шаги для копирования и вставки значений из формул в новую строку.

Я не получаю ошибку, если использую .Offset(-1), но это приводит меня только к первой ячейке столбца в моей строке заголовка. Я предполагаю, что должно быть что-то, где смещение не может выходить за границы диапазона.

Предполагая, что это так (или что-то еще), как мне обойти это?

Заранее спасибо.

Хорошо, пожалуйста, избегайте «новичков». Я уберу его после того, как смогу заставить его работать.

'Вставить значения формулы на прошлой неделе в новые строки

Sub PasteValues()

Dim rangeList As Range
Dim rangeActive As Range
Dim rangeToCopy As Range
Dim lastRow As Range
Dim rangeName As String

Dim rowNumber As Integer
Dim dataBeginColumn As Integer
Dim actionColumn As Integer
Dim actionType As String

Dim nameColumn As Integer
Dim dataColumnFirst As Integer
Dim dataColumnLast As Integer

Dim response1 As VbMsgBoxResult
Dim response2 As VbMsgBoxResult

Set rangeList = Range("tTablesDetails").ListObject.DataBodyRange

nameColumn = 1
actionColumn = 7
actionType = "Append"

'Requires user to click "Yes" twice 

before pasting values
    response1 = MsgBox("Do you want to past last week's formula values to    tables of this Workbook?", vbYesNo + vbCritical)
    If response1 = vbNo Then Exit Sub

    response2 = MsgBox("Are you sure? This action cannot be undone.", vbYesNo + vbCritical)

    If response2 = vbNo Then Exit Sub

    For rowNumber = 1 To rangeList.Rows.Count

       If rangeList.ListObject.DataBodyRange(rowNumber, actionColumn).Value = actionType Then

       'get table name from row whose action column equals actiontype
        rangeName = rangeList.ListObject.DataBodyRange(rowNumber, nameColumn).Text

       Set rangeActive = Range(rangeName)

       Set rangeTopLeft = rangeActive.Cells(1, 1).Offset(-2)

       Set rangeToCopy = rangeTopLeft.Resize(1, rangeActive.Columns.Count)

       Set lastRow = rangeActive.Offset(rangeActive.Rows.Count).Resize(1, rangeActive.Columns.Count)

       lastRow = rangeToCopy.Value

       End If

    Next

 MsgBox ("Finished Copying Values to New Rows")

End Sub'

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018
Sub SO()
    Dim lst As ListObject
    Set lst = ActiveSheet.ListObjects("Table1")
    With lst.DataBodyRange
        .Rows(.Rows.Count + 1).Value = .Rows(1).Offset(-2).Value
    End With
End Sub
0 голосов
/ 16 ноября 2018

Используйте встроенные свойства ListObject, в частности HeaderRowRange.

. Нет необходимости изменять размер, а затем копировать / вставлять значения, вы можете просто сделатьперенос значения из строки над HeaderRowRange во вновь добавленную ListRow.

Возможно что-то вроде этого:

Sub Test()
    Dim myTable As ListObject
    Set myTable = Sheet1.ListObjects("Table1")

    Dim formulaRange As Range
    Set formulaRange = myTable.HeaderRowRange.Offset(-1)

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