Excel - VBA

Ribbon Menu에서 매크로에 인수 전달하기

EGTools 2023. 1. 5. 18:30

일반 프로시저를 만들어 두고 공통으로 사용하기 위해서 인수를 사용한 다음

필요에 따라 인수를 이용하여 동작 방식을 변경하는 것을 할 수 있습니다.

 

그런데, Ribbon Menu에서 CallBack 함수를 호출할 때 인수를 어떻게 전달할까요?

 

예전에는 아래처럼 Ribbon Menu에서 각각 별도로 호출을 하고,

CallBack 함수에서 공통 프로시저에 인수를 넣어 호출하는 방식을 사용했습니다.

 

Ribbon Menu의 XML 부분

<splitButton id="sbtVisiblePaste" size="large">
    <button id="btVisiblePaste" label="보이는 셀 붙여넣기" imageMso="Paste" onAction="rbnPasteVisibleAll" supertip="보이는 셀에만 붙여넣기 합니다." />
    <menu id="mnVisiblePaste"   label="보이는 셀 붙여넣기" imageMso="Paste" itemSize="large"  >
      <button id="sbm121" label="모두 붙여넣기" imageMso="Paste"          onAction="rbnPasteVisibleAll" />
      <button id="sbm122" label="값만 붙여넣기" imageMso="PasteValues"    onAction="rbnPasteVisibleValues"  />
      <button id="sbm123" label="수식 붙여넣기" imageMso="PasteFormulas"  onAction="rbnPasteVisibleFormulas" />
    </menu>
  </splitButton>

CallBack 함수 부분

Public Sub rbnPasteVisibleAll(control As IRibbonControl)        ' 보이는 셀에 복사
    PasteToVisibleCells xlPasteAll
End Sub
Public Sub rbnPasteVisibleValues(control As IRibbonControl)     ' 보이는 셀에 값 복사
    PasteToVisibleCells xlPasteValues
End Sub
Public Sub rbnPasteVisibleFormulas(control As IRibbonControl)   ' 보이는 셀에 수식 복사
    PasteToVisibleCells xlPasteFormulas
End Sub

Sub PasteToVisibleCells(Optional argPasteType As Variant = xlPasteAll)
     '// 실행 코드
End Sub

 

이번에 많은 사용자 정의 함수(UDF)를 "함수 마법사"를 이용하여 공통으로 처리하는 방법에는

아래와 같이 Ribbon XML의 tag를 이용하여 공통으로 하나의 CallBack함수만 사용하는 방법을 사용했습니다.

 

Ribbon Menu의 XML 부분

 <menu id="mnEGF1" label="EG-검색함수" >
        <button id="EGF1_1" onAction="rbnFunctionWizard" label="iLOOKUP" tag="iLOOKUP" screentip="찾는 범위에서 찾는 값의 지정하는 순번의 그림을 가져옴" />
        <button id="EGF1_2" onAction="rbnFunctionWizard" label="nLOOKUP" tag="nLOOKUP" screentip="찾는 범위에서 찾는 값의 지정하는 순번을 찾음" />
        <button id="EGF1_3" onAction="rbnFunctionWizard" label="MatchJoin" tag="MatchJoin" screentip="찾는 값이나 조건에 해당하는 내용을 연결 문자를 이용하여 연결" />
        <button id="EGF1_4" onAction="rbnFunctionWizard" label="CompareList" tag="CompareList" screentip="2개의 범위나 목록을 비교하여 결과값을 반환함" />
        <button id="EGF1_5" onAction="rbnFunctionWizard" label="FindFirstData" tag="FindFirstData" screentip="지정범위내 첫번째로 자료가 입력된 Cell 찾기" />
        <button id="EGF1_6" onAction="rbnFunctionWizard" label="FindLastData" tag="FindLastData" screentip="지정범위내 마지막으로 자료가 입력된 Cell 찾기" />
        <button id="EGF1_7" onAction="rbnFunctionWizard" label="FindIncluded" tag="FindIncluded" screentip="찾는 문자열 전체가 들어있는 첫번째 Cell을 찾음" />
        <button id="EGF1_8" onAction="rbnFunctionWizard" label="FindSubstring" tag="FindSubstring" screentip="문자열의 일부분이 들어있는 첫번째 Cell을 찾음" />
 </menu>

 

CallBack 함수 부분

'// 아래 2개는 리본메뉴 함수명 버튼으로 함수명이 있는 tag를 이용해 함수마법사를 실행하는 것
Sub rbnFunctionWizard(ctrl As IRibbonControl)
    Selection.Formula = "=" & ctrl.Tag & "()"
    'Selection.FunctionWizard '<<- 바로 처리가 안됨, 아래처럼 시간차 간접 처리
    Application.OnTime Now + TimeValue("00:00:01") / 4, "showFunctionWizard"
End Sub
Private Sub showFunctionWizard()
    Selection.FunctionWizard
End Sub

 

이렇게 또 하나를 배우면서 버전업을 했습니다.