MW211 EXIT

devlog
ExcelVBA/コンボボックスの表示と値を別にする方法
2018年06月20日
┌─┬────┐
│ 1│織田信長│
├─┼────┤
│ 2│豊臣秀吉│
├─┼────┤
│ 3│徳川家康│
└─┴────┘
上記のようなテーブルを用意し、コンボボックス(プルダウンメニュー)を生成するが
画面上は右列(名前)だけしか表示せず、処理的には左列(ID)を扱いたい場合の設定方法。

プロパティを以下のように設定する。
  ┌──────────┬───────┬───┬─────────────┐
  │ComboBoxのプロパティ│ListFillRange │A1:B3 │リストの実体              │
  │                    ├───────┼───┼─────────────┤
  │                    │ColumnCount   │2     │2列有効                   │
  │                    ├───────┼───┼─────────────┤
  │                    │BoundColumn   │1     │(.Valueで)1列目の値を取得 │
  │                    ├───────┼───┼─────────────┤
  │                    │TextColumn    │2     │選択時に2列目の値を表示   │
  │                    ├───────┼───┼─────────────┤
  │                    │ListWidth     │0 pt  │1列目を非表示に           │
  └──────────┴───────┴───┴─────────────┘
そして、処理にて以下のように参照する。
    値を「ComboBox.Value」で取得
    (「ComboBox.List(ComboBox.ListIndex, 0)」でも取得可)
分類:ExcelVBA
ExcelVBA/(Outlookで)メール送信
2018年06月18日
ExcelVBAでOutlookを使ってメールを送信するやり方。
┌──────────────────────────────────────┐
│' 事前に「ツール>参照設定」で                                              │
│' 「Microsoft Outlook 14.0 Object Library」を追加しておく                   │
├──────────────────────────────────────┤
│' メールの生成                                                              │
│    Dim objOutlook As Outlook.Application                                   │
│    Dim objメール As Outlook.mailItem                                       │
│    Set objOutlook = CreateObject("Outlook.Application")                    │
│    Set objメール = objOutlook.CreateItem(olMailItem)                       │
│    objメール.BodyFormat = 1           ' プレーンテキスト                   │
│    objメール.To = "xxxx@xxxx.co.jp"   ' 宛先TO                             │
│    objメール.CC = "xxxx@xxxx.co.jp"   ' 宛先CC                             │
│    objメール.BCC = "xxxx@xxxx.co.jp"  ' 宛先BCC                            │
│    objメール.Subject = "件名"                                              │
│    objメール.Body = "本文"                                                 │
├──────────────────────────────────────┤
│' ファイルの添付                                                            │
│    Dim obj添付 As Outlook.Attachments                                      │
│    Set obj添付 = objメール.Attachments                                     │
│    obj添付.Add "C:\添付ファイル.txt"                                       │
├──────────────────────────────────────┤
│' メールの送信                                                              │
│''''objメール.Save      ' 下書き保存                                        │
│    objメール.Display   ' メーラ表示(送信ボタンを押させる)                  │
│''''objメール.Send      ' 送信                                              │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ScreenUpdatingの入れ子対策
2018年06月14日
┌─────────────────────────┐
│Application.ScreenUpdating = False                │
│┌───────────────────サブ関数┐│
││Application.ScreenUpdating = False            ││
││  :                                          ││
││Application.ScreenUpdating = True             ││
│└───────────────────────┘│
│Application.ScreenUpdating = True                 │
└─────────────────────────┘
Application.ScreenUpdatingが(意図せずして)入れ子になると
画面表示抑止の解除が早まってしまうので、入れ子内の方で工夫が必要
┌─────────────────────────┐
│Application.ScreenUpdating = False                │
│┌───────────────────サブ関数┐│
││Dim oldScreenUpdating As Boolean              ││
││oldScreenUpdating = Application.ScreenUpdating││
││If oldScreenUpdating Then                     ││
││    Application.ScreenUpdating = False        ││
││End If                                        ││
││  :                                          ││
││If oldScreenUpdating Then                     ││
││    Application.ScreenUpdating = True         ││
││End If                                        ││
│└───────────────────────┘│
│Application.ScreenUpdating = True                 │
└─────────────────────────┘
分類:ExcelVBA
設計/ダイアログのタイトル
2018年06月13日
ダイアログのタイトル凡例。(後は臨機応変に)
┌──┬───────────────────────────────────┐
│完了│処理の完了、処理完了                                                  │
├──┼───────────────────────────────────┤
│成功│                                                                      │
├──┼───────────────────────────────────┤
│結果│結果の表示                                                            │
├──┼───────────────────────────────────┤
│中止│処理の中止、処理中止、キャンセル                                      │
├──┼───────────────────────────────────┤
│0件│該当なし                                                              │
├──┼───────────────────────────────────┤
│失敗│処理失敗、エラー発生、エラー、例外発生                                │
├──┼───────────────────────────────────┤
│警告│注意                                                                  │
├──┼───────────────────────────────────┤
│確認│処理の確認、質問                                                      │
├──┼───────────────────────────────────┤
│選択│処理の選択、処理選択                                                  │
├──┼───────────────────────────────────┤
│入力│画面入力                                                              │
├──┼───────────────────────────────────┤
│案内│ご案内、ガイド、お知らせ                                              │
└──┴───────────────────────────────────┘
分類:設計
ExcelVBA/シートの型
2018年06月11日
┌──────────────────────────────────────┐
│Dim シート As Worksheet                                                     │
└──────────────────────────────────────┘
基本的にはWorksheet型。

