Возможно простое преобразование
Предполагается, что вы добавляете новые данные пользовательской формы в самый правый блуждающий столбец дополнительного листа формы, и вы просто хотите записать собранные данные обратно по горизонтали до целевого листа, вы можете использовать следующий подход через Application.Transpose
, чтобы поменять местами строки и столбцы промежуточного массива formdata
.
Option Explicit ' declaration head of Code module
Sub UpdateComplaintsTest()
' [1] assign vertical data column to 2-dimensioned 1-based array formdata
Dim formdata() As Variant
formdata = getFormData("ACHComplaintsForm")
' [2] write data horizontally (i.e. transpose data column from variant array formdata)
nextTargetRange("ACH Complaints 2019", UBound(formdata), "A").Value = Application.Transpose(formdata)
End Sub
Вспомогательная функция getFormData()
, вызываемая секцией [1]
Можно назначить весь диапазон для массива вариантов одной строкой кода, например, черезformdata = Thisworkbook.Worksheets("XY").Range("B3:Z1000").Value
.Поскольку правая часть назначения в разделе [1]
выполняется следующей функцией, вычисляющей наиболее правильные значения в листе данных формы, вместо этого вы кодируете formdata = getFormData("ACHComplaintsForm")
.
Кроме того, функция изменяет размер возвращаемого диапазона данных до1 столбец, т. Е. Самый правый столбец в исходных данных ACHComplaintsForm
(где имя листа передается в качестве строкового аргумента, а необязательный может указываться начальная строка по умолчанию, равная 3).
Function getFormData(ByVal DataSheet As String, Optional ByVal StartRow As Long = 3) As Variant()
' Purpose: return 2-dim 1-based array containing latest data column (i.e. most right column)
' Note: Function assumes data start at 3rd row
With ThisWorkbook.Worksheets(DataSheet)
'[a] define number of most right column
Dim nextCol As Long
nextCol = .Cells(StartRow, .Columns.Count).End(xlToLeft).Column
'[b] define number of items in this data column
Dim Itemscount As Long
Itemscount = .Cells(.Rows.Count, nextCol).End(xlUp).Row - StartRow + 1
'[c] return column data as variant 2-dim 1-based array
getFormData = .Cells(StartRow, nextCol).Resize(Itemscount, 1).Value
'Debug.Print "Form Data Range " & .Cells(StartRow, nextCol).Resize(Itemscount, 1).Address
End With
End Function
Вспомогательная функция nextTargetRange()
, вызываемая секцией [2]
Эта функция просто изменяет размер целевого диапазона строк до необходимого размера для получения указанного количества исходных элементов.
Function nextTargetRange(ByVal TargetSheet As String, Itemscount As Long, Optional ByVal StartCol As String = "A") As Range
' Purpose: return next free row range to receive needed data starting at a given column
With ThisWorkbook.Worksheets(TargetSheet)
' [a] define next free row
Dim nextFreeRow As Long
nextFreeRow = .Range(StartCol & Rows.Count).End(xlUp).Row + 1
' [b] return function result, i.e. the receiving target range
Set nextTargetRange = .Range(StartCol & nextFreeRow).Resize(1, Itemscount)
'Debug.Print "Target Range " & nextTarget.Address
End With
End Function