>

아래와 같이 Excel에 데이터가 있습니다 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

ASAP 유틸리티를 사용하여 여러 열로 분할 한 경우. 데이터 열을 현명하게 분할합니다. 5 열로 나누려면 다음과 같이 행 방식으로 진행하십시오.

1   2   3   4   5
6   7   8   9   10
11  12  13  14  15
16  17  18  19  20
21  22  23

그러나 다음과 같이 열 단위로 나누고 싶습니다.

1   6   11  16  20
2   7   12  17  21
3   8   13  18  22
4   9   14  19  23
5   10  15     

여기 지만 행 수를 요청합니다. 최대한 많은 열을 요청한 다음 ASAP Utilities처럼 데이터를 분할하고 싶습니다.

모든 긍정적 인 제안을 환영합니다 ...


  • 답변 # 1

    조금 사용자 친화적 인이 코드를 사용해보십시오

    이 매크로를 실행할 때 vba  데이터를 분할하려는 열 수를 입력 할 수있는 텍스트 상자를 표시합니다.

    5 를 입력하면 을 클릭하고 Ok 를 클릭하십시오. ,

    여기에 코드가 있습니다

    Sub transpose()
    Dim col As Variant, i As Long, j As Long, k As Long
    col = InputBox("Enter number of columns")
    col = Cells(Rows.Count, 1).End(xlUp).Row / col
    col = WorksheetFunction.RoundUp(col, 0)
    j = 1
    k = 3
    For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
        Cells(j, k) = Cells(i, 1)
        j = j + 1
        If j > col Then
            j = 1
            k = k + 1
        End If
    Next i
    End Sub
    
    
    이 코드는 입력을 기반으로 열을 동적으로 분할합니다. 이것이 도움이 되길 바랍니다.

  • 답변 # 2

    이와 같은 일이 아직 완전히 테스트되지는 않았지만 시작입니다.

    Sub t()
    Dim xDimension As Integer
    Dim lngLoopCount As Long
    Dim lngLastRow As Long
    Dim lngPresentation As Long
    xDimension = 5
    lngPresentation = 1
    lngLastRow = Range("a1").End(xlDown).Row
    For lngLoopCount = 1 To lngLastRow Step xDimension
        Range("c1").Offset(lngPresentation, 0).Resize(1, xDimension).Value = _
                    Application.Transpose(Range("a1").Offset(lngLoopCount - 1, 0).Resize(xDimension, 1).Value)
        lngPresentation = lngPresentation + 1
    Next
    End Sub
    
    

  • 답변 # 3

    원하는 순서대로 범위를 5 열로 나눕니다. With 를 업데이트해야합니다.  당신이보고있는 관련 시트에 진술하고 NoCols 를 변경하여 분할을 변경할 수 있습니다  출력에서 원하는 열 수로 변경할 수 있습니다.

    Public Sub SplitRange()
        Dim arr As Variant, tmp As Variant
        Dim i As Long, j As Long
        Dim NoCols As Long
        Dim rng As Range
        Dim c
        ' Change this to how many columns you want
        NoCols = 5
        ' Change to your sheet
        With Sheet6
            .Range(.Columns(4), .Columns(20)).Clear
            Set rng = .Range(.Cells(1, 1), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1))
            tmp = rng.Value2
            ReDim arr(1 To WorksheetFunction.RoundUp(UBound(tmp) / NoCols, 0), 1 To NoCols)
            i = 1: j = 1
            For Each c In tmp
                If i > WorksheetFunction.RoundUp(UBound(tmp) / NoCols, 0) Then j = j + 1: i = 1
                    arr(i, j) = c
                i = i + 1
            Next c
            With .Cells(1, 4)
                Range(.Offset(0, 0), .Offset(UBound(arr, 1) - 1, UBound(arr, 2) - 1)) = arr
            End With
        End With
    End Sub
    
    

  • 답변 # 4

    이 코드를 사용해보십시오

    Function SPLITARR(ByRef v() As Variant, MaxRow As Integer) As Variant
      Dim ArraySize As Integer
      Dim MaxCols As Integer
      Dim NewArray() As Variant
      Dim x As Integer, y As Integer, z As Integer
      ArraySize = (UBound(v(), 1) - LBound(v(), 1)) + 1
      MaxCols = ArraySize \ MaxRow
      If ArraySize Mod MaxRow > 0 Then MaxCols = MaxCols + 1
      ReDim NewArray(LBound(v(), 1) To MaxRow, 1 To MaxCols)
      For x = LBound(v(), 1) To UBound(v(), 1)
        y = x Mod MaxRow
        If y = 0 Then y = MaxRow
        z = x \ MaxRow
        If x Mod MaxRow = 0 Then z = z - 1
        NewArray(y, z + 1) = v(x, 1)
      Next
      SPLITARR = NewArray()
    End Function
    
    

    와 같이 호출해야합니다

    Sub caller()
    Dim a() As Variant
    a() = Range("A1",Range("A" & Rows.Count).End(xlUp))
    a() = SPLITARR(a(), 5) '<~ change this to your needs
    ActiveCell.Resize(UBound(a(), 1), UBound(a(), 2)).Value = a()
    End Sub
    
    



    다음과 같은 출력을 제공합니다.

관련 자료

  • 이전 select - 표시/숨기기 후 동일한 동적 값으로 선택된 jQuery 설정 동적 옵션이 유효하지 않음
  • 다음 reactjs - 반응 redux의 업데이트 상태