셀 내용을 'n'개의 동일한 값으로 반복적으로 나누고 연속 셀에 다시 배포

셀 내용을 'n'개의 동일한 값으로 반복적으로 나누고 연속 셀에 다시 배포

내가 가진 것:

n = 5
0, 0, 0, 0, 1000, 0, 0, 0, 0

내가 원하는 것:

0, 0, 0, 0, 200, 200, 200, 200, 200, 0, 0...

따라서 맨 위 행(1000)에 값이 표시되면 맨 아래 행에 값이 표시됩니다.고르게그 값을 나누다N모든 분할의 합이 원래 값과 같아질 때까지 반복합니다.

가능하다면 VB를 사용하지 않는 것이 좋습니다.


편집1:

당신이 만나는 모든 값이 n으로 균등하게 나누어질 것이라는 보장이 있습니까?

아니요. 그러나 합계와 원래 값의 차이가 < 1이면 계속 진행하세요.

n개의 분할에 적합한 세포가 있을 것이라는 보장이 있습니까?

아니요.

0이 아닌 값이 하나만 존재한다고 보장됩니까?

아니요, 여러 값이 있을 것입니다. 맨 위 행에 다른 값이 표시되고 맨 아래 행에서 분할이 완료되지 않은 경우 맨 아래 행에 이전 분할과 새 분할이 함께 추가됩니다.

0이 아닌 값은 항상 같은 위치에 있습니까?

아니요. 첫 번째 위치가 아닌 다른 위치에 나타날 수 있습니다.


편집2:

투명성을 위해 큰 비용을 균등하게 분배하려고 합니다.N연령.

어쩌면 이것이 더 나은 예가 될 것입니다: 예상 입력 및 예상 출력의 타임라인

참고 사항:

  • 입력 값을 분할하는 프로세스는 각 분할의 합이 입력 값과 같아질 때까지 발생해야 합니다.

  • 이전 입력 값 분할이 아직 완료되지 않았을 때 다른 입력 값이 표시되면 모든 입력 값에 대해 첫 번째 지점의 조건이 충족될 때까지 각 분할을 합산하여 출력 행이 계속됩니다.

답변1

편집: 이전의 불필요하게 복잡한 공식(참조이번 개정판)은 여전히 ​​유용할 것입니다. 예를 들어 입력에 슬라이딩 배율 인수를 적용해야 하는 경우 이 답변에서는 이를 새롭고 더 간단하며 훨씬 이해하기 쉬운 버전으로 대체했습니다.


도우미 행/열 또는 추가 테이블이 필요하지 않은 VBA가 아닌 솔루션은 다음과 같습니다.

워크시트 스크린샷

다음 수식을 배열로 입력한 B3후 오른쪽에 채워 넣으세요.

{=SUM(IFERROR(INDEX($2:$2,N(IF(1,COLUMN()-(COLUMN(INDEX(3:3,1):INDEX(3:3,$A$5))-1))))/$A$5,0))}

설명:

공식의 예쁜 버전은 다음과 같습니다.

{=
SUM(
  IFERROR(
    INDEX(
      ($2:$2),
      N(IF(1,COLUMN()-(COLUMN(INDEX(3:3,1):INDEX(3:3,$A$5))-1)))
    )/$A$5,
    0
  )
)}

INDEX()n = 5인 경우 첫 번째 인수의 두 번째 인수 는 사실상 다음과 동일하다는 점을 고려하면 공식을 이해하기가 훨씬 쉽습니다.

COLUMN()-{0,1,2,3,4}


A5기본적으로 이전 n-1과 현재 입력 값에 액세스하기 위해 가변 길이(내 예제에 저장된 n을 기반으로 함) 오프셋 배열을 생성하여 작동합니다 .

