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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C++

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

Q&A

解決済

1回答

2909閲覧

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

Reach

総合スコア733

C++

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

0グッド

0クリップ

投稿2018/07/17 04:33

編集2018/07/17 05:08

お世話になります

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());に 変えても 同様です

よろしく お願い致します

C++

1#include "stdafx.h" 2#include <windows.h> 3#include <Ole2.h> 4#include <atlbase.h> 5#include <atlstr.h> 6 7 8HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...) { 9 // Begin variable-argument list... 10 va_list marker; 11 va_start(marker, cArgs); 12 13 if (!pDisp) { 14 MessageBox(NULL, _T("NULL IDispatch passed to AutoWrap()"), _T("Error"), 0x10010); 15 _exit(0); 16 } 17 18 // Variables used... 19 DISPPARAMS dp = { NULL, NULL, 0, 0 }; 20 DISPID dispidNamed = DISPID_PROPERTYPUT; 21 DISPID dispID; 22 HRESULT hr; 23 TCHAR buf[200]; 24 char szName[200]; 25 26 27 // Convert down to ANSI 28 WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL); 29 30 // Get DISPID for name passed... 31 hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID); 32 if (FAILED(hr)) { 33 MessageBox(NULL, _T("Dispatch::GetIDsOfNames failed"), _T("AutoWrap()"), 0x10010); 34 _exit(0); 35 return hr; 36 } 37 38 // Allocate memory for arguments... 39 VARIANT *pArgs = new VARIANT[cArgs + 1]; 40 // Extract arguments... 41 for (int i = 0; i<cArgs; i++) { 42 pArgs[i] = va_arg(marker, VARIANT); 43 } 44 45 // Build DISPPARAMS 46 dp.cArgs = cArgs; 47 dp.rgvarg = pArgs; 48 49 // Handle special-case for property-puts! 50 if (autoType & DISPATCH_PROPERTYPUT) { 51 dp.cNamedArgs = 1; 52 dp.rgdispidNamedArgs = &dispidNamed; 53 } 54 55 // Make the call! 56 hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL); 57 if (FAILED(hr)) { 58 MessageBox(NULL, buf, _T("IDispatch::Invoke failed"), 0x10010); 59 _exit(0); 60 return hr; 61 } 62 // End variable-argument section... 63 va_end(marker); 64 65 delete[] pArgs; 66 67 return hr; 68} 69int main() { 70 71 IDispatch *m_pXlApp; 72 IDispatch *m_pXlBooks; 73 IDispatch *m_pXlBook; 74 IDispatch *m_pXlSheet; 75 IDispatch *m_pXlColumn; 76 IDispatch *m_pXlPageBreak; 77 78 79 CoInitialize(NULL); 80 81 // CLSID取得 82 CLSID clsid; 83 HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid); 84 if (FAILED(hr)) { 85 CoUninitialize(); 86 MessageBox(NULL, _T("CLSIDFromProgID() failed"), _T("Error"), MB_OK); 87 return 0; 88 } 89 90 // IDispatch取得 91 //IDispatch *m_pXlApp; 92 //*m_pXlApp; 93 hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&m_pXlApp); 94 if (FAILED(hr)) { 95 MessageBox(NULL, _T("CoCreateInstance() failed"), _T("Error"), MB_OK); 96 return 0; 97 } 98 99 100 { 101 VARIANT result; 102 VariantInit(&result); 103 AutoWrap(DISPATCH_PROPERTYGET, &result, m_pXlApp, L"Workbooks", 0); 104 m_pXlBooks = result.pdispVal; 105 } 106 107 108 { 109 CString FilePath = _T("S:\Test.xlsx"); 110 111 VARIANT parm; 112 VARIANT result; 113 parm.vt = VT_BSTR; 114 parm.bstrVal = ::SysAllocString(FilePath.AllocSysString()); 115 VariantInit(&result); 116 AutoWrap(DISPATCH_PROPERTYGET, &result, m_pXlBooks, L"Open", 1, parm); 117 m_pXlBook = result.pdispVal; 118 } 119 120 121 { 122 VARIANT result; 123 VariantInit(&result); 124 AutoWrap(DISPATCH_PROPERTYGET, &result, m_pXlApp, L"ActiveSheet", 0); 125 m_pXlSheet = result.pdispVal; 126 } 127 128 129 { 130 VARIANT result, parm1, parm2; 131 CString rangeStr = L"Before";; 132 CString rangeStr2 = L"ActiveCell"; 133 CString rangeStr3; 134 135 136 rangeStr3 = L"D:D"; 137 VARIANT parm; 138 parm.vt = VT_BSTR; 139 parm.bstrVal = ::SysAllocString(rangeStr3.AllocSysString()); 140 141 VariantInit(&result); 142 AutoWrap(DISPATCH_PROPERTYGET, &result, m_pXlSheet, L"Columns", 1, parm); 143 m_pXlColumn = result.pdispVal; 144 MessageBox(NULL, "OK-1", NULL, MB_OK); 145 146 AutoWrap(DISPATCH_METHOD, NULL, m_pXlColumn, L"Select", 0); 147 MessageBox(NULL, "OK-2", NULL, MB_OK); 148 149 VariantInit(&result); 150 AutoWrap(DISPATCH_PROPERTYGET, &result, m_pXlSheet, L"VPageBreaks", 0); 151 m_pXlPageBreak = result.pdispVal; 152 MessageBox(NULL, "OK-3", NULL, MB_OK); 153 154 155 parm1.bstrVal = ::SysAllocString(rangeStr.AllocSysString()); 156 parm1.vt = VT_BSTR; 157 158 parm2.bstrVal = ::SysAllocString(rangeStr2.AllocSysString()); 159 parm2.vt = VT_BSTR; 160 161 162 VariantInit(&result); 163 AutoWrap(DISPATCH_METHOD, &result, m_pXlPageBreak, L"Add", 2, parm2, parm1); 164 MessageBox(NULL, "OK-4", NULL, MB_OK); 165 166 } 167 168 169 AutoWrap(DISPATCH_PROPERTYGET, NULL, m_pXlBook, L"Save", 0); 170 171 AutoWrap(DISPATCH_METHOD, NULL, m_pXlApp, L"Quit", 0); 172 173 174 m_pXlBook->Release(); 175 m_pXlBooks->Release(); 176 m_pXlApp->Release(); 177 178 m_pXlSheet->Release(); 179 m_pXlColumn->Release(); 180 m_pXlPageBreak->Release(); 181 182 183 CoUninitialize(); 184 185 return 0; 186}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決いたしました

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

