내가 가진 것:
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에서 배열을 반환하도록 하려면 필수 해킹입니다 . 그냥 사용 하면expression
INDEX()
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를 작성하는 것보다 훨씬 쉽습니다.
노란색 셀은 입력을 나타냅니다.
- C2에서는 다른 곳에서
_N
변수에 쉽게 접근할 수 있도록 셀 이름을 지정합니다.5 years
- 비용(범위)의 경우 쉽게 참조할 수 있도록
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]))