0으로 셀 'n'시간 나누기


1

내가 가진 것 :

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

내가 원하는 것 :

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

따라서 최상위 행 (1000)에 값이 표시되면 맨 아래 행이 고르게 그 값을 위로 나눠 라. 모든 분할의 합계가 원래 값과 같을 때까지.

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

EDIT1 :

당신이 만나는 어떤 가치가 n으로 균등하게 나눌 수 있다는 보장이 있습니까? 아니오, 그러나 일단 합이 & lt; 1, 계속

n 개의 부서에 적절한 셀이 있다는 보장이 있습니까? 아니

0이 아닌 값이 하나만 있다고 보장합니까? 더 이상 존재하지 않을 것입니다. 다른 값이 맨 위 행에 표시되고 맨 아래 행이 분할을 완료하지 않은 경우, 맨 아래 행은 이전 + 새 분할을 추가합니다

0이 아닌 값은 항상 같은 위치에 있습니까? No는 첫 번째 위치가 아닌 다른 위치에 나타날 수 있습니다.

EDIT2 :

투명하게하기 위해 나는 큰 $ 비용을 균등하게 분산하려고 노력하고 있습니다. 아마도 이것은 더 좋은 예가 될 것입니다. 예상되는 입력 및 예상 출력의 타임 라인

참고 사항 :

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

  • 아직 분할이 완료되지 않은 상태에서 다른 입력 값이 표시되면 출력 행은 각 입력 값에 대해 첫 번째 점의 조건이 충족 될 때까지 계속 합계를 계속합니다.


1
당신이 만나는 어떤 가치가 n으로 균등하게 나눌 수 있다는 보장이 있습니까? n 개의 부서에 적절한 셀이 있다는 보장이 있습니까? 0이 아닌 값이 하나만 있다고 보장합니까? 0이 아닌 값은 항상 같은 위치에 있습니까?
fixer1234

아마 당신이 해결하려고하는 진짜 문제가 무엇인지를 설명 할 수 있습니까?
Tom Brunberg

슈퍼 유저에 오신 것을 환영합니다! 자신의 게시물을 자유롭게 편집 할 수는 있지만 원래의 사용자 계정으로 보호해야합니다. 두 번째 계정을 만든 것처럼 보입니다. 그러면 내 스레드에서 댓글을 달고 답변을 수락 할 수 없게됩니다. 만나다 내 계정 통합 계정을 병합하면 문제가 해결됩니다.
fixer1234

이 작업을 현재 위치에서 수행하고 기존 셀의 값을 과도하게 사용 하시겠습니까? 그리고 작업 후 열의 양이 열 제한을 초과하지 않는다는 것을 보장합니까?
Akina

1
예제를 확장하여 다루어야하는 모든 조건의 예와 그 모양을 보여주십시오.
fixer1234

답변:


3

편집 : 이전, 불필요하게 복잡한, 수식 (참조 이 개정판 )는 여전히 유용 할 것입니다. 예를 들어 입력에 슬라이딩 스케일링 요소를 적용해야하는 경우,이 대답에서 새로운 단순하고 이해하기 쉬운 버전으로 바꿨습니다.


다음은 도우미 행 / 열 또는 추가 테이블이 필요없는 비 VBA 솔루션입니다.

Screenshot of worksheet

배열에 다음 수식을 입력하십시오. B3 그것을 오른쪽으로 채우십시오 :

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

설명:

공식의 prettified 버전은 다음과 같습니다 :

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

수식은 n = 5 인 경우 첫 번째 인수의 두 번째 인수 INDEX() 다음과 효과적으로 동일합니다.

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


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

수식을 밟아서 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, 표현 )))) 해킹이 필요하다. * Excel에서 배열을 반환하도록 강제로 표현 ~의 두 번째 논의 이후 INDEX() 기본적으로 단일 값으로 평가됩니다. 그냥 사용하기 INDEX($2:$2, 표현 ) ...에서 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( 멀티 셀 범위 ) 범위의 첫 번째 셀 열을 반환합니다.

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

노트:

  • prettified 수식 실제로 입력 한 경우 작동합니다.
  • 대괄호 ($2:$2) prettified 버전에서 강제로 필요합니다 $2:$2 그것의 자신의 선에 남아 있기 위하여.

* 해킹이 왜 작동하는지에 대한 설명은 내가 먼저 스스로 알아낼 때까지 기다려야 할 것이다 ;-)


1
매우 영리한! ________________________
Gary's Student

1
훌륭하게, 참으로! 초보자는 이해하고 유지하기가 더 어려울 수 있습니다. 그러나, 남자, 빛나는!
piko

@piko 감사합니다. 그리고 다시 감사드립니다 :) 흥미롭게도, 나는 설명을 끝내지 못했습니다. 제가 그렇게하려고 시도했을 때, 저는 제 자신의 유익을 위해 너무 영리하다는 것을 알았습니다. 그리고 불필요하게 사용법을 복잡하게 만들었습니다. MOD() 함수를 사용하여 오프셋의 정적 배열을 사용하여 역순으로 정렬 된 인덱스 배열을 만드는 대신 인덱스의 "롤링"배열을 만들 수 있습니다. 새로운 간단한 공식은 다음과 같습니다. 많은 이해하기 쉽기 때문에, 초심자에게 너무 많은 문제가되어서는 안된다. 특히 내가 지금 설명을 마쳤다는 것을 고려하면.
robinCTS

^ cc @ Gary의 학생 (감사합니다.)
robinCTS

1
사실, 이해하기 쉽습니다. 특히 당신의 설명이 더 쉽습니다. 업데이트 주셔서 감사합니다! 나는 Excel에서 배울 것이다 아직도 몇몇 재료가다는 것을 보는 것이 기쁘다 :)
piko

1

암호:

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
  • 하위 수락 n 값을 매개 변수로 사용합니다.

  • Sub는 행의 왼쪽 상단 모서리를 처리합니다.

  • 하위 검사하지 않음은 셀의 값을 비교할 숫자로 변환 할 수 있습니다. 0 나누다 n 아닙니다.

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

  • 이동 한 값은 열 제한을 초과하여 이동하는 동안 손실됩니다.

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

이 코드를 아이디어로 사용하십시오.


1

여기에 VBA를 사용할 필요없이 작동하는 솔루션이 있습니다.

유일한 차이점은 각 비용을 개별적으로 입력하기 위해 어딘가에 표를 추가해야한다는 것입니다.

계산을 간소화하고 재정적으로 많은 설명을 추가하기 때문에이 작업을 수행하는 것이 좋습니다. 비용 참조, 설명, 서버 유형 등의 항목을 쉽게 추가 할 수 있습니다. 수량 및 기준을 추가 할 수도 있습니다. 여러 항목이있는 경우 가격 열. 이것을 확장하고 흥미로운 보고서를 작성할 수 있으며, VBA, IMO를 작성하는 것보다 훨씬 쉽습니다.


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

enter image description here


  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]))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.