하이퍼 링크 (파일 링크) 개체 목록 (멤버 anchor
및 destination
)을 반복하여 선택한 Word 문서에 삽입하는 코드 조각이 있습니다. 대상 (앵커) 문자열을 찾으면 Word 문서를 검색하고 하이퍼 링크를 삽입 할 수 있습니다. 이제 Word 문서의 모든 StoryRanges
을 반복하여 섹션을 놓치지 않도록하고 싶습니다. 스토리 범위의 수는 예를 들어 WordApplication1->ActiveDocument->StoryRanges->Count
을 사용하여 얻을 수 있습니다. 그러나 정확한 형식으로 매개 변수를 전달하여 다음 검색하려는 스토리 범위를 실제로 검색 할 수는 없습니다. WordApplication1->ActiveDocument->StoryRanges->Item
. 숫자가 있지만 Item
은 올바른 유형의 VBA 상수를 매개 변수로 사용합니다. 내가 뭘 놓치고 있니?Embarcadero C++ (작성기)를 사용하여 Word OLE에서 스토리 범위 검색 및 반복
코드는 다음과 같습니다. 문제의 원인이되는 행은 이전에 int, OleVariant로 매개 변수를 입력하려고 시도 했었습니다. OleVariant에 대한 오류 메시지가 예상 한 매개 변수와 일치하지 않습니다. 열거 형을 참조하기 위해 wdFootnotesStory를 사용했지만 정의되지 않은 것으로 나타났습니다. 나는 Int 값도 시도했다. 여기
는 OLESafe 열거입니다 -enum class WdStoryType
{
wdMainTextStory = 1,
wdFootnotesStory = 2,
wdEndnotesStory = 3,
wdCommentsStory = 4,
wdTextFrameStory = 5,
wdEvenPagesHeaderStory = 6,
wdPrimaryHeaderStory = 7,
wdEvenPagesFooterStory = 8,
wdPrimaryFooterStory = 9,
wdFirstPageHeaderStory = 10,
wdFirstPageFooterStory = 11
};
Word_2k.h
에 정의 된 다음의 주요 코드입니다.// ---------------------------------------------- -----------------------------
#include <vcl.h>
#pragma hdrstop
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Word_2K_SRVR"
#pragma resource "*.dfm"
struct THyperLink
{
String Anchor;
String FilePath;
};
TList* linkList = new TList;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
THyperLink* link = new THyperLink;
link->Anchor = "ABC.0001.0002.0003";
link->FilePath = "S:\\Development\\WordLinking\\Test\\ABC.0001.0002.0003.pdf";
linkList->Add(link);
THyperLink* link2 = new THyperLink;
link2->Anchor = "ABC.0001.0002.0004";
link2->FilePath = "S:\\Development\\WordLinking\\Test\\ABC.0001.0002.0004.pdf";
linkList->Add(link2);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
OleVariant Template = EmptyParam();
OleVariant NewTemplate = False;
OleVariant ItemIndex = 1;
OleVariant strToInsert = "Insert String";
OleVariant endOfLine = "TEST";
OleVariant wdStory = 6;
//OleVariant wdMove = 0;
OleVariant rng;
OleVariant strSearch;// = "ABC.0001.0002.0003";
OleVariant strLink; // = "S:Development\\WordLinking\\Test\\ABC.0001.0002.0003.pdf";
OleVariant lnkDoc = "S:\\Development\\WordLinking\\Test\\ZZZ.0001.0002.0003.docx";
OleVariant wdCharacter = "wdCharacter";
OleVariant cChars = 18;
OleVariant wdMove = "wdMove";
OleVariant wdTrue = true;
OleVariant wrdStoryRangeCount;
OleVariant wdFootnotesStoryID;
OleVariant rangeStory;
OleVariant wrdDoc;
WdStoryType wdFootnotesStory = 2;
try
{
WordApplication1->Connect();
}
catch (...)
{
ShowMessage("Microsoft word is not installed");
}
//Make application visible
WordApplication1->GetDefaultInterface()->Visible = True;
//Open document to be linked
WordApplication1->Documents->Open(lnkDoc);
//Open new document - add to document collection in application
//WordApplication1->Documents->Add(Template, NewTemplate);
//go to top of the document
WordApplication1->Selection->HomeKey(wdStory);
for (int index = 0; index <= linkList->Count-1; index++)
{
//Retrieve hyperlink object
THyperLink* link = reinterpret_cast<THyperLink*>(linkList->Items[index]);
strSearch = (OleVariant)link->Anchor;
strLink = (OleVariant)link->FilePath;
//
wrdStoryRangeCount = WordApplication1->ActiveDocument->StoryRanges->Count;
//WordApplication1->ActiveDocument->StoryRanges->Item(1);
wdFootnotesStoryID = WordApplication1->ActiveDocument->StoryRanges->Item(??????)->get_ID();
ShowMessage ("wdFootnotesStory ID: " + wdFootnotesStoryID);
//WordApplication1->ActiveDocument->get_
while (WordApplication1->Selection->Find->Execute(strSearch,Template,Template,Template,Template,Template,wdTrue))
//while (WordApplication1->ActiveDocument->StoryRanges->Item(wdFootnotesStory)->Find->Execute(strSearch,Template,Template,Template,Template,Template,wdTrue))
{
WordApplication1->Selection->Hyperlinks->Add(WordApplication1->Selection->Range,strLink,Template,Template,strSearch,Template);
}
//go back to top of Word document
WordApplication1->Selection->HomeKey(wdStory);
}
//Disconnect from word
WordApplication1->Disconnect();
}
//---------------------------------------------------------------------------
솔루션 : 코드를 추가하는 과정에서, 나는 생각한다 나는 해결책을 우연히 발견했다 - WdStoryType::wdFootnotesStory
. 제가 누락 한 것은 클래스 한정어 참조입니다.
이것은 엠바 카데로 관련 사항이 아닙니다. VBA에서 거의 고통 스럽습니다! [이 MVP 기사] (http://word.mvps.org/faqs/customization/ReplaceAnywhere.htm)를 참조하십시오. (추신 - 사이트에 오신 것을 환영합니다!) – cxw
많은 감사와 환영합니다 CXWfor. 나는 그 기사를 가지고 있으며 나는 약간의 여정이 될 것을 감사한다. 내 진짜 질문은 atm 것 같아요 - 엠바 카데로의 C++에서 WordApplication1-> ActiveDocument-> StoryRanges-> Item() 호출의 일부로 WdStoryType 인덱스 매개 변수를 전달하려면 어떻게해야합니까? OleVariant에 만족하지 않습니다. OLE 호출에서 매개 변수를 전달하는 방법을 완전히 알지 못합니다. – DMG
이것은 초기 바인딩이며 WdStoryType은 Word_2K.h에 선언 된 열거 형입니다. 지금은 값 wdFootnotesStory = 2를 전달하려고합니다. OleVariant 래퍼를 사용하여 많은 변형을 시도했지만 작동시키지 못했습니다. OLE 호출에서 enum 매개 변수를 전달하는 방법을 분명히 알지 못합니다. 건배. – DMG