공식을 단계별로 살펴보면 I3위의 내용이 더 명확해집니다.

  • (COLUMN(INDEX(3:3,1):INDEX(3:3,$A$5))-1){1,2,3,4,5}-1{0,1,2,3,4}
  • COLUMN()-{0,1,2,3,4}{9}-{0,1,2,3,4}{9,8,7,6,5}
  • N(IF(1,{9,8,7,6,5}))N({9,8,7,6,5}){9,8,7,6,5}
  • (INDEX($2:$2,{9,8,7,6,5})/$A$5{100000,0,0,0,7}/5{20000,0,0,0,1.4}
  • SUM(IFERROR({20000,0,0,0,1.4},0))20001.40

INDEX($2:$2,N(IF(1,expression)))의 두 번째 인수는 기본적으로 단일 값으로 평가되므로 Excel에서 배열을 반환하도록 하려면 필수 해킹입니다 . 그냥 사용 하면expressionINDEX()INDEX($2:$2,expression)I3

INDEX($2:$2,COLUMN()-(COLUMN(INDEX(3:3,1):INDEX(3:3,$A$5))-1))INDEX($2:$2,9-(COLUMN($A$3:$E$3)-1))→ → →INDEX($2:$2,9-(1-1))INDEX($2:$2,9)100000

단일 값을 반환하는 표현식 내부에서는 범위의 첫 번째 셀 열을 반환합니다.COLUMN(multi-cell-range)

IFERROR()함수는 시트 왼쪽에 가까운 셀에 수식이 존재하여 행 머리글에 액세스하거나 열 왼쪽에 있는 셀에 액세스하려고 하는 경우에 필요합니다 A.

노트:

  • 예쁜 공식은 입력하면 실제로 작동합니다.
  • 가 자체 줄에 유지되도록 ($2:$2)하려면 예쁜 버전 주변의 괄호가 필요합니다.$2:$2

* 해킹이 작동하는 정확한 이유에 대한 설명은 제가 먼저 알아낼 때까지 기다려야 합니다 ;-)

답변2

암호:

Sub Divide(n As Integer)
Dim temp(), i As Integer, j As Integer, cnt As Integer, tmp

' Copy values from row to array
temp = Rows(Selection.Row).Value

' Search for the last cell. Use SpecialCells instead is the better variant.
For i = UBound(temp, 2) To LBound(temp, 2) Step -1
    If Not IsEmpty(temp(1, i)) Then
        cnt = i
        Exit For
    End If
Next i

' Perform main operation
For i = cnt To 1 Step -1
    If Rows(Selection.Row).Cells(1, i).Value <> 0 Then
        tmp = Rows(Selection.Row).Cells(1, i).Value
        Rows(Selection.Row).Cells(1, i).Delete Shift:=xlShiftToLeft
        For j = 1 To n
            Rows(Selection.Row).Cells(1, i).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
            Rows(Selection.Row).Cells(1, i).Value = tmp / n
        Next
    End If
Next

End Sub
  • Sub는 n값을 매개변수로 받아들입니다.

  • Sub는 (왼쪽 위 모서리) 선택 항목이 있는 행을 처리합니다.

  • Sub는 비교 0하고 나누기 위해 셀의 값을 숫자로 변환할 수 있는지 n여부를 확인하지 않습니다.

  • 다른 오류도 확인되지 않습니다.

  • 열 제한을 초과하면 이동된 값이 손실됩니다.

  • 그리고 전혀 최적화가 없습니다.

이 코드를 아이디어로 사용하세요.

답변3

다음은 VBA를 사용할 필요 없이 작동하는 솔루션입니다.

유일한 차이점은 각 비용을 개별적으로 입력하려면 어딘가에 테이블을 추가해야 한다는 것입니다.

이렇게 하면 계산이 많이 단순화되고 재정적으로 훨씬 더 명확해지기 때문에 이렇게 하시기를 강력히 권장합니다. 비용 참조, 설명, 서버 유형 등과 같은 항목에 대한 열을 쉽게 추가할 수 있습니다. 또는 수량과 기본도 추가할 수 있습니다. 가격 열(항목이 여러 개인 경우) 이를 확장하여 흥미로운 보고서를 생성할 수 있으며 VBA, IMO를 작성하는 것보다 훨씬 쉽습니다.


노란색 셀은 입력을 나타냅니다.

여기에 이미지 설명을 입력하세요


  1. C2에서는 다른 곳에서 _N변수에 쉽게 접근할 수 있도록 셀 이름을 지정합니다.5 years
  2. 비용(범위)의 경우 쉽게 참조할 수 있도록 A5:D10이름을 지정할 수 있는 표를 삽입하세요.Costs

사용할 공식은 다음과 같습니다(필요한 경우 오른쪽으로 드래그/복사)(스크린샷의 파란색).

=IFERROR([@[Real Cost]]/_N;0)

=IF([@From]>0,[@From]+_N-1,"")

=SUMPRODUCT((B$13=Costs[From])*(Costs[Real Cost]))

=SUMPRODUCT((B$13>=Costs[From])*(B$13<=Costs[Until])*(Costs[Yearly Cost]))

관련 정보