C++

1{ 2 VARIANT result, parm1, parm2; 3 CString rangeStr = L"Before";; 4 CString rangeStr2 = L"ActiveCell"; 5 CString rangeStr3; 6 7 8 rangeStr3 = L"D:D"; 9 VARIANT parm; 10 VARIANT var; 11 parm.vt = VT_BSTR; 12 parm.bstrVal = ::SysAllocString(rangeStr3.AllocSysString()); 13 14 VariantInit(&result); 15 AutoWrap(DISPATCH_PROPERTYGET, &result, m_pXlSheet, L"Columns", 1, parm); 16 m_pXlColumn = result.pdispVal; 17 18 19 var.vt = VT_DISPATCH; 20 var.pdispVal = result.pdispVal; 21 22 MessageBox(NULL, "OK-1", NULL, MB_OK); 23 24 AutoWrap(DISPATCH_METHOD, NULL, m_pXlColumn, L"Select", 0); 25 MessageBox(NULL, "OK-2", NULL, MB_OK); 26 27 VariantInit(&result); 28 AutoWrap(DISPATCH_PROPERTYGET, &result, m_pXlSheet, L"VPageBreaks", 0); 29 m_pXlPageBreak = result.pdispVal; 30 MessageBox(NULL, "OK-3", NULL, MB_OK); 31 32 33 34 35 VariantInit(&result); 36 AutoWrap(DISPATCH_METHOD, NULL, m_pXlPageBreak, L"Add", 1 ,var); 37 MessageBox(NULL, "OK-4", NULL, MB_OK); 38 39 } 40

投稿2018/07/17 06:33

Reach

総合スコア733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問