복잡한 배열 수식 이해


0

셀에서 모든 문자를 제거하고 숫자 만 남기고 싶었습니다. 인터넷 검색 후이 배열 수식을 찾았습니다. =SUM(MID(0&A2,LARGE(INDEX(ISNUMBER(--MID(A2,ROW($1:$99),1))*ROW($1:$99),),ROW($1:$99))+1,1)*10^ROW($1:$99)/10)

평가를 클릭하면 수백 개의 참 / 거짓 진술이 혼란스러워집니다. 누군가 이것을 분해하고 각 구성 요소의 기능을 설명 할 수 있습니까?

답변:


1

Evaluate 프로세스를 함께 단계별로 살펴 보겠습니다.

내 예에서는 abf5fb6cell에 값 이 있으며이 값 은 A2로 평가됩니다 56.

첫 번째 단계 A2는 셀의 값으로 대체A2

전에:

= SUM (MID (0 A2 , LARGE (INDEX (ISNUMBER (-MID (A2, ROW ($ 1 : $ 99), 1)) * ROW ($ 1 : $ 99),), ROW ($ 1 : $ 99)) + 1, 1) * 10 ^ ROW ($ 1 : $ 99) / 10)

후:

= SUM (MID (0 & "abf5fb6" , LARGE (INDEX (ISNUMBER ( -MID (A2, ROW ($ 1 : $ 99), 1)) * ROW ($ 1 : $ 99),), ROW ($ 1 : $ 99)) + 1,1) * 10 ^ ROW ($ 1 : $ 99) / 10)

텍스트가 따옴표 안에 어떻게 들어 있는지 확인하십시오. 이는 텍스트라고하며 그렇지 않으면 string 이라고 합니다 .

