自分用のメモ
レコード保存
通常レコード移動で保存が行われるが、現在の行で上書き保存を行う。
DoCmd.RunCommand acCmdSaveRecord
Excel表をXML出力
Sub make_xml() Dim xdoc As New DOMDocument, xtree As IXMLDOMElement Dim PI As IXMLDOMProcessingInstruction Dim LOB As IXMLDOMElement Dim fld As IXMLDOMElement 'xml header Set PI = xdoc.createProcessingInstruction(“xml", “version=’1.0′ encoding=’UTF-8′ standalone=’yes’") Call xdoc.appendChild(PI) 'root tree Set xtree = xdoc.createElement(“all") xtree.Text = vbNewLine Call xdoc.appendChild(xtree) '横軸チェック x = 1 Do While Cells(1, x) <> “": x = x + 1: Loop x = x – 1 y = 2 '縦ループ Do While Cells(y, 1) <> “" '親 Set LOB = xdoc.createElement(“data") '横ループ For i = 1 To x '子1 Set fld = xdoc.createElement(Cells(1, i)) fld.Text = Cells(y, i) Call LOB.appendChild(fld) Call LOB.appendChild(xdoc.createTextNode(vbNewLine)) Next '親書き出し Call xtree.appendChild(LOB) y = y + 1 Loop 'xml保存 xdoc.Save (“c:\temp\swlist.xml") MsgBox “done" End Sub
ピボット内の上位フィルター&並び替え
Sub run() '引数:並べ替えのフィールド名、対象のシート名、Pivot実データの開始Y番号,TOP幾つまでを表示するか pivot_SORT_TOP "TITLE”, "Sheet4″, 5, 10 End Sub 'X軸は日付など、並び替え可能な項目であること Sub pivot_SORT_TOP(CMname As String, pivot_sheet As String, Y As Long, TOP As Integer) Dim X As Long, CH As String Sheets(pivot_sheet).Select On Error Resume Next '縦の項目を一度、全部表示にする For i = 1 To ActiveSheet.PivotTables(1).PivotFields(CMname).PivotItems.Count ActiveSheet.PivotTables(1).PivotFields(CMname).PivotItems(i).Visible = True Next 'Pivotの末列の座標を探す X = 2 Do While Cells(Y – 1, X) <> "”: X = X + 1: Loop X = X – 1 '横列の昇順並び替え Cells(Y – 1, 2).Select Selection.Sort Order1:=xlAscending, Type:=xlSortLabels, OrderCustom:=1, _ Orientation:=xlLeftToRight, SortMethod:=xlPinYin '並び替えたい列を選択 Cells(Y, X).Select 'Range(Chr(64 + X) & Y).Select 'X,Y座標をR1C1形式に変換 CH = "R” & Y & "C” & X '末列を降順でSORT Selection.Sort Key1:=CH, Order1:=xlDescending, Type:=xlSortValues, _ OrderCustom:=1, Orientation:=xlTopToBottom, SortMethod:=xlPinYin '表示項目がTOP指定より多い場合は、フィルター処理 If ActiveSheet.PivotTables(1).PivotFields(CMname).PivotItems.Count > TOP Then On Error Resume Next 'TOP以降は非表示する For i = TOP + 1 To ActiveSheet.PivotTables(1).PivotFields(CMname).PivotItems.Count ActiveSheet.PivotTables(1).PivotFields(CMname).PivotItems(i).Visible = False Next End If On Error GoTo 0 End Sub
タイマーにて自動呼出し処理
'タイマーを止める時に使う為、グローバル定義 Dim Next_timer As Date Sub Timer_set() '次回のタイマー呼び出しは1分後 Next_timer = Now + TimeValue("00:01:00") '1分後に呼び出す処理を登録 Application.OnTime Next_timer, "Timer_go" End Sub Sub Timer_go() '1分後に呼ばれる処理を記述 End Sub Sub Timer_stop() '登録済みのタイマーを止める処理(実行済みのタイマーなら意味なし) Application.OnTime Next_timer, Procedure:="Timer_go", Schedule:=False '注意:実行済みで呼ばれた場合エラーとなるため、on error resume nextなどが推奨 End Sub
シートの自動プロテクト/解除
Sub sheet_protect() 'sheetのプロテクト パスワード:ABC ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=“ABC" 'プロテクト解除 ActiveSheet.Unprotect (“ABC") End Sub
Excelセル検索
Sub find_cell() Dim Found As Object, strID As String 'sheet1内のA列を検索(完全一致) Set Found = Worksheets(“sheet1").Columns(“A:A").Find(strID, LookAt:=xlWhole) If Found Is Nothing Then MsgBox “「" & strID & “」は見つかりませんでした。" Else '見つかったセルの右隣(B=2列目)の値をゲット MsgBox Worksheets(“sheet1").Cells(Found.Row, 2) 'その値を現在、セルがある場所にセット Cells(ActiveCell.Row, ActiveCell.Column) = Worksheets(“sheet1").Cells(Found.Row, 2) End If End Sub
ビュークラスのメンバ関数
下記の順番で呼ばれる:
Create()
<Createメッセージ>
親ウィンドウを指定して子ウィンドウ(ビュー)作成
PreCreateWindow()
<PreCreateWindowメッセージ>
ウィンドウ(ビュー)の大きさなど設定
この後で、ビューが完成(外側のみ)
OnShowWindow()
<WM_SHOWWINDOWメッセージ>
ビューが表示(消れる)時
ビューの中のオブジェクト表示など
OnUpdate()
<OnUpdateメッセージ>
最初にドキュメントクラスのデータ読み込み
※データ変更時含
OnInitialUpdate()
<OnInitialUpdateメッセージ>
ビューの中の、オブジェクト作成
OnDraw()
<OnDrawメッセージ> SDIかMDI
ビューを再描画 ※OnPaint()が無い時
OnPaint()
<WM_PAINTメッセージ> ダイアログベース
ビューを再描画(最初の描画含)
ワイド文字列扱い
//ワイド文字列コピー WCHAR oomoto = L"大元"; WCHAR aite = [20]; wcscpy( aite, oomoto ); //______________________________________ //ワイド文字列 定義後の代入 WCHAR* hensu = new WCHAR[100]; wcsncpy_s( hensu, 100, L"", 0 ); // hensu = "" //______________________________________ //ワイド文字列 長さ WCHAR* SrcData; i = wcslen( SrcData ); //______________________________________ //ワイド文字列への末尾追加(連結) WCHAR* oomoto = new WCHAR[100]; WCHAR* tsuika = new WCHAR[2]; wcscat( oomoto, tsuika ); // oomoto = oomoto & tsuika //______________________________________ //ワイド文字列内検索(INSTR) WCHAR* oomoto = L"あいうえお"; int index; //先頭から検索 WCHAR ch = L‘う’; WCHAR* p = wcschr(oomoto, ch); index = p – oomoto; //indexには先頭をゼロとして、2が入る //pには「うえお」が入る //末尾から検索 WCHAR* p = wcsrchr(oomoto, L‘え’); index = p – oomoto; //indexには先頭をゼロとして、3が入る //pには「えお」が入る //______________________________________ //マルチバイト文字列からワイド文字列へのコピー char oomoto[] = "あいうえお"; WCHAR* aite = new WCHAR[20]; //まずは長さ調査 lens = mbstowcs( NULL, oomoto, 0 ); //長さ分をコピー lens = mbstowcs( aite, oomoto, lens + 1 );
基本
//WinMainでの引数(argc,argv) int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, LPSTR lpszCmdLine, int nCmdShow) { for(i=1; i < __argc; i++) printf(“%s\n", __argv[i]); } //______________________________________ //ロケーション設定 setlocale(LC_ALL, “Japanese_Japan.932");