! 제품 버전을 정확하게 입력해 주세요.
제품 버전이 정확하게 기재되어 있지 않은 경우,
최신 버전을 기준으로 안내 드리므로
더욱 빠르고 명확한 안내를 위해
제품 버전을 정확하게 입력해 주세요!

.NET 스프레드시트에서 수식 참조, 이름 및 외부 변수 만들기 > 블로그 & Tips

본문 바로가기

Spread.NET

블로그 & Tips

.NET 스프레드시트에서 수식 참조, 이름 및 외부 변수 만들기

페이지 정보

작성자 GrapeCity 작성일 2019-01-21 00:00 조회 1,577회 댓글 0건

본문

스프레드시트의 가장 강력한 기능은 수식 참조이며 수식 참조는 수식의 또 다른 셀 또는 셀 범위를 수식 표현식의 간단한 변수로 참조하기 위한 문법입니다.


Spread.NET 12에서는 Microsoft Excel에서 지원하는 모든 종류의 수식 참조와 외부 변수(External Variables)라는 새로운 타입을 지원합니다. 이번 포스팅에서는 모든 수식 참조의 유형을 자세히 검토하고 새로운 외부 변수 기능의 강점에 대해 설명합니다.


참조 스타일


Spread.NET 12과 Microsoft Excel에서는 A1과 R1C1이라는 두 가지 유형의 참조 스타일을 지원합니다. 기본 참조 스타일은 A1입니다. 먼저 열 레이블을 사용하여 열을 지정한 다음 행 번호를 사용하여 행을 지정합니다. Spread.NET 12를 사용하여 ReferenceStyle 속성은 ReferenceStyle을 지정합니다.


[VB]


FpSpread1.AsWorkbook().WorkbookSet.CalculationEngine.ReferenceStyle = GrapeCity.Spreadsheet.ReferenceStyle.R1C1  


