복잡한 배열 수식 이해


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으로 해석 1false바와 같이 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.