質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

  • C++

    3795questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Excel

    1646questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

【C++】【Excel】改ページの挿入方法が知りたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 213

Beginner_ABC

score 4

お世話になります

C++で EXCELファイルに 改ページを設定したいのですが
思うようにいきません

C列に 改ページを 挿入しようとしているコードです
(マクロでは
Columns("D:D").Select
ActiveSheet.VPageBreaks.Add Before:=ActiveCell
)

MessageBox(NULL, "OK-3", NULL, MB_OK);
までは 実行できますが 
"Add"メソッドで エラーが 発生します

parm2.bstrVal = ::SysAllocString(rangeStr2.AllocSysString());を
parm2.bstrVal = ::SysAllocString(rangeStr3.AllocSysString());に 変えても 同様です

よろしく お願い致します

#include "stdafx.h"
#include <windows.h>
#include <Ole2.h>
#include <atlbase.h>
#include <atlstr.h>


HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...) {
    // Begin variable-argument list...
    va_list marker;
    va_start(marker, cArgs);

    if (!pDisp) {
        MessageBox(NULL, _T("NULL IDispatch passed to AutoWrap()"), _T("Error"), 0x10010);
        _exit(0);
    }

    // Variables used...
    DISPPARAMS dp = { NULL, NULL, 0, 0 };
    DISPID dispidNamed = DISPID_PROPERTYPUT;
    DISPID dispID;
    HRESULT hr;
    TCHAR buf[200];
    char szName[200];


    // Convert down to ANSI
    WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);

    // Get DISPID for name passed...
    hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
    if (FAILED(hr)) {
        MessageBox(NULL, _T("Dispatch::GetIDsOfNames failed"), _T("AutoWrap()"), 0x10010);
        _exit(0);
        return hr;
    }

    // Allocate memory for arguments...
    VARIANT *pArgs = new VARIANT[cArgs + 1];
    // Extract arguments...
    for (int i = 0; i<cArgs; i++) {
        pArgs[i] = va_arg(marker, VARIANT);
    }

    // Build DISPPARAMS
    dp.cArgs = cArgs;
    dp.rgvarg = pArgs;

    // Handle special-case for property-puts!
    if (autoType & DISPATCH_PROPERTYPUT) {
        dp.cNamedArgs = 1;
        dp.rgdispidNamedArgs = &dispidNamed;
    }

    // Make the call!
    hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL);
    if (FAILED(hr)) {
        MessageBox(NULL, buf, _T("IDispatch::Invoke failed"), 0x10010);
        _exit(0);
        return hr;
    }
    // End variable-argument section...
    va_end(marker);

    delete[] pArgs;

    return hr;
}
int main() {

    IDispatch *m_pXlApp;
    IDispatch *m_pXlBooks;
    IDispatch *m_pXlBook;
    IDispatch *m_pXlSheet;
    IDispatch *m_pXlColumn;
    IDispatch *m_pXlPageBreak;


    CoInitialize(NULL);

    // CLSID取得
    CLSID clsid;
    HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);
    if (FAILED(hr)) {
        CoUninitialize();
        MessageBox(NULL, _T("CLSIDFromProgID() failed"), _T("Error"), MB_OK);
        return 0;
    }

    // IDispatch取得
    //IDispatch *m_pXlApp;
    //*m_pXlApp;
    hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&m_pXlApp);
    if (FAILED(hr)) {
        MessageBox(NULL, _T("CoCreateInstance() failed"), _T("Error"), MB_OK);
        return 0;
    }


    {
        VARIANT result;
        VariantInit(&result);
        AutoWrap(DISPATCH_PROPERTYGET, &result, m_pXlApp, L"Workbooks", 0);
        m_pXlBooks = result.pdispVal;
    }


    {
        CString FilePath = _T("S:\\Test.xlsx");

        VARIANT parm;
        VARIANT result;
        parm.vt = VT_BSTR;
        parm.bstrVal = ::SysAllocString(FilePath.AllocSysString());
        VariantInit(&result);
        AutoWrap(DISPATCH_PROPERTYGET, &result, m_pXlBooks, L"Open", 1, parm);
        m_pXlBook = result.pdispVal;
    }


    {
        VARIANT result;
        VariantInit(&result);
        AutoWrap(DISPATCH_PROPERTYGET, &result, m_pXlApp, L"ActiveSheet", 0);
        m_pXlSheet = result.pdispVal;
    }


    {
        VARIANT result, parm1, parm2;
        CString rangeStr = L"Before";;
        CString rangeStr2 = L"ActiveCell";
        CString rangeStr3;


        rangeStr3 = L"D:D";
        VARIANT parm;
        parm.vt = VT_BSTR;
        parm.bstrVal = ::SysAllocString(rangeStr3.AllocSysString());

        VariantInit(&result);
        AutoWrap(DISPATCH_PROPERTYGET, &result, m_pXlSheet, L"Columns", 1, parm);
        m_pXlColumn = result.pdispVal;
        MessageBox(NULL, "OK-1", NULL, MB_OK);

        AutoWrap(DISPATCH_METHOD, NULL, m_pXlColumn, L"Select", 0);
        MessageBox(NULL, "OK-2", NULL, MB_OK);

        VariantInit(&result);
        AutoWrap(DISPATCH_PROPERTYGET, &result, m_pXlSheet, L"VPageBreaks", 0);
        m_pXlPageBreak = result.pdispVal;
        MessageBox(NULL, "OK-3", NULL, MB_OK);


        parm1.bstrVal = ::SysAllocString(rangeStr.AllocSysString());
        parm1.vt = VT_BSTR;

        parm2.bstrVal = ::SysAllocString(rangeStr2.AllocSysString());
        parm2.vt = VT_BSTR;


        VariantInit(&result);
        AutoWrap(DISPATCH_METHOD, &result, m_pXlPageBreak, L"Add", 2, parm2, parm1);
        MessageBox(NULL, "OK-4", NULL, MB_OK);

    }


    AutoWrap(DISPATCH_PROPERTYGET, NULL, m_pXlBook, L"Save", 0);

    AutoWrap(DISPATCH_METHOD, NULL, m_pXlApp, L"Quit", 0);


    m_pXlBook->Release();
    m_pXlBooks->Release();
    m_pXlApp->Release();

    m_pXlSheet->Release();
    m_pXlColumn->Release();
    m_pXlPageBreak->Release();


    CoUninitialize();

    return 0;
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

