한글 2010,2014,2018,2020,2024 버전까지 매크로정의와 실행의 문제...

위 버번 한글에서 스크립트매크로 오작동에 대한 문의와 스크립트매크로 작성의 도움이 필요합니다.

개요 스크립트매크로 작성시 수식편집기 창 내부의 움직임이 기록되지 않는 문제

기존 2010이전 버전부터 써오던 매크로를 이번에 한글로 만든 데이터의 재가공중 매크로 사용이 필요하여 작성하던중 오류로 인해 개인적으로 여러방향의 시도를 하였으나 이전 2010이전 버전에서는 수식편집기 창 내부의 작동도 기록되었던 것이 기억나 예전 매크로 꾸러미에서 일부 발췌하여 수기로 작업해 보았으나… 한계에 봉착 도움을 청합니다.

매크로 작성
시작
찾기, 개체, 수식, (편집, 수식고치기, 수식편집창내부 텍스트Edit복사, 창닫기,) 붙여넣기, 지우기
종료
의 과정에서 (편집, 수식고치기, 수식편집창내부 텍스트Edit복사, 창닫기,)부분이 적용되지 않아 스크립트 편집기에서 확인한 결과
{
HAction.GetDefault(“Goto”, HParameterSet.HGotoE.HSet);
with (HParameterSet.HGotoE)
{
HSet.SetItem(“DialogResult”, 37);
SetSelectionIndex = 5;
}
HAction.Execute(“Goto”, HParameterSet.HGotoE.HSet);
FindCtrl();
HAction.Run(“Paste”);
HAction.Run(“Delete”);
}
로 작성된 것을 확인 예전 사용하던 매크로에서 아래부분을 만들어 추가하였으나 창내부의 작업진행이 되지 않는군요
한글OLEAutomation문서에서도 정확한 개체,매서드,파라미터에 대한 정보를 확인할 수 없어 매크로작성 오류가 수정되기 이전이라도 도움을 받았으면 합니다.

function OnScriptMacro_수식추출연습()
{
HAction.GetDefault(“Goto”, HParameterSet.HGotoE.HSet);
with (HParameterSet.HGotoE)
{
HSet.SetItem(“DialogResult”, 37);
SetSelectionIndex = 5;
}
HAction.Execute(“Goto”, HParameterSet.HGotoE.HSet);
FindCtrl();
! HAction.GetDefault(“EquationEditDialog”, HParameterSet.HShapeObject.HSet);
! with (HParameterSet.HShapeObject)
{
HAction.Run(“MoveLineBegin”);
HAction.Run(“MoveSelLineEnd”);
HAction.Run(“Copy”);
}
! HAction.Execute(“EquationEditDialog”, HParameterSet.HShapeObject.HSet);
FindCtrl();
HAction.Run(“Paste”);
}

위 !로 표현된 3줄에서의 명령어셋에 적절한 표현이 궁금합니다…

안녕하세요.

한글 매크로는 수식 대화상자의 UI 제어할 수 없습니다.
그래서 문의주신 코드로는 수식 추출하는 동작을 할 수가 없습니다.
작성한 코드의 의미만 주석으로 달았습니다.

function OnScriptMacro_수식추출연습()
{
    // 수식 개체 찾아가기
    HAction.GetDefault(“Goto”, HParameterSet.HGotoE.HSet);
    with (HParameterSet.HGotoE)
    {
        HSet.SetItem(“DialogResult”, 37);
        SetSelectionIndex = 5;
    }
    HAction.Execute(“Goto”, HParameterSet.HGotoE.HSet);
    FindCtrl();

    // 수식 대화상자 띄우기
    // ! HAction.GetDefault(“EquationEditDialog”, HParameterSet.HShapeObject.HSet);
    HAction.GetDefault(“EquationModify”, HParameterSet.HShapeObject.HSet);
    HAction.PopupDialog(“EquationModify”, HParameterSet.HShapeObject.HSet);
    
    // 수식 대화상자에서 수식 선택
    // MoveLineBegin, MoveSelLineEnd, Copy는 문서 편집뷰에서만 가능한 동작임
    ! with (HParameterSet.HShapeObject) {
        HAction.Run(“MoveLineBegin”);
        HAction.Run(“MoveSelLineEnd”);
        HAction.Run(“Copy”);
    }

    // ! HAction.Execute(“EquationEditDialog”, HParameterSet.HShapeObject.HSet);
    HAction.Execute(“EquationModify”, HParameterSet.HShapeObject.HSet);

    FindCtrl();
    HAction.Run(“Paste”);
    }

