MW211 EXIT

devlog
PDO/MSSQLストアドプロシージャの戻り値取得
2021年10月29日
┌──────────────────────────────────────┐
│$sth = $PDO->prepare(SQL文);                                                │
│$sth->execute();                                                            │
│$row = $sth->fetch(PDO::FETCH_ASSOC);                                       │
│echo $row['戻り値'];                                                        │
└──────────────────────────────────────┘
上記のような感じでストアドプロシージャ(SQL文)を実行した後
その戻り値を取得したい場合には、以下のようなSQL文とすればよい。
┌──────────────────────────────────────┐
│SET NOCOUNT ON;                                                             │
│DECLARE @戻り値 [int];                                                      │
│EXEC @戻り値 = [DB].[dbo].[ストアドプロシージャ];                           │
│SELECT '戻り値' = @戻り値;                                                  │
└──────────────────────────────────────┘
件数出力(*1)が雑音となるので「SET NOCOUNT ON;」が必要だ。
*1:例えば「(1 行処理されました)」など

雑音があると「The active result for the query contains no fields.」エラーに。

但し、警告文(*2)が出る場合には、そちらも雑音となるので
「SET ANSI_WARNINGS OFF;」も必要だ。
*2:例えば「警告: NULL 値は集計またはその他の SET 演算で削除されました。」など
┌──────────────────────────────────────┐
│SET NOCOUNT ON;                                                             │
│SET ANSI_WARNINGS OFF;                                                      │
│DECLARE @戻り値 [int];                                                      │
│EXEC @戻り値 = [DB].[dbo].[ストアドプロシージャ];                           │
│SELECT '戻り値' = @戻り値;                                                  │
└──────────────────────────────────────┘
分類:PDO
ExcelVBA/図形をヘッダに
2021年10月24日
印刷範囲の大きさに応じて、印刷倍率を変更する設定とした場合
当然だが、シート上の図形もその影響を受けて縮小される。

これを避けるために、ヘッダ(もしくはフッタ)に置いて
拡大縮小の影響を受けないようにしたらよいのではないか?

と考えてが、ヘッダに単なる画像ファイルを出力するのは簡単でも
図形を出力するのは難儀を極める。

まず、そのままでは無理なようだ。

ということで、図形を画像ファイルとして一旦エクスポートして
それを参照する形で対処してみた。(画像ファイルの削除はご自分で)

なお、図形を画像ファイルとして出力するにもそのままでは無理で
チャートを作成し、そこに貼り付けて、出力する形をとらざろうえないようだ。
┌──────────────────────────────────────┐
│Dim 図形 As Shape, チャート As Object                                       │
│With ActiveSheet                                                            │
│    '-----------------------------------------------------------------------│
│    '  図形を画像ファイルとしてエクスポート                                 │
│    '-----------------------------------------------------------------------│
│    Set 図形 = .Shapes(図形名)                                              │
│    Set チャート = .ChartObjects.Add(0, 0, 図形.Width, 図形.Height)         │
│    図形.CopyPicture Format:=xlBitmap                                       │
│    With チャート                                                           │
│        .Select                                                             │
│        .Chart.Paste                                                        │
│        .Chart.Export Filename:=ThisWorkbook.Path & "\一時.jpg"             │
│        .Delete                                                             │
│    End With                                                                │
│    '-----------------------------------------------------------------------│
│    '  エクスポートした画像ファイルをヘッダに                               │
│    '-----------------------------------------------------------------------│
│    With .PageSetup                                                         │
│        .LeftHeaderPicture.Filename = ThisWorkbook.Path + "\一時.jpg"       │
│        Application.PrintCommunication = False  ' プリンタ設定開始(通信切断)│
│        ' 上余白                                                            │
│        .TopMargin = 図形.Height                                            │
│        ' 「&[図]」を表示                                                   │
│        .LeftHeader = "&G"                                                  │
│        ' 「ドキュメントに合わせて拡大/縮小」しない                         │
│        .ScaleWithDocHeaderFooter = False                                   │
│        Application.PrintCommunication = True   ' プリンタ設定終了(通信復旧)│
│    End With                                                                │
│    '-----------------------------------------------------------------------│
│End With                                                                    │
└──────────────────────────────────────┘
つまり、以下の課題を解決しないと実現できないという結構な難題だ。
(1) ヘッダに図形を出力したい
(2) そのためには、図形を画像ファイルにする必要がある
(3) そのためには、図形をチャートに貼り付ける必要がある
分類:ExcelVBA
PHP/MSSQLの#ローカル一時テーブル
2021年10月23日
PHPの(MSSQLのPDOの)既定では、MSSQLの#ローカル一時テーブルが使えない。

