Мне нужно помочь вам, потому что я хотел бы преобразовать данные в свой Excel.
Пример:
Я хотел бы перейти в эту форму:
У вас есть какие-нибудь советы для этого? Я "базовый" пользователь excel.
Пожалуйста, если мне нужно использовать VBA, дайте подробное описание: D
Спасибо заранее.
Вы можете попробовать следующую формулу (обычно вводится) в O365
:
=INDEX($A$1:$C$5,0,CEILING(ROWS($A$1:A1)/5,1))
Для установки, изображенной ниже:
Возможно, вам придется использовать CTRL+SHIFT+ENTER, если у вас другая версия Excel.
Option Explicit
Sub ToColumn()
Const SRC_RANGE As String = "A2:C6"
Const DST_FIRST_CELL As String = "E2"
Dim ws As Worksheet: Set ws = ActiveSheet ' improve!
Dim srg As Range: Set srg = ws.Range(SRC_RANGE)
Dim Data(): Data = ToCol(srg, True)
Dim drg As Range: Set drg = ws.Range(DST_FIRST_CELL).Resize(UBound(Data, 1))
drg.Value = Data
End Sub
Function ToCol( _
ByVal rg As Range, _
Optional ByVal ByColumns As Boolean = False) _
As Variant()
Dim sData(), srCount As Long, scCount As Long
Dim dData(), IsNotSingleCell As Boolean
With rg.Areas(1)
srCount = .Rows.Count
scCount = .Columns.Count
If srCount * scCount = 1 Then
ReDim dData(1 To 1, 1 To 1): dData(1, 1) = .Value
Else
sData = .Value
ReDim dData(1 To srCount * scCount, 1 To 1)
IsNotSingleCell = True
End If
End With
If IsNotSingleCell Then
Dim sr As Long, sc As Long, dr As Long
If ByColumns Then
For sc = 1 To scCount
For sr = 1 To srCount
dr = dr + 1
dData(dr, 1) = sData(sr, sc)
Next sr
Next sc
Else
For sr = 1 To srCount
For sc = 1 To scCount
dr = dr + 1
dData(dr, 1) = sData(sr, sc)
Next sc
Next sr
End If
End If
ToCol = dData
End Function
По столбцам
=INDEX($A$2:$C$6,
MOD(ROWS($A$2:$A2)-1,ROWS($A$2:$A$6))+1,
QUOTIENT(ROWS($A$2:$A2)-1,ROWS($A$2:$A$6))+1)
По строкам
=INDEX($A$2:$C$6,
QUOTIENT(ROWS($A$2:$A2)-1,COLUMNS($A$2:$C$2))+1,
MOD(ROWS($A$2:$A2)-1,COLUMNS($A$2:$C$2))+1)
По столбцам
Если данные начинаются с A1
...
E1:E15 =MOD(ROW()-1,5)+1
F1:F15 =QUOTIENT(ROW()-1,5)+1
G1:G15 =INDEX($A$1:$C$5,MOD(ROW()-1,5)+1,QUOTIENT(ROW()-1,5)+1)
... но это не так.
I2:I16 =MOD(ROW()-2,5)+1
J2:J16 =QUOTIENT(ROW()-2,5)+1
K2 =INDEX($A$2:$C$6,
MOD(ROWS($A$2:$A2)-1,ROWS($A$2:$A$6))+1,
QUOTIENT(ROWS($A$2:$A2)-1,ROWS($A$2:$A$6))+1)
По строкам
Если данные начинаются с A1
...
M1:M15 =QUOTIENT(ROW()-1,3)+1
N1:N15 =MOD(ROW()-1,3)+1
O1:O15 =INDEX($A$1:$C$5,QUOTIENT(ROW()-1,3)+1,MOD(ROW()-1,3)+1)
... но это не так.
Q2:Q16 =QUOTIENT(ROW()-2,3)+1
R2:R16 =MOD(ROW()-2,3)+1
S2 =INDEX($A$2:$C$6,
QUOTIENT(ROWS($A$2:$A2)-1,COLUMNS($A$2:$C$2))+1,
MOD(ROWS($A$2:$A2)-1,COLUMNS($A$2:$C$2))+1)
Если вы хотите, чтобы результат все еще находился в первом столбце, что-то вроде изображения ниже (до/после):
Sub test()
Dim rg As Range: Dim i As Integer
With ActiveSheet 'change as needed
Set rg = .Range("A2", .Range("C2").End(xlDown)) 'change as needed
End With
For i = 1 To rg.Columns.Count - 1
rg.End(xlDown).Offset(1, 0).Resize(rg.Rows.Count, 1).Value = _
rg.Columns(1).Offset(0, i).Value: rg.Columns(1).Offset(0, i).ClearContents
Next
End Sub
rg — это диапазон данных (в примере — от ячейки A2 до C6).
он зацикливается, используя i в качестве значения смещения, и каждый цикл заполняет последнюю пустую строку значением диапазона смещения.