I'm using this for fill a doc (and save or print):
void __fastcall TfClientes::bCbvClick(TObject *Sender)
{
String sFic = xAp.cPB + "\\CARTBV_" + DigitLg(lsLg->Text) + ".doc";
if (MiraFile(sFic)) {
AvisaW(this, "Generando e impriendo carta ...");
CreaDOC(sFic, 1);
AvisaW(this, "");
} else
SBox("No se encuentra plantilla: " + sFic);
}
//---------------------------------------------------------------------------
void __fastcall TfClientes::CreaDOC(String cF, int nM)
{
Variant vWord, vDocumentos, vDocumento, vSeleccion, vBuscar;
//--- Abre Word
vWord = CreateOleObject("Word.Application");
//--- Abre el documento que usaremos como plantilla
vDocumentos = vWord.OlePropertyGet("Documents" );
// Documento // Confirmar conversiones
vDocumento = vDocumentos.OleFunction("Open", cF.c_str(), false, true, false, "" );
// Modo de solo lectura, // Añadir a ficheros recientes // Clave del documento
cF = IntToStr(xCF.nFd) + ".doc";
// al final. - vWord.OlePropertySet("Visible", true);
//--- Selecciona todo el documento para reemplazar
vSeleccion = vWord.OlePropertyGet("Selection");
//--- esto inserta texto- en word: Insertar/Marcador...
//vSeleccion.OleProcedure("Goto", -1, VT_EMPTY, VT_EMPTY, "nomape");
//vSeleccion.OleProcedure("TypeText", Une2Cd(xCF.cN, xCF.cA).c_str());
//vSeleccion.OleProcedure("Goto", -1, VT_EMPTY, VT_EMPTY, "direc");
//vSeleccion.OleProcedure("TypeText", xCF.c3.c_str());
//vSeleccion.OleProcedure("Goto", -1, VT_EMPTY, VT_EMPTY, "cppobl");
//vSeleccion.OleProcedure("TypeText", Une2Cd(xCF.c4, xCF.c5).c_str());
//vSeleccion.OleProcedure("Goto", -1, VT_EMPTY, VT_EMPTY, "prov");
//vSeleccion.OleProcedure("TypeText", xCF.c6.c_str());
//vSeleccion.OleProcedure("Goto", -1, VT_EMPTY, VT_EMPTY, "pais");
//vSeleccion.OleProcedure("TypeText", xCF.c7.c_str());
//-------------------------------------------------
vSeleccion.OlePropertyGet("Range").OleProcedure("SetRange", 0, 0);
vBuscar = vSeleccion.OlePropertyGet("Find");
vBuscar.OleProcedure("ClearFormatting");
vBuscar.OlePropertyGet("Replacement").OleProcedure("ClearFormatting");
if (nM>0) {
vBuscar.OleProcedure("Execute", "{nmapel}",
VT_EMPTY, VT_EMPTY, VT_EMPTY, VT_EMPTY, VT_EMPTY,
true, VT_EMPTY, VT_EMPTY, Une2Cd(xCF.cN, xCF.cA).c_str(), 2);
vBuscar.OleProcedure("Execute", "{direc}",
VT_EMPTY,VT_EMPTY, VT_EMPTY, VT_EMPTY, VT_EMPTY,
true, VT_EMPTY, VT_EMPTY, xCF.c3.c_str(), 2);
vBuscar.OleProcedure("Execute", "{cppobl}",
VT_EMPTY,VT_EMPTY, VT_EMPTY, VT_EMPTY, VT_EMPTY,
true, VT_EMPTY, VT_EMPTY, Une2Cd(xCF.c4, xCF.c5).c_str(), 2);
vBuscar.OleProcedure("Execute", "{provi}",
VT_EMPTY,VT_EMPTY, VT_EMPTY, VT_EMPTY, VT_EMPTY,
true, VT_EMPTY, VT_EMPTY, xCF.c6.c_str(), 2);
vBuscar.OleProcedure("Execute", "{pais}",
VT_EMPTY,VT_EMPTY, VT_EMPTY, VT_EMPTY, VT_EMPTY,
true, VT_EMPTY, VT_EMPTY, xCF.c7.c_str(), 2);
// ----- ^^^ --- ok para sustituir
//--- salvamos automaticamente si procede y cerramos Word
cF = xAp.cPB + "\\CtBv" + cF;
vDocument

leProcedure( "SaveAs", cF.c_str() );
vDocument

leProcedure("PrintOut");
while (vWord.OlePropertyGet("BackgroundPrintingStatus")>0) {
::Sleep(390);
//Application->ProcessMessages();
}
//vWord.OlePropertySet("Visible", true); //aqui lo vemos para imprimir
}
else { //--- para email
vBuscar.OleProcedure("Execute", "{trat}",
VT_EMPTY, VT_EMPTY, VT_EMPTY, VT_EMPTY, VT_EMPTY,
true, VT_EMPTY, VT_EMPTY, xTr->Text.c_str(), 2);
vBuscar.OleProcedure("Execute", "{nmapel}",
VT_EMPTY, VT_EMPTY, VT_EMPTY, VT_EMPTY, VT_EMPTY,
true, VT_EMPTY, VT_EMPTY, Une2Cd(xCF.cN, xCF.cA).c_str(), 2);
xCl.cCF = xAp.cPB + "\\EInf" + cF; // para enganchar...
vDocument

leProcedure( "SaveAs", xCl.cCF.c_str() );
}
//cerramos todo.
vDocument

leProcedure("Close", 0xFFFFFFFF);
vWord.OleProcedure( "Quit" );
vWord = vDocumentos = vDocumento = vSeleccion = vBuscar = Unassigned;
Application->ProcessMessages();
}
//---------------------------------------------------------------------------