하고자 하는 동작이 문서내의 수식을 찾아 수식의 스트립트를 가져오고자 하는 것이라면
아래와 같이 작성할 수가 있습니다.

function OnScriptMacro_수식추출()
{
    // 문서에 있는 컨트롤들을 탐색
	var curCtrl = HeadCtrl;
	while (curCtrl) {
        // "eqed" (수식)인 컨트롤이 있으면 컨트롤 속성에서 스크립트 문자열을 가져옴
		if (curCtrl.CtrlID == "eqed") {
			var set = curCtrl.Properties;
			// 수식 스크립트를 메시지박스의 형식으로 임의로 띄운 것이고
			// 스크립트 문자열을 원하는 동작으로 구현하면 됨
			XHwpMessageBox.String = set.Item("String");
			XHwpMessageBox.DoModal();
		}
		curCtrl = curCtrl.Next;
	}
}

감사합니다.

1개의 좋아요

친절한 답변 감사합니다.
말씀하신 내용으로는 "스크립트 매크로 작성시 메뉴에서 불러오는 팝업창의 어떤 동작도 스크립트 매크로에 기록되지 않는다."라는 뜻인것 같아 시험해보니 그림 저장의 경우도 스크립트로 작업은 되지 않는 것을 확인하였습니다.

여기에서 질문

  1. 제가 과거 2010이전 버전 처음 스크립트 매크로(키매크로 아님) 생겼을때 작성해둔 스크립트는 현재도 작동하는 것을 확인하였습니다.
    function OnScriptMacro_임의정리수식8()
    {
    HAction.GetDefault(“FindDlg”, HParameterSet.HFindReplace.HSet);
    HAction.Execute(“FindDlg”, HParameterSet.HFindReplace.HSet);
    HAction.GetDefault(“Goto”, HParameterSet.HGotoE.HSet);
    with (HParameterSet.HGotoE)
    {
    HSet.SetItem(“DialogResult”, 37);
    SetSelectionIndex = 5;
    }
    HAction.Execute(“Goto”, HParameterSet.HGotoE.HSet);
    FindCtrl();
    HAction.GetDefault(“EquationPropertyDialog”, HParameterSet.HShapeObject.HSet);
    with (HParameterSet.HShapeObject)
    {
    BaseUnit = PointToHwpUnit(8.0);
    Height = 975;
    Width = 525;
    HSet.SetItem(“ShapeType”, 3);
    }
    HAction.Execute(“EquationPropertyDialog”, HParameterSet.HShapeObject.HSet);
    UnSelectCtrl();
    HAction.Run(“MoveRight”);
    }
    예전 작성하였던 스크립트인데 현재도 수식 팝업창의 동작이 가능한 것으로 보아 접근 가능한 코드가 있지 않을까?하는 생각이 듭니다.
    한번 살펴보시고 현재 작성하고자 하는 스크립트에 도움을 주시면 감사하겠습니다.

  2. 스크립트작성에 대한 보완 또는 패치는 언제쯤 가능한 것인지 궁금합니다.

  3. 과거의 키매크로라도 활성화 하여 작업할 수는 없는지?

작은 버그에도 신경 써주셔서 감사합니다.

다음 답변 기다리겠습니다…

안녕하세요.

작성한 스크립트 동작이 안 된 이유는 스크립트명과 함수명이 일치하지 않기 때문일 것 같습니다.

20240813_115628
스크립트 함수명을 적용한 스크립트명으로 대체해서 실행하면 동작할 것으로 보입니다.

_1. 작성해주신 코드는 살펴보면 동작이 가능한 형식입니다.

