-2147467259 오류 해결 방법

이 범주에서는 한글 오토메이션에 대한 다른 사용자의 기술 지원을 제공받을 수 있습니다.

  1. 한글 오토메이션의 API 사용/연동은 개발 가이드를 참조하세요.
  2. 일반 문의는 한글과컴퓨터 웹사이트의 고객 지원을 이용하세요.
  3. 개인정보가 포함되지 않도록 유의하세요. 게시글 또는 댓글에 개인정보가 포함된 내용이 있을 경우 게시물이 숨김처리 될 수 있습니다.

한글 매크로를 이용해서 제 로컬 내의 한글 파일을 자동으로 여러개 켜고 작업하는 스크립트를 짜고 싶습니다

스크립트는 정상인 것 같은데, 위와 같은 오류로 더이상 진행이 안되는 것 같더라구요..

혹시 어떻게 더 진행할 수 있을까요?


\[코드\]
// 매크로 이름: 학생별학습지통하
function OnScriptMacro_TotalNote() {
var fso = new ActiveXObject(“Scripting.FileSystemObject”);

// 1. 폴더 경로 입력
var folderPath = InputBox("시험지 파일들이 있는 [폴더 경로]를 붙여넣으세요.\n(예: C:\\Users\\User\\Desktop\\시험지모음)", "폴더 경로 입력");
if (!folderPath || folderPath.length === 0) return;

if (!fso.FolderExists(folderPath)) {
    Alert("❌ 입력하신 경로를 찾을 수 없습니다.\n오타가 있는지 확인해주세요.");
    return;
}

// 2. 파일 리스트업
var folder = fso.GetFolder(folderPath);
var fc = new Enumerator(folder.files);
var fileList = [];

for (; !fc.atEnd(); fc.moveNext()) {
    var f = fc.item();
    var ext = fso.GetExtensionName(f.name).toLowerCase();
    if (ext == "hwp" || ext == "hwpx") {
        fileList.push(f.path);
    }
}
fileList.sort();

if (fileList.length === 0) {
    Alert("❌ 해당 폴더에 한글(hwp, hwpx) 파일이 없습니다.");
    return;
}

// 3. 파일 목록 및 문제 입력
var msgList = "📂 파일 목록 (번호 확인용):";
for (var i = 0; i < fileList.length; i++) {
    msgList += "\n[" + (i + 1) + "] " + fso.GetFileName(fileList[i]);
}
var guideMsg = "\n\n✍️ 추출할 문제를 입력하세요. (예: 1-3 2-5 1-2)";
var inputStr = InputBox(msgList + guideMsg, "문제 추출 입력");
if (!inputStr) return;

// 4. 입력값 파싱
var tasks = ParseInput(inputStr);
if (tasks.length === 0) {
    Alert("❌ 입력 형식이 올바르지 않습니다.\n숫자-숫자 형태로 입력해주세요.");
    return;
}

// 5. 백그라운드 한글 실행 (오류 확인용 수정)
var sourceHwp = null;
try {
    // 여기서 에러가 발생하면 catch로 넘어갑니다.
    sourceHwp = new ActiveXObject("HWPFrame.HwpObject");
    sourceHwp.XHwpWindows.Item(0).Visible = false; 
    sourceHwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule");
} catch (e) {
    // ⭐ 여기가 중요합니다. 진짜 에러 내용을 보여줍니다.
    Alert("🚨 오토메이션 오류 발생!\n\n에러 메시지: " + e.description + "\n에러 번호: " + e.number + "\n\n(해결책: HwpAutomationApp.exe를 관리자 권한으로 실행해보세요)");
    return;
}

// 6. 작업 시작
var currentFileIdx = -1; 
var errorLog = "";
var successCount = 0;

for (var k = 0; k < tasks.length; k++) {
    var task = tasks[k];
    var fIdx = task.fileIdx;
    var qNum = task.qNum;

    if (fIdx < 0 || fIdx >= fileList.length) {
        errorLog += "[" + (fIdx + 1) + "번 파일 없음] ";
        continue;
    }

    if (currentFileIdx !== fIdx) {
        try {
            sourceHwp.Open(fileList[fIdx], "HWP", "forceopen:true");
            currentFileIdx = fIdx;
        } catch (e) {
            errorLog += "[" + (fIdx + 1) + "번 파일 열기 실패] ";
            continue;
        }
    }

    if (CopyQuestionFromSource(sourceHwp, qNum)) {
        HAction.Run("Paste"); 
        HAction.Run("MoveColumnEnd");
        HAction.Run("BreakPara");
        HAction.Run("BreakPara");
        successCount++;
    } else {
        errorLog += "[" + (fIdx+1) + "번 파일-" + qNum + "번 없음] ";
    }
}

if (sourceHwp) sourceHwp.Quit(); 

if (errorLog !== "") {
    Alert("⚠️ 작업 완료 (일부 누락)\n성공: " + successCount + "건\n누락: " + errorLog);
} else {
    Alert("✅ " + successCount + "문제 생성 완료! 수고하셨습니다.");
}
}