이제 MID기능 을 간단히 설명 할 수있는 좋은 시간 입니다. 이 함수는 단순히 문자열에서 일부 텍스트를 추출합니다. 첫 번째 인수는 시작할 텍스트 또는 문자열입니다. 두 번째 인수는 추출을 시작하려는 위치의 시작 위치입니다. 세 번째 인수는 추출하려는 문자 수 또는 종료 결과 길이입니다. 예를 들어, =MID("wizlog", 1, 3반환 wiz하는 동안 =MID("wizlog", 2, 5)반환izlog

따라서 다음 단계 0&"abf5fb6"에서는 위에서 언급 한 것처럼 MID함수 의 첫 번째 인수에 텍스트 (문자열이라고도 함)가 필요 하기 때문에 를 연결합니다 . 그러나 Excel에서 문자열에 숫자를 추가하려면 &기호 를 사용하십시오 .

전에:

= SUM (MID ( 0 "abf5fb6" , LARGE (INDEX (ISNUMBER ( -MID (A2, ROW ($ 1 : $ 99), 1)) * ROW ($ 1 : $ 99),), ROW ($ 1 : $ 99)) + 1,1) * 10 ^ ROW ($ 1 : $ 99) / 10)

후:

= SUM (MID ( "0abf5fb6" , LARGE (INDEX (ISNUMBER ( -MID (A2, ROW ($ 1 : $ 99), 1)) * ROW ($ 1 : $ 99),), ROW ($ 1 : $ 99)) + 1 , 1) * 10 ^ ROW ($ 1 : $ 99) / 10)

이제 다음 MID함수로 넘어 가서 A2이전과 마찬가지로 다른 함수를 다시 값 으로 대체합니다 .

후:

= SUM (MID ( "0abf5fb6", LARGE (INDEX (ISNUMBER ( -MID ( "abf5fb6 , ROW ($ 1 : $ 99), 1)) * ROW ($ 1 : $ 99),), ROW ($ 1 : $ 99)) + 1,1) * 10 ^ ROW ($ 1 : $ 99) / 10)

다음으로, 두 번째 MID함수 인 두 번째 인수를 다루겠습니다 ROW($1:$99). MID함수 의 두 번째 인수 는 시작 위치를 알려줍니다. 반면에 ROW함수는 단순히 주어진 행을 반환하므로 1-99의 범위를 전달하므로 배열 또는 1-99의 목록으로 반환됩니다. 즉 MID, 1에서 99까지 다른 위치에서 시작할 때마다이 기능을 99 번 사용할 계획 입니다.

전에:

= SUM (MID ( "0abf5fb6", LARGE (INDEX (ISNUMBER (-MID ( "abf5fb6", ROW ($ 1 : $ 99) , 1)) * ROW ($ 1 : $ 99),), ROW ($ 1 : $ 99)) +1,1) * 10 ^ ROW ($ 1 : $ 99) / 10)

후:

= SUM (MID ( "0abf5fb6", LARGE (INDEX (ISNUMBER (-MID ( "abf5fb6", {1; 2; 3; ...; 99} , 1)) * ROW ($ 1 : $ 99),),), ROW ($ 1 : $ 99)) + 1,1) * 10 ^ ROW ($ 1 : $ 99) / 10)

(방을 절약하기 위해 1-99의 모든 숫자를 입력하지는 않았지만 포인트를 얻었을 것입니다.)

이제 두 번째 MID함수 에 대한 모든 부분을 갖추 었으므로이 부분을 계산할 수 있습니다.

전에:

= SUM (MID ( "0abf5fb6", LARGE (INDEX (ISNUMBER ( -MID ( "abf5fb6", {1; 2; 3; ...; 99}, 1) ) * ROW ($ 1 : $ 99))), ROW ($ 1 : $ 99)) + 1,1) * 10 ^ ROW ($ 1 : $ 99) / 10)

후:

= SUM (MID ( "0abf5fb6", LARGE (INDEX (ISNUMBER (- { "a"; "b"; "f"; "5"; "f"; "b"; "6"; "" ";") ")"); ";" "; ...;" "} ) * ROW ($ 1 : $ 99),), ROW ($ 1 : $ 99)) + 1,1) * 10 ^ ROW ($ 1 : $ 99) / 10)

그래서 여기서 무슨 일이 있었습니까? 그럼 MID기능은 지정된 문자 수를, 지정된 위치에서 시작하여, 주어진 문자열의 하위 문자열을 반환합니다. 그래서 우리는 문자열을 abf5fb6주었고, 시작 위치의 배열을주었습니다. 따라서 함수는 1-99부터 문자열의 각 문자 배열을 반환합니다. 시작 문자열의 길이는 7 자이므로 8-99 위치는 비어 있으므로 ( "";"";"";...;"";) 뒤에 빈 하위 문자열이 모두있는 이유는 무엇입니까 ?

다음으로 계산할 ISNUMBER함수 는 함수이지만 먼저 이상한 기능을 살펴 보겠습니다. 새 배열 앞에 어떻게 이중 빼기가 있는지 확인하십시오. 단일 빼기 부호는 결과의 결과를 되돌 리지만 ( TRUE반환 FALSE하고 비자-베라), 이중 빼기 부호는 문자열 응답을 숫자로 강제하는 것을 의미합니다. 따라서 일반적으로 이것은 a 로 바뀌고 a는 a TRUE로 바뀌는 대답 을 낳지 만이 경우 배열의 각 문자를 숫자로 변환합니다. 그래서에서 입력 발생합니다 에서 입력하는 동안 발생합니다 .1FALSE0--"a"#VALUE!--"5"5

따라서 ISNUMBER함수를 실행할 때 :

= SUM (MID ( "0abf5fb6", LARGE (INDEX ( ISNUMBER (-{ "a"; "b"; "f"; "5"; "f"; "b"; "6"; ""; ""; ";" "; ...;" "} ) * ROW ($ 1 : $ 99),), ROW ($ 1 : $ 99)) + 1,1) * 10 ^ ROW ($ 1 : $ 99) / 10)

우리가 실제로 무대 뒤에서 실행하는 것은 :

= SUM (MID ( "0abf5fb6", LARGE (INDEX ( ISNUMBER ({# VALUE !; #VALUE !; #VALUE !; 5) # 5! #VALUE !; #VALUE !; 6; #VALUE !; #VALUE !; #VALUE) !; ...; #VALUE!} ) * ROW ($ 1 : $ 99),), ROW ($ 1 : $ 99)) + 1,1) * 10 ^ ROW ($ 1 : $ 99) / 10)

그 결과, 배열을 회전 TRUE하거나 FALSE값이 숫자였다 아닌지를 나타낸다. 따라서 우리는 다음을 얻습니다.

= SUM (MID ( "0abf5fb6", LARGE (INDEX ( {FALSE; FALSE; FALSE; TRUE; FALSE; FALSE; TRUE; FALSE; FALSE; ...; FALSE} ) * ROW ($ 1 : $ 99),), ROW ($ 1 : $ 99)) + 1,1) * 10 ^ ROW ($ 1 : $ 99) / 10)

시간이 부족했습니다. 저는하지 말아야 할 일을하고 있습니다. 오늘은 실제로 생산적인 일을하기 전에해야했습니다. 잘만되면 나는 나중에 중단했던 곳에서 다시 돌아올 것이다.


이것은 엄청나게 잘 쓰여져 있습니다. 대단히 감사합니다. 나머지 답변을 기다릴 수 없습니다! 나는 이미 많은 것을 배웠다
— wizlog

1

여기에 이미지 설명을 입력하십시오

우리는이 공식을 "풀 수있다"

=SUM(
   MID(
     0&A2,
     LARGE(
       INDEX(
         ISNUMBER(
           --
           MID(
               A2,
               ROW($1:$99),
               1
           )
         )*ROW($1:$99)
         ,
       ),
       ROW($1:$99)
     )+1,
     1
   )*10^ROW($1:$99)/10
 )

피연산자의 모든 변환이 뒤 따릅니다.

우선,이 표현 ROW($1:$99) 은 증가하는 자연수의 배열을 나타냅니다 {1,2,...,99}. 배열 수식을 작성하는 편리한 블록으로 자주 사용됩니다.

다음 A2은 입력 셀의 주소입니다. 여기에는 숫자가 혼합 된 텍스트 문자열이 포함됩니다 (예 :) R824TX01rQ768.

그래서 건설

MID(
  A2,
  ROW($1:$99),
  1
)

의미 : 입력 <1> 에서 모든 기호 ( 1의 세 번째 매개 변수에 따라 길이 문자열)의 배열을 만듭니다 .MID(...,1)A2

색인이 문자열의 길이보다 큰 요소 A2는 빈 문자열입니다.

그런 다음이 기호 배열 앞에 접두사 double을 붙여 --숫자 기호를 해당 숫자로 바꾸고 다른 기호를 오류 값 #VALUE!<2>로 바꿉니다.

다음으로, 함수 ISNUMBER()는 혼합 문자 / 숫자 배열에서 작동하며 부울 true/false값 <3> 의 배열이 됩니다.

이는 요소별로 익숙한을 곱 ROW($1:$99)합니다. 때 true/false값이 숫자로 곱해 true으로 해석 1한 false바와 같이 0, 따라서, 그 결과는 모든 문자 배치로는 숫자 배열이다 A2 어느 포함 0기호가 숫자 또는 인덱스가 아닌 경우는, 상기 문자 숫자이면 <4>.

기능

INDEX(<the array>,)

또는 확장 된

=INDEX(ISNUMBER(--MID(A2,ROW($1:$99),1))*ROW($1:$99),)

이 숫자 배열과 비어있는 두 번째 인수를 취합니다. 기본적으로 동일한 배열 <5>가됩니다.

표현

LARGE(INDEX(ISNUMBER(--MID(A2,ROW($1:$99),1))*ROW($1:$99),),ROW($1:$99))

배열 피연산자 INDEX(...)를 내림차순으로 정렬합니다 <6>

표현

MID(0&A2,LARGE(INDEX(ISNUMBER(--MID(A2,ROW($1:$99),1))*ROW($1:$99),),ROW($1:$99))+1,1)

먼저 문자열 앞에 A2with 0 를 붙이고 마지막 순서에서 찾은 <7>부터 시작하여 정렬 된 순서로 기호를 추출합니다.

그리고 얻은 배열의 모든 숫자에 10^ROW($1:$99)/10<8>을 곱합니다 .

MID(0&A2,LARGE(INDEX(ISNUMBER(--MID(A2,ROW($1:$99),1))*ROW($1:$99),),ROW($1:$99))+1,1)*10^ROW($1:$99)/10

<9>

드디어,

=SUM(MID(0&A2,LARGE(INDEX(ISNUMBER(--MID(A2,ROW($1:$99),1))*ROW($1:$99),),ROW($1:$99))+1,1)*10^ROW($1:$99)/10) 

배열의 모든 숫자를 합하여 원하는 숫자 <10>이됩니다.

확실하지 않은 이유는 반복적 인 구성을 INDEX(<array>,)사용하는 것입니다.

=SUM(MID(0&A2,LARGE(ISNUMBER(--MID(A2,ROW($1:$99),1))*ROW($1:$99),ROW($1:$99))+1,1)*10^ROW($1:$99)/10)

<11>

아마도 일부 호환성 문제가 있습니까?


우선, 긴 답변을 작성해 주셔서 감사합니다. 나는 그것을 entierity에서 읽을 수 있기를 기대합니다. 그러나 처음 몇 줄 중 하나 <1>에서 ""는 무엇을 의미합니까?
— wizlog

@wizlog : 숫자 <1>는 첨부 된 스크린 샷의 해당 열에 대한 참조를 의미하며, 논의 된 단계의 결과를 표시합니다.
— g.kov

이 공식은 미쳤다. 그러나 약간 개선 될 수 있습니까? 문자열이 256 자로 제한되어 있다고 생각 $1:$99합니다 $1:$256. 이것이 값 한도에 도달합니까?
— Yorik

1
@Yorik : 실제로 텍스트 문자열은 256보다 훨씬 길 수 있습니다. Excel 사양 및 제한을 확인하십시오 . 이러한 종류의 수식에 대한 실제 제한은 숫자 정확도 제한으로 인해 입력 텍스트의 자릿수입니다.
— g.kov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.