[C#]


fpSpread1.AsWorkbook().WorkbookSet.CalculationEngine.ReferenceStyle = GrapeCity.Spreadsheet.ReferenceStyle.R1C1;


A1 참조 스타일을 사용한 참조의 일부 예시는 왼쪽 상단 셀을 가리키는 "A1"과 다섯 번째 행과 다섯 번째 열의 셀을 나타내는 "E5"가 있습니다.


R1C1 참조 스타일은 행과 열 모두에 숫자 인덱스를 사용하기 때문에 프로그래밍하기가 더 쉬울 수 있습니다. R1C1 참조 스타일을 이용하여 먼저 행 번호를 통해 행을 지정한 다음 열 번호를 사용하여 열을 지정하십시오. 참조 스타일이 R1C1로 변경되면 열 헤더 레이블도 문자 대신 숫자를 표시하도록 변경해야 합니다.


Spread.NET 12를 사용하여 ColumnHeaderAutoText 속성은 HeaderAutoText 지정합니다.


[VB]


For Each sv As SheetView In FpSpread1.Sheets  
         sv.ColumnHeaderAutoText = HeaderAutoText.Numbers  
     Next  


[C#]


foreach (SheetView sv in fpSpread1.Sheets)  
    sv.ColumnHeaderAutoText = HeaderAutoText.Numbers;


셀 및 범위 참조


수식에서 가장 기본적이고 일반적으로 사용되는 참조 유형은 셀 또는 범위 참조입니다. 셀 참조는 단일 셀을 지정합니다. 수식의 셀 참조 문법은 참조 스타일에 따라 다릅니다.


셀 범위 참조는 범위 연산자라는 특수 연산자 ':'를 사용합니다. 범위 연산자는 왼쪽 상단 셀 참조와 오른쪽 하단 셀 참조 사이에서 사용되어 셀 범위를 지정합니다. 단일 셀에 대한 참조는 일반적으로 범위 연산자를 사용하지 않지만 동일한 시작 셀과 끝 셀로 셀 범위 참조를 지정하는 것을 완벽하게 허용합니다.


상대 참조


상대 참조는 기본 참조의 유형이며 항상 대상 셀(수식을 포함한 셀)이 상대적 이므로 상대(relative) 라고 칭합니다. 이 참조의 유형은 대상 셀의 오프셋을 사용하여 내부적으로 저장됩니다. 상대 참조를 "셀 X 행 위(또는 아래)있고 셀의 Y 열 왼쪽(또는 오른쪽)"을 의미하는 것으로 생각하는 것이 가장 좋습니다. 상대 참조가 복사 및 붙여넣거나 끌어서 채우기를 사용하여 복사하는 경우, 해당 상대 참조는 자동적으로 새 위치를 기준으로 조정됩니다. 상대 참조의 예는 다음과 같습니다.


A1 참조 스타일



A1


B2 : F2


R1C1 참조 스타일


R[-2]C


R[-8]C:R[-8]C[4]


참조된 셀의 기본 조정은 일반적으로 행 또는 열을 가로 질러 동일한 수식을 계산하기 위해 수식을 끌어 채울 때 매우 유용하기 때문에 상대 참조를 사용하는 것이 더 편리합니다. 셀 범위에서 동일한 계산을 수행하려는 경우 계산에 참조된 셀이 병렬 범위에 있으면 상대 참조가 적합합니다.


상대 참조에 대한 일반적인 사용 사례로는 부서별 또는 제품별 월별 판매, 대차대조표 또는 재무보고서의 소계와 총계와 같은 표를 나타낸 데이터 테이블 등이 있습니다.


절대 참조


절대 참조는 대상 셀에 종속되지 않는 셀 또는 셀 범위에 대한 고정 또는 "하드 코딩된" 참조입니다. 절대 참조는 '$' 접두사를 사용하는 A1 참조 스타일과 명시적인 행 및 열 번호를 사용하는 R1C1 참조 스타일로 지정됩니다. 절대 참조의 예는 다음과 같습니다.


A1 참조 스타일



$A$1


$B$2:$F$2


R1C1 참조 스타일



R1C1


R2C2:R2C5


절대 참조는 일반적으로 특정 셀 또는 셀 범위를 항상 참조하는 수식의 변수처럼 특정 셀 또는 셀 범위를 처리하려는 사용 사례에 더 적합합니다. 수식에 절대 참조를 사용하는 경우에는  수식을 훨씬 쉽게 읽을 수 있기 때문에 수식의 셀 또는 셀 범위를 명명된 범위를 나타내는 사용자 지정 이름을 만들어야 합니다. 사용자 지정 이름은 아래에서 더 설명하도록 하겠습니다.


혼합 참조


혼합 참조는 상대 셀과 대상 셀에 의존하는 일부 부분과 절대적인 부분을 갖는 복잡한 참조입니다. 각 좌표는 독립적으로 상대적이거나 절대적일 수 있으므로 셀 참조와 관련하여 4개의 경우가 있고 셀 범위의 경우 16개의 경우가 존재합니다. 혼합 참조는 복잡한 계산을 만드는 데 있어 매우 강력한 도구입니다. 혼합 참조를 사용하여 셀 또는 셀 범위 참조의 각 부분에 대해 행 또는 열을 조정할지 여부를 지정하여 확률 테이블과 같은 여러 유형의 복잡한 계산을 빠르게 생성할 수 있습니다. 혼합 참조의 예는 다음과 같습니다.


A1 참조 스타일



$A1


B$2 : $F2


R1C1 참조 스타일



R1C [1]


R2C : RC5


혼합 참조는 일부 특정 사용 사례에서 매우 유용합니다. 예를 들어, 다른 열에 있는 값의 누적 총계를 계산하려는 경우, 다른 열에 첫 번째 값을 포함한 셀에 대한 절대 셀 참조와 함께 시작 셀 참조를 지정하는 혼합 셀 범위 참조를 통해 SUM 함수를 사용할 수 있습니다. 그리고 상대 행과 절대 열과 함께 셀 참조와 함께 끝 셀을 지정할 수 있습니다.


누적 합계를 계산하는 혼합 참조


 

복사/붙여넣기 또는 끌어서 채우기를 사용하여 열에서 다른 셀로 수식이 복사될 때, 누적 합계가 계산되는 마지막 행 참조만 변경됩니다.


워크시트 참조


워크시트 참조는 동일한 통합 문서의 다른 워크시트에 대한 참조입니다. 워크시트 참조는 워크시트의 탭에 표시되는 워크시트의 이름이 사용됩니다. 이름에 공백이 있으면 작은 따옴표로 묶어야 합니다. 워크시트 참조는 다른 워크시트의 셀 또는 셀 범위를 참조하거나 통합 문서 범위가 있는 사용자 지정 이름에 대한 수식에서 셀 또는 셀 범위를 참조할 때 필요합니다. 이는 사용자 지정 이름에 대한 절에서 자세히 설명되어 있습니다.


동일한 워크시트에서 셀 또는 셀 범위를 참조할 때는 워크시트 이름을 사용할 필요가 없습니다. 워크시트 참조를 지정하지 않고도 동일한 워크시트 내에서 셀 및 셀 범위를 참조할 수 있습니다.


통합 문서 참조를 지정한 경우 셀이 복사되고 다른 워크시트에 붙여 넣어졌을 때 워크시트 참조가 포함되고 원래 지정된 셀 또는 셀 범위를 참조합니다. 예를 들어, Sheet1! E1 셀에 “= Sheet1!$A$1” 수식이 있고 이 수식이 복사되어 Sheet2에 붙여 넣어진 경우 Sheet2의 셀은 수식의 일부로 워크시트 참조가 복사되었기 때문에 Sheet1!$A$1을 계속 참조합니다.


수식이 "=$A$1"이면 수식에 지정된 워크시트 참조가 없기 때문에 Sheet2의 셀은 대신 Sheet2!$A$1 셀을 참조합니다. 워크시트 참조를 포함하는 일부 수식 예는 다음과 같습니다.


A1 참조 스타일


Sheet1!$A1


'Monthly Sales'!B$2:$F2


R1C1 참조 스타일


Sheet1!R1C[1]


'Monthly Sales'!R2C:RC5


워크시트 이름에 공백이나 다른 특수 문자가 포함되어 있거나 A1 또는 R1C1 참조 스타일의 셀 범위 참조와 혼동될 수 있는 경우 워크시트 이름 참조를 작은 따옴표로 묶어야 합니다. 워크시트 이름에 작은 따옴표나 아포스트로피()가 포함되어 있으면 수식 문자열 내에서 두 배로 늘려야합니다 (예 : "test 's results"라는 워크 시트를 수식에 사용하는 경우 참조는 다음과 같아야 합니다).


‘test’’s results’!$A$1


3차원 참조


워크시트 참조는 범위 연산자 ':'를 사용하여 3차원 참조를 만들 수도 있습니다. 3차원 참조는 시작 및 끝 워크시트를 지정하고 각 워크시트에 지정된 셀 또는 셀 범위를 포함합니다. 3차원 참조를 포함하는 수식의 예는 다음과 같습니다.


A1 참조 스타일


Sheet1:Sheet3!$A1


January:December!B$2:$F2

 


R1C1 참조 스타일



Sheet1:Sheet3!R1C[1]


January:December!R2C:RC5



통합 문서 참조 (외부 참조)



통합문서 참조는 다른 통합문서에 대한 참조입니다. 소스는 통합문서 외부에 있고 사용 가능하지 않을 수 있기 때문에 때때로 "외부 참조(external references)"라고도 합니다. 따라서 캐시되어 최종적으로 알려진 값은 통합문서에 보관되어 소스 통합문서가 열리지 않은 경우 계산에 사용됩니다.



외부 참조는 다른 통합문서에 대한 외부 참조가 포함한 수식을 통해 통합 문서에 연결되기 때문에 "링크(links)"라고도 합니다. 외부 참조는 꺽쇠괄호로 묶인 통합문서 이름 또는 파일 이름을 사용합니다.



외부 통합문서 참조를 포함하는 수식의 예는 다음과 같습니다.



A1 참조 스타일



[Book1]Sheet1!$A1


[SalesDetail.xlsx]‘Monthly Sales’!B$2:$F2


R1C1 참조 스타일



[Book1]Sheet1!R1C[1]


[SalesDetail.xlsx] ‘Monthly Sales’!R2C:RC5



외부 참조와 관련된 Spread.NET 12의 API로는 IWorkbook.LinkSources , IWorkbook.SaveLinkValues , IWorkbook.UpdateLinks , IWorkbook.BreakLink 및 IWorkbook.UpdateLink가 포함되며 Spread.NET 12의 외부 참조 지원에 대한 자세한 내용은 여기에 있습니다.


테이블 셀에 대한 구조적 참조


구조화된 참조는 일반 참조보다 읽기 쉽고 이해하기 쉬운 특수 문법을 사용하는 테이블 셀 또는 셀 범위에 대한 참조입니다. 구조화된 참조는 테이블 셀에 대한 수식 또는 테이블 셀을 참조하는 수식에만 사용할 수 있습니다. 워크시트에서 셀 범위에 대한 테이블을 만들 때, 셀 범위의 맨 위 행이 테이블의 헤더 셀이 됩니다.


테이블의 열 이름은 셀 범위의 맨 상단 행에 열 이름이 없는 경우 자동 생성된 이름 인 Column1 및 Column2를 사용하여 지정됩니다.


구조적 참조를 사용하려면 테이블이 필요합니다


구조적 참조는 열 이름을 사용하므로 읽고 이해하기 훨씬 쉬운 특수 문법을 사용합니다.


테이블 헤더 행 및 총계 행에 있는 셀에 접근하기 위해 사전 정의된 이름도 있습니다.


구조적 참조를 포함하는 수식의 예는 다음과 같습니다.


[@Column1]+[@Column2]


[Column1]


Table1[[#Headers],[Column1]]


Table1[[#Totals],[Column1]]


Table1[#All]


위의 첫 두 예제는 테이블 이름 참조를 포함하지 않으며 해당 열을 참조하는 테이블 셀 내에서만 유효합니다. 마지막 세 가지 예는 테이블 이름을 포함하며 테이블 외부의 셀에서 사용될 수 있습니다. '@'은 지정된 열의 “행”에 있는 테이블 셀에 대한 상대 참조를 지정합니다. 열 이름은 공백을 포함할 수 있으며 작은 따옴표로 묶을 필요는 없습니다. 예를 들어 열이 이름이 "January Sales"인 경우 테이블 셀 수식에서 "[@January Sales]"로 참조 할 수 있습니다.


테이블 셀은 배열 수식이 포함될 수 없지만, 테이블이 아닌 셀에서 배열 수식은 테이블 셀 범위에 대한 구조적 참조를 사용할 수 있습니다. 외부 통합 문서에 대한 구조적 참조는 워크시트에 대한 참조처럼 보이지만 워크시트 이름 대신 테이블 이름을 사용하는 특수 문법을 사용합니다.


외부 통합 문서에 대한 구조적 참조가 포함된 수식의 예는 다음과 같습니다.


Book2!Table1[[#Headers],[Column1]]


‘Sales Data.xlsx’!Table1[[#Totals],[Column1]]


‘Tax Tables.xlsx’!Table1[#All]


셀 범위 등에 대한 사용자 지정 이름


셀 범위에 대한 명시적 참조를 해당 범위를 사용하는 대신에 정의된 사용자 지정 이름과 함께 대체하여 수식의 가독성을 크게 향상시킬 수 있습니다. 그런 다음 이러한 수식은 유용하고 서술하는 이름을 사용하여 수식 검사를 훨씬 쉽게 만들고 오류를 제거하는데 도움이 될 수 있습니다. 이름은 문자, 밑줄 또는 백슬래시로 시작해야 하며 문자, 숫자, 마침표 그리고 밑줄만 포함해야 합니다.


이름에 공백 문자를 포함 할 수 없으며 셀 참조처럼 보일 수 없습니다. 예를 들어 "D$5"또는 "R54C"는 범위 참조와 혼동될 수 있으므로 허용되지 않습니다.


"c" 또는 "r"만 이름으로 사용할 수 없습니다 (이미 예약된 이름임). 수식에서 이름은 대소문자를 구분하지 않지만 이름 관리자 도구에서 이름을 초기화하고 가독성을 향상시키기 위해 카멜 표기법과 같은 이름 지정 규칙을 사용할 수 있습니다.


사용자 지정 이름은 명명된 셀 및 범위로 제한되지 않으며 유효한 수식 표현식에 대한 사용자 지정 이름을 만들 수 있습니다. 모든 계산 함수는 사용자 지정 이름 수식에 사용할 수 있습니다. 매우 크고 복잡한 계산은 수식을 훨씬 쉽게 읽고 이해할 수 있게 하기 위해서 종종 사용자 지정 이름으로 더 간단한 단계로 세분화할 수 있습니다 .


사용자 지정 이름을 사용하여 매우 복잡한 계산을 구체적인 단계로 분리할 수 ​​있습니다. 이는 특히 구체적인 단계 중 일부를 한 개 이상의 계산에 걸쳐 재사용할 수 있는 경우에 유용합니다 (예 : 세율 계산에 사용자 지정 이름 사용). 사용자 지정 이름은 이름의 목적과 문서화하기 위한 주석 지정도 지원합니다. 사용자는 수식 표시줄(formula bar) 또는 이름 관리자(Name Manager) 도구에서 이름을 참조할 때 볼 수 있습니다.


이름 관리자는 이름을 구성하는 데 도움이됩니다


 

통합 문서 범위 이름을 추가할 때 워크시트 참조가 없는 특수 문법을 사용할 수 있지만 셀 또는 셀 범위 참조 앞에 '!'  연산자를 사용할 수 있습니다.  이 특수 문법은 이름이 수식에 사용될 때 활성 시트의 셀 또는 셀 범위를 참조합니다.


위에 표시된 이름 관리자 도구는 기본 스프레드 시트 컨트롤 바이너리에 내장되어 있으며 간단한 코드를 사용하여 프로그래밍 방식으로 사용할 수 있습니다.


[VB]


FpSpread1.ShowListCustomNameForm(Me)


[C#]


fpSpread1.ShowListCustomNameForm(this);


사용자 지정 이름 범위 : 통합 문서 및 워크 시트 이름



사용자 지정 이름은 통합 문서 또는 워크시트로 범위를 지정할 수 있습니다. 이름을 만들 때 사용자 인터페이스를 사용하는 경우 드롭 다운을 사용하여 범위를 선택하고 지정할 수 있습니다.


새로운 이름 대화 상자


 

코드에서 INames.Add 메서드를 호출할 때 마지막 인자에서 이름의 범위를 지정할 수 있습니다 .


[VB]


FpSpread1.AsWorkbook().Names.Add("test", "!$A$1", Nothing, 0, 0, True)


[C#]


fpSpread1.AsWorkbook().Names.Add("test", "!$A$1", null, 0, 0, true);  


통합 문서 수준의 이름은 통합 문서의 모든 워크시트에 표시됩니다. 셀 수식에서 두 수준에 대해 동일한 이름이 정의되어 있을 때, 워크시트 수준의 이름은 통합 문서 수준의 이름보다 우선시되도록 정의하고 해당 워크 시트의 셀에만 표시가 됩니다. 


워크시트를 복사하면 모든 워크시트 수준의 사용자 지정 이름이 새 워크시트에 새 워크시트 수준의 사용자 지정 이름으로 복사됩니다.


사용자 지정 이름 표현식의 평가


사용자 지정 이름을 추가하거나 변경하면 지정된 수식이 해당 수식을 나타내는 논리식으로 즉시 구문 분석되며 해당 이름을 사용하는 수식이 포함된 셀은 자동으로 다시 계산됩니다 (자동 계산이 비활성화되지 않은 경우). 셀 수식에 해당 이름이 포함된 경우 수식은 이름식이 이름 참조를 대체한 것처럼 계산되며 모든 참조 및 함수(예 : ROW ())가 계산중인 특정 셀의 컨텍스트에서 계산을 하게 됩니다.


일부 셀 수식이 해당 이름을 참조하고 해당 셀이 계산 될 때까지 사용자 지정 이름식은 실제로 계산되지 않습니다. 사용자 정의 이름 표현식은 이름 관리자(Name Manager)에 의해 계산되어 대화 상자의 값(Value) 열을 표시합니다. 이 경우 값은 현재 활성 셀을 상대 참조의 컨텍스트로 사용하여 계산됩니다.


사용자 지정 이름의 절대 및 상대 참조


사용자 지정 이름에는 셀 수식과 마찬가지로 절대 또는 상대 참조를 포함할 수 있습니다. 일반적으로, 모든 셀에서 사용될 수 있고 지정된 절대 참조를 항상 참조할 수 있기 때문에 사용자 지정 이름에서 항상 절대 참조를 사용하는 것이 좋습니다. 수식은 작성시 반드시 일부 셀에 연결되어 있어야 하고 상대 참조가 의미가 있는 셀에서만 사용할 수 있기 때문에 상대 참조를 포함하는 사용자 지정 이름은 사용하기가 훨씬 더 복잡합니다.


UI "새 이름"(New Name) 대화 상자를 사용하여 사용자 지정 이름을 작성할 때, 활성 시트의 활성 셀은 수식 표현식에서 상대 참조를 구문 분석하는 데 사용되므로 모든 상대 참조는 해당 셀의 상대 오프셋으로 구문 분석됩니다 (예 : " 셀은 두 행 위로, 열로는 왼쪽으로 하나의 열이 있습니다.) 이 이름이 다른 셀에서 사용되면 참조된 셀도 변경됩니다.


사용자 지정 이름에 상대 참조를 사용하는 것이 도움이 될 때도 있습니다. 그러나 일반적으로 필요한 경우가 아니면 피해야합니다. 다른 셀이 활성화되어 있으면 수식이 예상대로 표시되거나 계산되지 않으므로 이름 관리자 도구를 사용하여 수식을 보거나 편집할 때 어떤 셀이 활성화되어야 하는지 사용자 지정 이름에 대한 주석을 메모하는 것이 중요합니다.


외부 변수


Spread.NET 12 Windows Forms는 사용자 지정 이름과 유사하지만 훨씬 강력하고 유연한 “외부 변수”라는 혁신적인 새로운 기능을 지원합니다. 외부 변수는 일부 외부 소스에서 데이터를 푸시하거나 계산된 값을 외부 소스로 가져오는데 사용할 수 있는 새로운 특수 타입의 사용자 지정 이름입니다.


"외부 소스"는 웹 서비스나 다른 컨트롤과 같이 프로그램에 필요한 모든 것이 될 수 있으며 이는 구현할 애플리케이션에 달려 있습니다. 외부 변수에는 통합 문서 범위 사용자 지정 이름과 같은 워크 시트를 참조할 수 있는 이름과 수식식이 있습니다. 외부 변수 계산은 사용자 지정 이름과는 매우 다르게 작동하는데 외부 변수는 다른 워크 시트와 별개의 작은 단일 셀 워크 시트처럼 작동합니다.


표현식이 계산할 때 컨텍스트 셀이 없기 때문에 외부 변수 표현식에는 상대 참조가 지원되지 않으므로 모든 상대 참조가 자동적으로 절대 참조로 변환됩니다.


외부 변수는 통합 문서 범위에서 작동하므로 모든 셀 범위 참조는 워크 시트 이름을 지정해야합니다.


외부 변수 데모 샘플


외부 변수 예


외부 변수를 만들려면 ExternalVariable에서 상속되는 클래스를 구현해야 합니다. 이 간단한 예제에서는 계산에 사용할 TextBox 컨트롤에서 값을 가져오는 외부 변수를 만든 다음 셀의 첫 번째 값을 셀의 인수 값으로 곱하여 다른 외부 변수를 만들어 다른 TextBox 컨트롤에 반환하는 방법을 보여줍니다.


클래스 구현은 다음과 같습니다.


[VB]


Imports GrapeCity.Spreadsheet  
Imports GrapeCity.CalcEngine


'Creating and defining the external variable  
Public Class TextBoxExternalVariable  
    Inherits ExternalVariable  
    Private _textBox As TextBox  
    Private _asInput As Boolean  
    Public Sub New(ByVal textBox As TextBox, ByVal asInput As Boolean)  
        _textBox = textBox  
        If asInput Then  
            AddHandler textBox.TextChanged, AddressOf TextBox_TextChanged  
        End If  
    End Sub  
    Private Sub TextBox_TextChanged(ByVal sender As Object, ByVal e As EventArgs)  
        Dirty()  
    End Sub  
    Protected Overrides Function OnDirtying() As Boolean  
        Return Not _asInput  
    End Function  
    Protected Overrides Sub OnDirtied()  
        Refresh()  
    End Sub  
    Protected Overrides Sub EvaluateCore(ByVal context As IEvaluationContext, ByVal result As IValue)  
        Dim text As String = _textBox.Text  
        Dim dblValue As Double = Nothing  
        If Not String.IsNullOrEmpty(text) AndAlso Double.TryParse(text, dblValue) Then  
            result.SetValue(dblValue)  
        Else  
            result.SetValue(text)  
        End If  
    End Sub  
    Public Sub Refresh()  
        If Not _asInput Then  
            _textBox.Text = Me.Value.GetText()  
        End If  
    End Sub  
End Class  


[C#]


using System;  
using System.Windows.Forms;  
using GrapeCity.CalcEngine;  
using GrapeCity.Spreadsheet;

namespace ExternalVariablesDemoCS  
{  
    // Creating and defining the external variable  
    public class TextBoxExternalVariable : ExternalVariable  
    {  
        private TextBox _textBox;  
        private bool _asInput;  
        public TextBoxExternalVariable(TextBox textBox, bool asInput)  
        {  
            _textBox = textBox;  
            if (asInput)  
            {  
                textBox.TextChanged += TextBox_TextChanged;  
            }  
        }  
        private void TextBox_TextChanged(object sender, EventArgs e)  
        {  
            Dirty();  
        }

        protected override bool OnDirtying()  
        {  
            return !_asInput;  
        }

        protected override void OnDirtied()  
        {  
            Refresh();  
        }

        protected override void EvaluateCore(IEvaluationContext context,  
         IValue result)  
        {  
            string text = _textBox.Text;  
            if (!string.IsNullOrEmpty(text) && double.TryParse(text,  
                 out double dblValue))  
            {  
                result.SetValue(dblValue);  
            }  
            else  
            {  
                result.SetValue(text);  
            }  
        }

        public void Refresh()  
        {  
            if (!_asInput)  
            {  
                _textBox.Text = this.Value.GetText();  
            }  
        }  
    }  
}


TextBoxExternalVariable 생성자는 입출력에 텍스트 상자를 사용할지 여부를 나타내는 TextBox 컨트롤과 플래그가 필요합니다. TextBox 컨트롤은 로컬 필드에 유지되며 입력 플래그가 설정된 경우 이벤트 처리기가 TextBox.TextChanged 이벤트에 연결되어 텍스트가 변경 될 때 Dirty() 메서드를 호출합니다.


OnDirtying()의 코드는 변수가 입력에 사용되거나 무시될 때 true를 반환하고 Dirtied()의 코드는 Refresh() 메서드를 호출하여 입력 플래그가 설정되지 않은 경우 TextBox.Text를 현재 값으로 업데이트합니다. 


샘플을 설정하려면 양식에 몇 가지 초기화 코드가 필요합니다.


[VB]


Public Class Form1  
    'Using the external variable with text box control  
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load  
        Dim workbook = FpSpread1.AsWorkbook()  
        Dim activeSheet = workbook.ActiveSheet  
        activeSheet.Cells("A1").Value = "Factor"  
        activeSheet.Cells("B1").Value = 2  
        workbook.Names.AddExternalVariable("x", New TextBoxExternalVariable(TextBox1, True))  
        Dim extVariable2 = New TextBoxExternalVariable(TextBox2, False)  
        workbook.Names.AddExternalVariable("y", extVariable2, "Sheet1!B1 * x")  
        extVariable2.Refresh()  
    End Sub  
End Class


[C#]


using System;  
using System.Windows.Forms;

namespace ExternalVariablesDemoCS  
{  
    public partial class Form1 : Form  
    {  
        public Form1()  
        {  
            InitializeComponent();  
        }  
        private void Form1_Load(object sender, EventArgs e)  
        {  
            var workbook = fpSpread1.AsWorkbook();  
            var activeSheet = workbook.ActiveSheet;  
            activeSheet.Cells["A1"].Value = "Factor";  
            activeSheet.Cells["B1"].Value = 2;

            // Adding Ext. Variable - x referring to textbox1  
            workbook.Names.AddExternalVariable("x",  
            new TextBoxExternalVariable(textBox1, true));

            // Adding Ext. Variable "y" referring to textbox2 with formula "Sheet1!B1 * x"  
            var extVariable2 = new TextBoxExternalVariable(textBox2, false);  
            workbook.Names.AddExternalVariable("y", extVariable2, "Sheet1!B1 * x");  
            extVariable2.Refresh();  
        }  
    }  
}


첫 번째 외부 변수 "x"는 첫 번째 텍스트 상자를 사용하여 생성되고 입력에 사용됩니다. 두 번째 외부 변수 이름 "y"는 출력을 위한 두 번째 텍스트 상자를 사용하여 생성되며 첫 번째 값의 곱과 Sheet1! B1의 값을 계산합니다.


런타임시 첫 번째 텍스트 상자의 값이 변경되고 TextChanged 이벤트가 발생하면 두 번째 텍스트 상자가 계산된 곱으로 즉시 업데이트됩니다.


VB 샘플 코드 C# 샘플 코드

  • 페이스북으로 공유
  • 트위터로  공유
  • 링크 복사
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그1

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@mescius.com | 전화 : 1670-0583 | 경기도 과천시 과천대로 7길 33, 디테크타워 B동 1107호 메시어스(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 ⓒ 2024 MESCIUS inc. All rights reserved.