function OnScriptMacro_임의정리수식8()
{
    // 수식 개체 찾아가기
    HAction.GetDefault(“FindDlg”, HParameterSet.HFindReplace.HSet);
    HAction.Execute(“FindDlg”, HParameterSet.HFindReplace.HSet);
    HAction.GetDefault(“Goto”, HParameterSet.HGotoE.HSet);
    with (HParameterSet.HGotoE)
    {
        HSet.SetItem(“DialogResult”, 37);
        SetSelectionIndex = 5;
    }
    HAction.Execute(“Goto”, HParameterSet.HGotoE.HSet);
    FindCtrl();

    // 수식 개체 속성에서 글자 크기를 8pt, 크기를 525X975(HWPUNIT) 변경
    HAction.GetDefault(“EquationPropertyDialog”, HParameterSet.HShapeObject.HSet);
    with (HParameterSet.HShapeObject)
    {
        BaseUnit = PointToHwpUnit(8.0);
        Height = 975;
        Width = 525;
        HSet.SetItem(“ShapeType”, 3);
    }
    HAction.Execute(“EquationPropertyDialog”, HParameterSet.HShapeObject.HSet);

    // 수식 선택 상태 해제
    UnSelectCtrl();
    // 오른쪽으로 커서 이동
    HAction.Run(“MoveRight”);
}

_2. 현재 제공하는 오토메이션 API로도 구현하는 동작들이 가능할 것 같습니다.
아직 확인되지 않은 사항에 대해 수정 패치를 말씀드릴 수는 없고,
제품 측면의 문의라서 여기서 답변드릴 수는 없습니다.

_3. 키매크로는 보안의 문제로 더 이상 사용할 수 없습니다.
처음 답변드린 코드로 적용해보시고 이 코드를 기반으로 동작을 확장해서 작성하는 것을 권유드립니다.

감사합니다.

감사합니다…
도움주신 덕분에 길을 찾아가고 있는 듯 합니다.

이번 질문은 조금 염치 없지만
디테일에 있는 악마를 퇴치하는 팁을 바랍니다.

보내주신 스크립트
function OnScriptMacro_수식추출()
{
// 문서에 있는 컨트롤들을 탐색
var curCtrl = HeadCtrl;
while (curCtrl) {
// “eqed” (수식)인 컨트롤이 있으면 컨트롤 속성에서 스크립트 문자열을 가져옴
if (curCtrl.CtrlID == “eqed”) {
var set = curCtrl.Properties;
// 수식 스크립트를 메시지박스의 형식으로 임의로 띄운 것이고
// 스크립트 문자열을 원하는 동작으로 구현하면 됨
XHwpMessageBox.String = set.Item(“String”);
XHwpMessageBox.DoModal();
}
curCtrl = curCtrl.Next;
}
}
를 다음과 같이 변형하여 수식추출에는 성공하였으나 컨트롤이 잘 되지를 않는군요

function OnScriptMacro_수식추출()
{
var curCtrl = HeadCtrl;
while (curCtrl) {
if (curCtrl.CtrlID == “eqed”) {
var set = curCtrl.Properties;
// 스크립트 문자열을 원하는 동작으로 구현하면 됨
HAction.GetDefault(“InsertText”, HParameterSet.HInsertText.HSet);
HParameterSet.HInsertText.Text = set.Item(“String”);
HAction.Execute(“InsertText”, HParameterSet.HInsertText.HSet);
}
curCtrl = curCtrl.Next;
}
}
로 정리하여 텍스트를 수식텍스트추출에는 성공하였으나 원래 있던 수식의 위치에 텍스트를 넣는것을 기대하여
function OnScriptMacro_수식추출()
{
var curCtrl = HeadCtrl;
while (curCtrl) {
HAction.GetDefault(“Goto”, HParameterSet.HGotoE.HSet);
with (HParameterSet.HGotoE)
{
HSet.SetItem(“DialogResult”, 37);
SetSelectionIndex = 5;
}
HAction.Execute(“Goto”, HParameterSet.HGotoE.HSet);
if (curCtrl.CtrlID == “eqed”) {
var set = curCtrl.Properties;
// 스크립트 문자열을 원하는 동작으로 구현하면 됨
HAction.GetDefault(“InsertText”, HParameterSet.HInsertText.HSet);
HParameterSet.HInsertText.Text = set.Item(“String”);
HAction.Execute(“InsertText”, HParameterSet.HInsertText.HSet);
}
curCtrl = curCtrl.Next;
}
}
로 정리해보고
function OnScriptMacro_수식추출()
{
var curCtrl = HeadCtrl;
while (curCtrl) {
if (curCtrl.CtrlID == “eqed”) {
HAction.GetDefault(“Goto”, HParameterSet.HGotoE.HSet);
with (HParameterSet.HGotoE)
{
HSet.SetItem(“DialogResult”, 37);
SetSelectionIndex = 5;
}
HAction.Execute(“Goto”, HParameterSet.HGotoE.HSet);
var set = curCtrl.Properties;
// 스크립트 문자열을 원하는 동작으로 구현하면 됨
HAction.GetDefault(“InsertText”, HParameterSet.HInsertText.HSet);
HParameterSet.HInsertText.Text = set.Item(“String”);
HAction.Execute(“InsertText”, HParameterSet.HInsertText.HSet);
}
curCtrl = curCtrl.Next;
}
}
로도 정리해 보았으나 전체 수식이 모두 한자리에서 출력되었습니다.
curCtrl.Next로 문서 전체를 검색하는것으로 생각하여 조건문 내부에 넣어도 예상대로 되지 않는군요

  • 수식을 찾고 → 찾은 수식의 텍스트를 읽어 → 찾은 수식의 앞 또는 뒤에 텍스트를 쓰기