但し、配下のオブジェクト(ボタン)などを操作する場合には
Object型にしないとエラーとなるので注意。
┌──────────────────────────────────────┐
│Dim シート As Object   ' シート上のオブジェクトを操作                       │
└──────────────────────────────────────┘
分類:ExcelVBA
HTML5/canvasで線を消す
2018年06月08日
線を引くcanvas処理。
┌──────────────────────────────────────┐
│コンテキスト.globalCompositeOperation = 'source-over';                      │
│コンテキスト.beginPath();                                                   │
│コンテキスト.moveTo(左, 上);                                                │
│コンテキスト.lineTo(右, 下);                                                │
│コンテキスト.closePath();                                                   │
│コンテキスト.strokeStyle = 色;                                              │
│コンテキスト.stroke();                                                      │
└──────────────────────────────────────┘
  ※左上が始点、右下が終点の場合(逆とかでもOK)

で、その線を消すcanvas処理。
┌──────────────────────────────────────┐
│コンテキスト.globalCompositeOperation = 'destination-out';                  │
│コンテキスト.beginPath();                                                   │
│コンテキスト.moveTo(左, 上);                                                │
│コンテキスト.lineTo(右, 下);                                                │
│コンテキスト.closePath();                                                   │
│コンテキスト.stroke();                                                      │
└──────────────────────────────────────┘
「.globalCompositeOperation」の指定を変えてあげる。
どちらかというと透明な線を上書する(下を潰す)ようなイメージか。

ただ、ちょっとずれて消す前の線が残ることもあるようだ。

確実なのは、以下のように線を引いた領域をまるごとクリアする方法のようだ。
┌──────────────────────────────────────┐
│コンテキスト.clearRect(左, 上, 右, 下);                                     │
└──────────────────────────────────────┘
もちろんこの方法だと、領域内の他の線も消えてしまうけどね。
(キャンバスを分けてレイヤー階層にするのがよいかも)
分類:HTML5+CSS3
PHP/CSVを七列ごとに改行(続き)
2018年06月07日
一列のCSVデータを七件ずつ改行するには?
┌───┬──────────────────────────────────┐
│置換前│1,2,3,4,5,6,7,8,9,10,11,12,13,14,15                                 │
├───┼──────────────────────────────────┤
│置換後│1,2,3,4,5,6,7                                                       │
│      │8,9,10,11,12,13,14                                                  │
│      │15                                                                  │
└───┴──────────────────────────────────┘

PHPでやってみたよ。
┌──────────────────────────────────────┐
│$csv = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15';                               │
│$offset = -1; $count = 0;                                                   │
│while (($offset = strpos($csv, ',', ++$offset)) !== FALSE && ++$count) {    │
│    if ($count % 7 === 0) {                                                 │
│        $csv = substr_replace($csv, "\r\n", $offset, 1);                    │
│    }                                                                       │
│}                                                                           │
│echo $csv;                                                                  │
└──────────────────────────────────────┘