自己解決いたしました

* 印刷領域と交差しない改ページを追加すると、新しく追加されたVPageBreakオブジェクトは、印刷領域のVPageBreaksコレクションには表示されません。印刷領域のサイズを変更または再定義すると、コレクションの内容が変わることがあります。(Microsoft サイトより)

{
        VARIANT result, parm1, parm2;
        CString rangeStr = L"Before";;
        CString rangeStr2 = L"ActiveCell";
        CString rangeStr3;


        rangeStr3 = L"D:D";
        VARIANT parm;
        VARIANT var;
        parm.vt = VT_BSTR;
        parm.bstrVal = ::SysAllocString(rangeStr3.AllocSysString());

        VariantInit(&result);
        AutoWrap(DISPATCH_PROPERTYGET, &result, m_pXlSheet, L"Columns", 1, parm);
        m_pXlColumn = result.pdispVal;


        var.vt = VT_DISPATCH;
        var.pdispVal = result.pdispVal;

        MessageBox(NULL, "OK-1", NULL, MB_OK);

        AutoWrap(DISPATCH_METHOD, NULL, m_pXlColumn, L"Select", 0);
        MessageBox(NULL, "OK-2", NULL, MB_OK);

        VariantInit(&result);
        AutoWrap(DISPATCH_PROPERTYGET, &result, m_pXlSheet, L"VPageBreaks", 0);
        m_pXlPageBreak = result.pdispVal;
        MessageBox(NULL, "OK-3", NULL, MB_OK);




        VariantInit(&result);
        AutoWrap(DISPATCH_METHOD, NULL, m_pXlPageBreak, L"Add", 1 ,var);
        MessageBox(NULL, "OK-4", NULL, MB_OK);

    }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C++

    3795questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Excel

    1646questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。