// ==========================================
// \[보조 함수들\]
// ==========================================

function Alert(msg) {
XHwpMessageBox.String = msg;
XHwpMessageBox.Flag = 0;
XHwpMessageBox.DoModal();
}

function CopyQuestionFromSource(hwpObj, targetNum) {
var ctrl = hwpObj.HeadCtrl;
var count = 0;
var found = false;

while (ctrl) {
    if (ctrl.CtrlID == "en") { 
        count++;
        if (count == targetNum) {
            var anchor = ctrl.GetAnchorPos(0);
            hwpObj.SetPosBySet(anchor);

            var nextCtrl = ctrl.Next;
            while (nextCtrl) {
                if (nextCtrl.CtrlID == "en") break;
                nextCtrl = nextCtrl.Next;
            }

            hwpObj.Run("MoveSelParaBegin"); 

            if (nextCtrl) {
                var nextPos = nextCtrl.GetAnchorPos(0);
                hwpObj.SetPosBySet(nextPos);
                hwpObj.Run("MovePrevParaEnd"); 
            } else {
                hwpObj.Run("MoveDocEnd"); 
            }

            hwpObj.Run("Copy"); 
            found = true;
            break;
        }
    }
    ctrl = ctrl.Next;
}
return found;

}

function ParseInput(str) {
var parts = str.split(/\[\\s,\]+/);
var result = [ ];
for (var i = 0; i < parts.length; i++) {
var p = parts\[i\];
if (p.indexOf(“-”) > -1) {
var nums = p.split(“-”);
var f = parseInt(nums\[0\]) - 1;
var q = parseInt(nums\[1\]);
if (!isNaN(f) && !isNaN(q)) {
result.push({ fileIdx: f, qNum: q });
}
}
}
return result;
}

function InputBox(prompt, title) {
var script = new ActiveXObject(“MSScriptControl.ScriptControl”);
script.Language = “VBScript”;
var safePrompt = prompt.replace(/“/g, '”“');
var lines = safePrompt.split(/\\r\\n|\\r|\\n/);
var vbStr = '”’ + lines.join(‘" & vbCrLf & "’) + ‘"’;
return script.Eval(‘InputBox(’ + vbStr + ‘, "’ + title + ‘")’);
}

안녕하세요

저는 아래 코드로 자바스크립트 문법 오류를 수정해서 실행해봤을 때 정상동작하는 것 같습니다.
특정 문서에서만 문제가 되는지 확인 부탁드립니다.

감사합니다.


// 매크로 이름: 학생별학습지통합
function OnScriptMacro_TotalNote() {
    var fso = new ActiveXObject("Scripting.FileSystemObject");

    // 1. 폴더 경로 입력
    var folderPath = InputBox("시험지 파일들이 있는 [폴더 경로]를 붙여넣으세요.\n(예: C:\\Users\\User\\Desktop\\시험지모음)", "폴더 경로 입력");
    if (!folderPath || folderPath.length === 0) return;

    if (!fso.FolderExists(folderPath)) {
        Alert("❌ 입력하신 경로를 찾을 수 없습니다.\n오타가 있는지 확인해주세요.");
        return;
    }

    // 2. 파일 리스트업
    var folder = fso.GetFolder(folderPath);
    var fc = new Enumerator(folder.Files);
    var fileList = [];

    for (; !fc.atEnd(); fc.moveNext()) {
        var f = fc.item();
        var ext = fso.GetExtensionName(f.Name).toLowerCase();
        if (ext == "hwp" || ext == "hwpx") {
            fileList.push(f.Path);
        }
    }
    fileList.sort();

    if (fileList.length === 0) {
        Alert("❌ 해당 폴더에 한글(hwp, hwpx) 파일이 없습니다.");
        return;
    }

    // 3. 파일 목록 및 문제 입력
    var msgList = "📂 파일 목록 (번호 확인용):";
    for (var i = 0; i < fileList.length; i++) {
        msgList += "\n[" + (i + 1) + "] " + fso.GetFileName(fileList[i]);
    }
    var guideMsg = "\n\n✍️ 추출할 문제를 입력하세요. (예: 1-3 2-5 1-2)";
    var inputStr = InputBox(msgList + guideMsg, "문제 추출 입력");
    if (!inputStr) return;

    // 4. 입력값 파싱
    var tasks = ParseInput(inputStr);
    if (tasks.length === 0) {
        Alert("❌ 입력 형식이 올바르지 않습니다.\n숫자-숫자 형태로 입력해주세요.");
        return;
    }

    // 5. 백그라운드 한글 실행
    var sourceHwp = null;
    try {
        sourceHwp = new ActiveXObject("HWPFrame.HwpObject");
        sourceHwp.XHwpWindows.Item(0).Visible = false; 
        sourceHwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule");
    } catch (e) {
        Alert("🚨 오토메이션 오류 발생!\n\n에러 메시지: " + e.description + "\n(해결책: HwpAutomationApp.exe를 관리자 권한으로 실행해보세요)");
        return;
    }

    // 6. 작업 시작
    var currentFileIdx = -1; 
    var errorLog = "";
    var successCount = 0;

    for (var k = 0; k < tasks.length; k++) {
        var task = tasks[k];
        var fIdx = task.fileIdx;
        var qNum = task.qNum;

        if (fIdx < 0 || fIdx >= fileList.length) {
            errorLog += "[" + (fIdx + 1) + "번 파일 없음] ";
            continue;
        }

        if (currentFileIdx !== fIdx) {
            try {
                sourceHwp.Open(fileList[fIdx], "HWP", "forceopen:true");
                currentFileIdx = fIdx;
            } catch (e) {
                errorLog += "[" + (fIdx + 1) + "번 파일 열기 실패] ";
                continue;
            }
        }

        if (CopyQuestionFromSource(sourceHwp, qNum)) {
            HAction.Run("Paste"); 
            HAction.Run("MoveColumnEnd");
            HAction.Run("BreakPara");
            HAction.Run("BreakPara");
            successCount++;
        } else {
            errorLog += "[" + (fIdx + 1) + "번 파일-" + qNum + "번 없음] ";
        }
    }

    if (sourceHwp) {
        sourceHwp.Quit();
    }

    if (errorLog !== "") {
        Alert("⚠️ 작업 완료 (일부 누락)\n성공: " + successCount + "건\n누락: " + errorLog);
    } else {
        Alert("✅ " + successCount + "문제 생성 완료! 수고하셨습니다.");
    }
}