テクニックに走った感じ(自分でも後でわからなくなりそう)なので、
ちょっとわかりやすくしてみた。
┌──────────────────────────────────────┐
│$csv = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15';                               │
│$count = 1;                                                                 │
│$offset = 0;                                                                │
│while (($offset = strpos($csv, ',', $offset)) !== FALSE) {                  │
│    if ($count % 7 === 0) {                                                 │
│        $csv = substr_replace($csv, "\r\n", $offset, 1);                    │
│    }                                                                       │
│    $count++;                                                               │
│    $offset++;                                                              │
│}                                                                           │
│echo $csv;                                                                  │
└──────────────────────────────────────┘
分類:PHP
PHP/CSVを七列ごとに改行
2018年06月06日
一列のCSVデータを七件ずつ改行するには?
┌───┬──────────────────────────────────┐
│置換前│1,2,3,4,5,6,7,8,9,10,11,12,13,14,15                                 │
├───┼──────────────────────────────────┤
│置換後│1,2,3,4,5,6,7                                                       │
│      │8,9,10,11,12,13,14                                                  │
│      │15                                                                  │
└───┴──────────────────────────────────┘

正規表現なら以下のような感じ。
┌───┬──────────────────────────────────┐
│置換前│(?<=([^,]*,){6}[^,]*),                                              │
├───┼──────────────────────────────────┤
│置換後│\t                                                                  │
└───┴──────────────────────────────────┘
でも、秀丸エディタではできたけど、PHP(preg)だとダメだった。
直前条件「(?<=)」が可変だと受け付けてくれないようだ。
他に方法を考えねば。
分類:PHP
ExcelVBA/VLOOKUPの数値と文字列
2018年06月04日
入力元が数値で文字列セルに出力した場合、
検索値が、文字列でも数値でも
WorksheetFunction.VLookup()で該当なしとなってしまった。

ひとまず、入力元の数値をCStr()で文字列に変換した上で
文字列セルに出力したところ
検索値が、文字列でも数値でも
WorksheetFunction.VLookup()で該当あるとなった。

どうも、セルの書式と実体に(数値と文字列で)相違があると
該当なしとなってしまうようだ。
分類:ExcelVBA
ExcelVBA/CSVファイル出力
2018年06月02日
出力ファイルの選択を含めたCSVファイル出力処理は以下のような感じ。
┌──────────────────────────────────────┐
│Dim メッセージ As String, yMax As Long, y As Long                           │
│Dim 出力先 As Variant, ファイル名 As String                                 │
├──────────────────────────────────────┤
│ファイル名 = "CSVファイル.csv"  ' 初期表示                                  │
│Do                                                                          │
│    出力先 = Application.GetSaveAsFilename( _                               │
│        InitialFileName:=ファイル名, _                                      │
│        FileFilter:="CSVファイル,*.csv" _                                   │
│    )                                                                       │
│    ' キャンセル                                                            │
│    If 出力先 = False Then                                                  │
│        MsgBox "キャンセルされました。", vbInformation, "処理中止"          │
│        Exit Sub                                                            │
│    End If                                                                  │
│    ' 新規追加                                                              │
│    If Dir(出力先) = "" Then                                                │
│        Exit Do                                                             │
│    End If                                                                  │
│    ' 上書の確認                                                            │
│    ファイル名 = Dir(出力先)                                                │
│    メッセージ = ファイル名 & " は既に存在します。" & vbCrLf _              │
│               & "上書きしますか?"                                         │
│    If MsgBox(メッセージ, vbYesNo + vbExclamation, "上書確認") = vbYes Then │
│        Exit Do                                                             │
│    End If                                                                  │
│Loop                                                                        │
├──────────────────────────────────────┤
│Open 出力先 For Output As #1                                                │
│With ActiveSheet                                                            │
│    yMax = .UsedRange.Rows(.UsedRange.Rows.Count).Row                       │
│    For y = 1 To yMax                                                       │
│        Print #1, _                                                         │
│              Join(WorksheetFunction.Index( _                               │
│                       Range(.Cells(y, 1), .Cells(y, 16)).Value, _          │
│                       1, _                                                 │
│                       0), _                                                │
│                   ",")                                                     │
│    Next y                                                                  │
│End With                                                                    │
│Close #1                                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
前へ 1 2 3 次へ