까지가 제가 처음에 계획했던 부분인데 덕분에 실마리는 찾았으나, 디테일이 부족하군요

제가 자바스크립드에 대한 지식이 일천하다 보니 메서드 사용등에 대한 이해가 부족한 탓인걸 알지만 염치불구하고 도움 청해봅니다.

감사합니다.

현재 수식의 스크립트를 수정하고자 한다면 아래와 같이 수정하실 수 있습니다.
설명은 주석으로 달았습니다.

function OnScriptMacro_수식추출()
{
	var curCtrl = HeadCtrl;
	while (curCtrl) {
		if (curCtrl.CtrlID == "eqed") {
			var set = curCtrl.Properties;
			var eqscript = set.Item("String");

			// 현재 스크립트 확인
			XHwpMessageBox.String = eqscript;
			XHwpMessageBox.DoModal();

			// 스크립트 수정
			// 기존 스크립트 앞에 "가나다", 뒤에는 "1234"를 붙임
			eqscript = "가나다" + eqscript + "1234";

			// 수정된 스크립트를 수식에 적용
			set.SetItem("String", eqscript);
			curCtrl.Properties = set;
		}
		curCtrl = curCtrl.Next;
	}
}

감사합니다.

빠른 답변 너무너무 감사합니다.

제가 표현력이 부족하여 번거롭게 해드립니다.

수식을 찾아 수식자체에 변형을 가하는 것이 아닌 수식이 쓰여진 문서상의 위치 앞 또는 뒤에 그 수식의 텍스트를 표현하는 것이었는데

수식의 내용이 2x+y인 경우 텍스트(2x+y)를 수식 앞에 써주는
즉 2x+y"수식"으로 정리하는 방법이 필요한 것이었습니다.

또 다시 번거롭게 해드립니다.

감사하고 죄송합니다.

안녕하세요 ^^
아래와 같이 수식 앞에 수식의 스크립트 코드를 넣어주면 될까요 …?
컨트롤의 GetAnchorPos API를 통해 수식의 조판부호의 위치를 알수있고 해당 위치로 이동하여 텍스트를 입력할수 있습니다.

샘플 코드 입니다.
감사합니다 ^^

function OnScriptMacro_script1()
{
	var curCtrl = HeadCtrl;
	while (curCtrl) {
		if (curCtrl.CtrlID == "eqed") {
			var set = curCtrl.Properties;
			var eqscript = set.Item("String");

			// 현재 스크립트 확인
			XHwpMessageBox.String = eqscript;
			XHwpMessageBox.DoModal();
			
			var posSet = curCtrl.GetAnchorPos(2);
			
			// 수식 조판부호의 위치 이동
			var list = posSet.Item("List");
			var para = posSet.Item("Para");
			var pos = posSet.Item("Pos");
			SetPos(list,para,pos);
			
			// 텍스트 넣기
			var text = "(" + eqscript + ")";;
			HAction.GetDefault("InsertText", HParameterSet.HInsertText.HSet);
			HParameterSet.HInsertText.Text = text;
			HAction.Execute("InsertText", HParameterSet.HInsertText.HSet);
		

		}
		curCtrl = curCtrl.Next;
	}
}
1개의 좋아요

네 감사합니다…

덕분에 20년 가까운 세월을 녹여 만든 소중한 데이터를
다시 불러 올수있는 기회를 만들어 주셔서
뭐라 이루 말할 수없이 감사합니다…

더운 여름 잘 보내시길 기원합니다… 꾸벅^^

2개의 좋아요