Попробуйте следующее. Предполагается, что вы хотите переходить от столбца к столбцу, повторяя все заполненные ячейки в этом столбце, повторяя значение 9 раз.
Option Explicit
Public Sub OutputRepeatedValues()
Dim arr()
Const DELIMITER As String = ","
Const NUMOFTIMES As Long = 9
With ThisWorkbook.Worksheets("Sheet1")
arr = .Range(.Range("G2"), .Range("G2").SpecialCells(xlLastCell)).Value
End With
Dim i As Long, j As Long, output As String
For i = LBound(arr, 2) To UBound(arr, 2) '<== iterate rows with a column, column by column
For j = LBound(arr, 1) To UBound(arr, 1)
If Not IsEmpty(arr(j, i)) Then output = output & Replicate(arr(j, i), NUMOFTIMES, DELIMITER)
Next j
Next i
output = Left$(output, Len(output) - 1)
ThisWorkbook.Worksheets("Sheet2").Range("B1").Resize(Len(output), 1) = Application.WorksheetFunction.Transpose(Split(output, DELIMITER))
End Sub
'Adapted from @this https://codereview.stackexchange.com/questions/159080/string-repeat-function-in-vba?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
Public Function Replicate(ByVal RepeatString As String, ByVal NUMOFTIMES As Long, Optional ByVal DELIMITER As String = ",")
Dim s As String, c As Long, l As Long, i As Long
l = Len(RepeatString) + 1
c = l * NUMOFTIMES
s = Space$(c)
For i = 1 To c Step l
Mid(s, i, l) = RepeatString & DELIMITER
Next i
Replicate = s
End Function
Примечания:
- Набор тестовых данных, как показано ниже
![Data set-up](https://i.stack.imgur.com/uDMlZ.png)
- Я предполагаю, что вы хотите работать с тем, что когда-либо не работает, или справа от
G2
, включая G2
. Для этого я использую SpecialCells(xlLastCell)
, чтобы найти последнюю использованную ячейку. Затем я создаю диапазон с .Range(.Range("G2"), .Range("G2").SpecialCells(xlLastCell))
, который в данном случае равен $G$2:$Q$5
, и считываю его в массив.
- Предположим, что вы действительно перебираете строки со столбцом, прежде чем переходить к следующему столбцу, как описано в вашем вопросе. Я объединяю значения заполненных ячеек, одновременно вызывая функцию Replicate, описанную в 4).
- Я похитил и адаптировал перманентную функцию с помощью @ this , чтобы обработать повтор строки. Я добавил необязательный аргумент для разделителя. Добавлен разделитель, так что я могу позже разделить его, чтобы выписать результаты в отдельные ячейки в целевом рабочем листе.
- Я разделяю строку,
output
, по разделителю, это создает массив повторяющихся значений, которые я транспонирую, чтобы я мог записать их в столбец на целевом листе.
Пример вывода:
![Output](https://i.stack.imgur.com/Ikk2X.png)
Edit:
Если вместо этого вы хотите зациклить строки, а затем столбцы, используйте с вышеуказанной функцией следующее:
Public Sub OutputRepeatedValues()
Dim arr()
Const DELIMITER As String = ","
Const NUMOFTIMES As Long = 9
With ThisWorkbook.Worksheets("Sheet1")
arr = .Range(.Range("G2"), .Range("G2").SpecialCells(xlLastCell)).Value
End With
Dim i As Long, j As Long, output As String
For i = LBound(arr, 1) To UBound(arr, 1) '<== iterate rows with a column, column by column
For j = LBound(arr, 2) To UBound(arr, 2)
If Not IsEmpty(arr(i, j)) Then output = output & Replicate(arr(i, j), NUMOFTIMES, DELIMITER)
Next j
Next i
output = Left$(output, Len(output) - 1)
ThisWorkbook.Worksheets("Sheet2").Range("B1").Resize(Len(output), 1) = Application.WorksheetFunction.Transpose(Split(output, DELIMITER))
End Sub