위 버번 한글에서 스크립트매크로 오작동에 대한 문의와 스크립트매크로 작성의 도움이 필요합니다.
개요 스크립트매크로 작성시 수식편집기 창 내부의 움직임이 기록되지 않는 문제
기존 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_수식추출()
{
// 문서에 있는 컨트롤들을 탐색
var curCtrl = HeadCtrl;
while (curCtrl) {
// "eqed" (수식)인 컨트롤이 있으면 컨트롤 속성에서 스크립트 문자열을 가져옴
if (curCtrl.CtrlID == "eqed") {
var set = curCtrl.Properties;
// 수식 스크립트를 메시지박스의 형식으로 임의로 띄운 것이고
// 스크립트 문자열을 원하는 동작으로 구현하면 됨
XHwpMessageBox.String = set.Item("String");
XHwpMessageBox.DoModal();
}
curCtrl = curCtrl.Next;
}
}
제가 과거 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”);
}
예전 작성하였던 스크립트인데 현재도 수식 팝업창의 동작이 가능한 것으로 보아 접근 가능한 코드가 있지 않을까?하는 생각이 듭니다.
한번 살펴보시고 현재 작성하고자 하는 스크립트에 도움을 주시면 감사하겠습니다.
보내주신 스크립트
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;
}
}
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;
}
}