「PDO::SQLSRV_ATTR_DIRECT_QUERY」の設定を変えればつかえるようになる。
┌──────────────────────────────────────┐
│$conn = new PDO(~);                                                        │
│$conn->setAttribute(constant('PDO::SQLSRV_ATTR_DIRECT_QUERY'), TRUE);       │
└──────────────────────────────────────┘
どのような副作用があるのかよくわからない(けど目立った影響は見当たらない)。
分類:PHP
jQuery/データのインポート
2021年10月22日
以下のような感じで。

【HTML】
┌──────────────────────────────────────┐
│<form>                                                                      │
│  <input type="hidden" name="キー" value="upfile">                          │
│  <input type="file" name="upfile">                                         │
│  <input type="button" value="インポート">                                  │
│</form>                                                                     │
│<input type="text" id="file_name" readonly="readonly">                      │
└──────────────────────────────────────┘
  ※POST項目は、$.ajax()のdataではなく、form内のhiddenで定義

【jQuery(JavaScript)】
┌──────────────────────────────────────┐
│$('form :button').on('click', function() {                                  │
│    const formData = new FormData($('form').get(0));                        │
│    $.ajax({                                                                │
│            url         :URLを指定,                                         │
│            type        :'post',                                            │
│            data        :formData,                                          │
│            processData :false,            // 変換しない                    │
│            contentType :false,            // content-typeヘッダを送信しない│
│            cache       :false,            // キャッシュをクリア            │
│            dataType    :'json',                                            │
│        })                                                                  │
│        .done(function(data, status, xhr) {                                 │
│            alert('インポート成功');                                        │
│        })                                                                  │
│        .fail(function(xhr, status, error) {                                │
│            alert('エラー');                                                │
│        })                                                                  │
│        .always(function(data, status, xhr) {                               │
│            $('#file_name').val($('form :file').prop('files')[0].name);     │
│            $('form')[0].reset();                                           │
│        });                                                                 │
│    });                                                                     │
└──────────────────────────────────────┘
  ※ファイルの内容を変更してそのまま再インポートするとエラーとなるので
    インポート後に一旦クリアして回避(ファイル名の引き継ぎも)

【PHP】
┌──────────────────────────────────────┐
│$ファイル全文 = file_get_contents($_FILES[$_POST['キー']]['tmp_name']);     │
└──────────────────────────────────────┘
  ※CSVファイルやTSVファイルを全文取得して、後は配列に格納して処理
分類:jQuery
PHP配列/特定列の重複を抽出
2021年10月21日
┌──────────────────────────────────────┐
│$hash = [                                                                   │
│    ['id' => 'a', 'data' => 'x'],                                           │
│    ['id' => 'b', 'data' => 'y'],                                           │
│    ['id' => 'a', 'data' => 'z'],                                           │
│];                                                                          │
└──────────────────────────────────────┘
上記のような二次元連想配列があり、特定の列(今回は'id')が重複している場合
それを一次元配列に抽出する方法。

以下のような感じ
┌──────────────────────────────────────┐
│$duplicates = array_keys(                                                   │
│                  array_filter(                                             │
│                      array_count_values(                                   │
│                          array_column($hash, 'id')                         │
│                      ),                                                    │
│                      function($value) {return ($value > 1);}               │
│                  )                                                         │
│              );                                                            │
└──────────────────────────────────────┘
分類:PHP配列
PHP/起動時にtrack_errorsのエラー
2021年10月19日
┌──────────────────────────────────────┐
│Directive 'track_errors' is deprecated in Unknown on line 0                 │
└──────────────────────────────────────┘
PHP起動時に以下のエラーが出る場合…
PHP7.2以降では「track_errors」機能が非推奨となったためとのことで
┌──────────────────────────────────────┐
│track_errors = Off                                                          │
└──────────────────────────────────────┘
「php.ini」の指定で上記を「On」から「Off」にすれば解決する。

