2014-10-20 3 views
0

텍스트 값이 들어있는 각 셀의 열 머리글 목록을 가져 오려고합니다.셀에 텍스트가있을 때 행 머리글 목록 반환

예 : I는 수식 (9)에 걸쳐 열 값과 다른 열 (40), 홀수 번째에 셀로부터 헤더리스트에 마지막 두 열을 사용할 최종 제품

A--------------B-------------C-------------BC (desired output) 
1 Header1  Header2  Header3    
2 M       T    Header1, Header3 
3 T    MT       Header1, Header2 
4     TMW       Header2 

.

나는 INDEX, MATCHIF 기능을 사용해야 할 수도 있다는 모호한 생각을 가지고 있습니다.하지만 초보자는 일관되게 문자열을 묶는 방법을 모릅니다.

답변

1

여기 VBA의 Join function을 사용합니다.

Function JoinXL(arr As Variant, Optional delimiter As String = " ") 
    JoinXL = Join(arr, delimiter) 
End Function 

D2의 화학식이다 :

=JoinXL(IF(NOT(ISBLANK(A2:C2)),$A$1:$C$1&", ",""),"") 

array formula로 입력 VBA 함수 그래서 동일한 기능을 노출하는 사용자 정의 기능에 Join 랩 엑셀에서 직접 사용할 수없는 ( 을 사용하여 Ctrl - 을 입력하십시오. - 을 입력하십시오. 그런 다음 아래로 복사됩니다.

enter image description here

설명 : 세포가 그 안에 텍스트가

  • NOT(ISBLANK(A2:C2)) 감지; {TRUE,FALSE,TRUE}

  • IF(NOT(ISBLANK(A2:C2)),$A$1:$C$1&", ","") 이러한 부울 값을 행 1의 내용과 쉼표 구분 기호로 변환합니다. 배열 {"Header A, ","","Header C, "}을 반환합니다.

  • JoinXL은 그 배열의 내용을 단일 문자열로 결합합니다.

+1

는 도움말 -에 대한 당신이 너무 많은 30 분을 데려 감사하지만 나는 마지막으로이 VBA를 접근 방식을 사용하는 방법을 알아 냈어. – Zenithfall

0

VBA가 아닌 워크 시트 기능을 사용하려면 각 열 머리글을 별도의 셀로 반환하는 것이 좋습니다. 실제로 데이터에 사용되는 열을 반영하기 위해 C :

BC: =IFERROR(INDEX($A$1:$C$1,1,SMALL((LEN($A2:$C2)>0)*COLUMN($A2:$C2),COUNTBLANK($A2:$C2)+COLUMNS($A:A))),"") 

의 범위 참조 A를 조정 :이 공식은 배열 입력 한해야

: 당신은 같은 수식을 입력하여이 작업을 수행 할 수 있습니다. 위와 동일한 혼합 주소 형식을 사용해야합니다. 그러나 $ A : A 참조를 변경하지 마십시오.

그런 다음 공란이 생길 ​​때까지 오른쪽 칸을 채우십시오. 필요한만큼 채우십시오.

"다른"헤더의 목록을 가져 오기 위해 논리를 되돌릴 수 있습니다. 입력 타격하면서

배열에 입력 수식 셀 또는 화학식 줄에 수식을 입력 한 후, 다운 CTRL 시프트 개최. 당신이 올바르게 을 한 경우 Excel {...} 공식 주위에 중괄호를 배치합니다.

실제로 두 개의 다른 열에 쉼표로 구분 된 값으로 결과가 필요한 경우 다음 사용자 정의 함수를 제안합니다.

이 사용자 정의 함수 (UDF)를 입력하려면 alt-F11이 Visual Basic Editor를 엽니 다. 프로젝트가 프로젝트 탐색기 윈도우에서 강조 표시되어 있는지 확인하십시오. 그런 다음 상단 메뉴에서 삽입/모듈을 선택하고 아래에있는 코드를 붙여 넣습니다.

은 텍스트가 포함되지 않은 헤더를 얻으려면이 사용자 정의 함수 (UDF)가,

=Headers($A2:$BA2,$A$1:$BA$1,True) 

같은 수식을 입력 사용하거나하려면

=Headers($A2:$BA2,$A$1:$BA$1,FALSE) 

일부 셀에.

============================================== =======

Option Explicit 
Function Headers(rData As Range, rHeaders As Range, Optional bTextPresent As Boolean = True) As String 
    Dim colHeaders As Collection 
    Dim vData, vHeaders 
    Const sDelimiter As String = ", " 
    Dim sRes() As String 
    Dim I As Long 
vData = rData 
vHeaders = rHeaders 
Set colHeaders = New Collection 
For I = 1 To UBound(vData, 2) 
    If (Len(vData(1, I)) > 0) = bTextPresent Then colHeaders.Add vHeaders(1, I) 
Next I 

ReDim sRes(1 To colHeaders.Count) 
For I = 1 To colHeaders.Count 
    sRes(I) = colHeaders(I) 
Next I 

Headers = Join(sRes, sDelimiter) 
End Function 

==================================== ======

범위 인수가 단일 행이고 두 인수가 같은 크기인지 확인하려면 루틴에 논리를 추가해야합니다.

관련 문제