// ==========================================
// [보조 함수들]
// ==========================================

function Alert(msg) {
    XHwpMessageBox.String = msg;
    XHwpMessageBox.Flag = 0;
    XHwpMessageBox.DoModal();
}

function CopyQuestionFromSource(hwpObj, targetNum) {
    var ctrl = hwpObj.HeadCtrl;
    var count = 0;
    var found = false;

    while (ctrl) {
        // 'en'은 수식(Equation)을 의미합니다. 문제 번호를 수식으로 매기신 경우 유지하세요.
        if (ctrl.CtrlID == "en") { 
            count++;
            if (count == targetNum) {
                var anchor = ctrl.GetAnchorPos(0);
                hwpObj.SetPosBySet(anchor);

                var nextCtrl = ctrl.Next;
                while (nextCtrl) {
                    if (nextCtrl.CtrlID == "en") break;
                    nextCtrl = nextCtrl.Next;
                }

                hwpObj.Run("MoveSelParaBegin"); 

                if (nextCtrl) {
                    var nextPos = nextCtrl.GetAnchorPos(0);
                    hwpObj.SetPosBySet(nextPos);
                    hwpObj.Run("MovePrevParaEnd"); 
                } else {
                    hwpObj.Run("MoveDocEnd"); 
                }

                hwpObj.Run("Copy"); 
                found = true;
                break;
            }
        }
        ctrl = ctrl.Next;
    }
    return found;
}

function ParseInput(str) {
    // 공백이나 쉼표로 분리
    var parts = str.split(/[\s,]+/);
    var result = [];
    for (var i = 0; i < parts.length; i++) {
        var p = parts[i];
        if (p.indexOf("-") > -1) {
            var nums = p.split("-");
            var f = parseInt(nums[0]) - 1; // 파일 번호는 0부터 시작하도록
            var q = parseInt(nums[1]);
            if (!isNaN(f) && !isNaN(q)) {
                result.push({ fileIdx: f, qNum: q });
            }
        }
    }
    return result;
}

function InputBox(prompt, title) {
    try {
        var script = new ActiveXObject("MSScriptControl.ScriptControl");
        script.Language = "VBScript";
        // 큰따옴표 이스케이프 및 줄바꿈 처리
        var safePrompt = prompt.replace(/"/g, "\"\"");
        var lines = safePrompt.split(/\r\n|\r|\n/);
        var vbStr = '"' + lines.join('" & vbCrLf & "') + '"';
        return script.Eval("InputBox(" + vbStr + ", \"" + title + "\")");
    } catch (e) {
        // MSScriptControl이 없는 경우(64비트 등)를 대비한 간단한 대체
        return prompt; 
    }
}


안녕하세요.

윈도우에서 0x80004005에러가 발생한 것일 수도 있을 것 같습니다.
관련해서 찾아보시면 도움이 될 수도 있을 것 같습니다.

감사합니다.