목록배열 (22)
rand(life)
성명 주민번호 김1 111111-1111111 김2 111111-1111112 김3 111111-1111113 김4 111111-1111114 김5 111111-1111115 김6 111111-1111116 이런식의 구조로 된 표에서 사람이름을 주면 주민번호를 찾는 방법은 vlookup을 쓰면 간단히 해결된다. 하지만, 데이터가 좌우로 넓게 퍼져있다면? 성명 주민번호 성명 주민번호 성명 주민번호 김1 111111-1111111 이1 222222-2222222 박1 333333-3333333 김2 111111-1111112 이2 222222-2222223 박2 333333-3333334 김3 111111-1111113 이3 222222-2222224 박3 333333-3333335 김4 111111-111..
지식인 질문 중 큰형님 답변 F:H 범위와 같이 주어진 표를 이용해노란색 셀에 들어갈 수식을 찾는 문제이다. 처음에는 If 구문을 세 번 쓰고그 안에서 match 함수를 이용해 찾는다고 생각을 했다. 오른쪽으료 표가 더 길어지만 VBA를 이용하고...... 그런데 큰형님의 답은=MAX(INDEX(($F$2:$H$6=B2)*$F$1:$H$1,)) 아주 간결하다.이 수식이 어떻게 동작하는지 알려면 엑셀에서 범위의 곱셈이 어떻게 동작하는지 알아야한다.엑셀의 범위는 수학에서 배우는 행렬과 유사하게 생겼지만 연산은 약간 다르다 일단 수학에서 말하는 행렬의 연산을 위키백과에서 알아보면 다음과 같다. 행렬 {\displaystyle A={\begin{bmatrix}a\\b\end{bmatrix}}}와 {\displa..
지식인 답변에서 가져온 것이다 이런 데이터가 있을 때 중복된 숫자는 한 번으로 치고중복없이 아래와 같이 숫자를 나열하는 방법이다 수식은 다음과 같다. {=IFERROR(SMALL(IF($B$4:$E$6>F4,$B$4:$E$6),1),"")} 배열수식이므로 마지막에 Ctrl-Shift-Enter해야한다 대략 수식의 구조를 설명하면, $B$4:$E$6 는 A부분의 데이터이다. 중복된 값을 포함해 여러 숫자가 있는 범위이다F4는 비어있는 셀이다. 여기서 오른쪽이나 아래쪽으로 끌어채우기를 하면, 이전에 나온 값보다 더 큰 값의 범위를 지정해줄 수 있다. IF($B$4:$E$6>F4,$B$4:$E$6)$B$4:$E$6 중에서 F4(현재는 0)보다 크다면 해당 셀값을, 아니라면 False값을 배정한다. (IF 조건..
지식인 질문에 대한 답이다. 위의 표에서 사람이름 옆에 있는 날짜가 아래 표에서 각 사람 이름 아래에 있는 날짜 목록에 없으면 "O", 있으면 "X"를 표시하는 방법이다. 처음에는 다음과 같이 했다. =IF(COUNTIF(OFFSET($H$1,0,MATCH(B2,$A$8:$C$8,0),100,1),A2),"X","O") offset 함수의 구문은 다음과 같다. OFFSET(reference, rows, cols, [height], [width])이 중, 뒤에 height와 width를 이용한 방법이다. 평소에 이 옵션을 빈칸으로 주면 offset함수는 reference위치에서 rows만큼 아래로, cols만큼 오른쪽으로 간 위치의 셀값을 보여준다. 하지만 height와 width를 표시한 offset함수..
텍스트파일의 내용을 한 줄씩 읽어, 문자열을 탭을 기준으로 분리하여 배열변수에 넣기 위한 코드이다. Dim str As String Dim arr() Dim ifn As Long ifn = FreeFile Open fname For Input As #ifn Do Until EOF(ifn) Line Input #ifn, str arr = Split(str, vbTab) Loop 여기서 Freefile이라는 함수를 사용해서 ifn에 숫자를 할당하는데, 왜 이런 작업을 해야하는가는 질문에 대한 대답이다. 답변1 쉬운 예를 들어 보죠. 철수, 영희가 있는데 좌석번호를 항상 철수에게는 1번, 영희에게는 2번을 준다고 하면 좌석이 비어있는 경우에는 아무런 문제가 발생하지 않습니다. 하지만, 다른 누군가가 1번 좌석..
지난 번에 배웠던 것을 써먹은 사례이다. 위와 같이 A1:D1의 숫자 배열과 같은 배열을 아래 5행에서 찾아서, 그 바로 아래 행에 색깔을 칠하는 매크로이다. 포인트는 파란색 칠한 부분이다. Option Explicit Sub match_serial() Dim v As String Dim a As Range Dim wf As WorksheetFunction Set wf = WorksheetFunction v = Join(wf.Transpose(wf.Transpose(Range("a1:d1")))) For Each a In [a5:L5] If Join(wf.Transpose(wf.Transpose(a.Resize(, 4)))) = v Then a.Offset(1).Resize(, 4).Interior.Co..
A열과 같이 같은 문자열이 반복되어 나오고 있을때, 가장 많이 나오는 문자열이 무엇인지, 또는 두 번째로 많이 나오는 문자열이 무엇인지를 알 수 있는 함수입니다.=INDEX(A1:A6,MATCH(LARGE(FREQUENCY(MATCH(A1:A6,A1:A6,0),MATCH(A1:A6,A1:A6,0)),C1),FREQUENCY(MATCH(A1:A6,A1:A6,0),MATCH(A1:A6,A1:A6,0)),0))배열함수이므로, Ctrl-Shift-Enter해야합니다. 길어서 복잡해보이지만, FREQUENCY(MATCH(A1:A6,A1:A6,0),MATCH(A1:A6,A1:A6,0)) 이 부분이 반복되어서 그런것입니다. 이 부분이 하는 역할은, A열의 각 문자열이 나오는 횟수를 배열로 만드는 것입니다. MATCH..
중복없이 값을 배열에 넣기 위해 그동안 컬렉션을 사용했었는데, 많이 불편했다. 그런데 이번에 Scripting.Dictionary를 사용하는 방법을 알게 되었다. 원문은 여기 그리고 여기번역문은 여기이다. 상당히 편리하다. 원문의 설명에 따르면 Scripting.Dictionary를 사용하기 위해서는 VB편집기에서 설정을 해주어야한다고 한다. VB편집기 상단 - 도구 - 참조에서Microsoft Scripting Runtime을 체크하면 된다그런데 엑셀2016 기준으로 위의 체크를 하지 않아도 작동한다. 왜 그런지는 좀 더 알아봐야 할 듯 해당 기능을 이용한 매크로 예제이다. exists메서드가 유용하게 사용된 경우. 기본적인 몇가지 코드. 위의 링크에서는 복사가 안되어서...