なお、「track_errors」機能の代わりに「error_get_last()」関数が
使えるようになったとのこと。
分類:PHP
PHP/SQLiteのDLLでエラー
2021年10月18日
┌──────────────────────────────────────┐
│extension=php_pdo_sqlite.dll                                                │
│extension=php_sqlite3.dll                                                   │
└──────────────────────────────────────┘
「PHP.ini」で上記を指定していて、実体もあるのに
起動時に以下のPHPエラー(警告)が出る場合…
┌──────────────────────────────────────┐
│PHP Startup: Unable to load dynamic library 'php_pdo_sqlite.dll' (tried: ~ │
│PHP Startup: Unable to load dynamic library 'php_sqlite3.dll' (tried: ~    │
└──────────────────────────────────────┘
Apacheの「httpd.conf」に以下(~は各自のパス)を追加したら解決した。
┌──────────────────────────────────────┐
│LoadFile "~\libsqlite3.dll"                                                │
└──────────────────────────────────────┘
「php_pdo_sqlite.dll」と「php_sqlite3.dll」の一部が
「libsqlite3.dll」になったらしく、こちらもインクスルードする必要があるらしい。
分類:PHP
ExcelVBA/ファイル・フォルダ選択
2021年10月05日
いろいろ方法があるのでまとめていきたいが、ひとまず一例。

【ファイル選択】
┌──────────────────────────────────────┐
│Dim ファイルパス As String                                                  │
│' 本ファイルのフォルダを既定に                                              │
│ChDir ThisWorkbook.Path                                                     │
│If Left(ThisWorkbook.Path, 1) <> Left(CurDir, 1) Then                       │
│    ChDrive Left(ThisWorkbook.Path, 1)                                      │
│End If                                                                      │
│' 選択ダイアログ表示                                                        │
│ファイルパス = Application.GetOpenFilename( _                               │
│    Title:="ファイルを選択してください。", _                                │
│    Filefilter:="Excelファイル,*.xlsm" _                                    │
│)                                                                           │
│If ファイルパス = "False" Then                                              │
│    MsgBox "キャンセル"                                                     │
│End If                                                                      │
└──────────────────────────────────────┘

【フォルダ選択】
┌──────────────────────────────────────┐
│Dim フォルダパス As String                                                  │
│With Application.FileDialog(msoFileDialogFolderPicker)                      │
│    .Title = "フォルダを選択してください。"                                 │
│    .InitialFileName = ThisWorkbook.Path & "\"                              │
│    If .Show Then                                                           │
│        フォルダパス = .SelectedItems(1)                                    │
│    End If                                                                  │
│End With                                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
複合キーでVLOOKUP(連想配列版)
2021年10月04日
一旦、連想配列にデータをぶちこんで、それで直接アクセスするやり方。
キーをタブ結合(タブじゃなくてもいいけど)で、一つにするのがポイント。
┌──────────────────────────────────────┐
│Dim yMax As Long, y As Long, 連想配列 As Object, キー As String             │
│Set 連想配列 = CreateObject("Scripting.Dictionary")                         │
├──────────────────────────────────────┤
│' 連想配列に格納                                                            │
│With 参照シート                                                             │
│    yMax = .UsedRange.Rows(.UsedRange.Rows.Count).Row                       │
│    For y = 2 To yMax                                                       │
│        キー = .Cells(y, Xキー1).Value & vbTab & .Cells(y, Xキー2).Value    │
│        If Not 連想配列.Exists(キー) Then                                   │
│            連想配列.Add キー, .Cells(y, Xバリュー).Value                   │
│        End If                                                              │
│    Next y                                                                  │
│End With                                                                    │
├──────────────────────────────────────┤
│' 連想配列を検索                                                            │
│キー = キー1 & vbTab & キー2                                                │
│If 連想配列.Exists(キー) Then                                               │
│    MsgBox 連想配列(キー)                                                   │
│End If                                                                      │
└──────────────────────────────────────┘
結構速いし、小難しい処理(該当なしで例外とか)がないのでいいかも。
分類:ExcelVBA
前へ 1 次へ