MW211 EXIT

devlog
Excel/数式で「0」が表示される問題対策
2021年11月08日
空欄セルを数式で指定すると「0」が表示される問題。
┌─┬──┬──┐  ┌─┬──┬──┐
│  │ A  │ B  │  │  │ A  │ B  │
├─┼──┼──┤→├─┼──┼──┤
│ 1│    │=A1 │  │ 1│    │   0│
└─┴──┴──┘  └─┴──┴──┘
解決方法は以下の通り。

(1) B1の書式が文字列の場合  →「0」と表示されてしまう
  ┌──┬───┐
  │数式│=A1&""│
  └──┴───┘
(2) B1の書式が数値の場合  →「0」と表示されてしまう
  ┌────────┬─┐
  │書式のユーザ定義│# │
  └────────┴─┘
  これだと数値「0」が表示できなくなるが、それが嫌なら(1)+右寄せか。

(3) B1の書式が日付の場合  →「1900/1/0」と表示されてしまう
  ┌────────┬──────┐
  │書式のユーザ定義│yyyy/m/d;;; │
  └────────┴──────┘
  日付の場合、(1)だと「2021/11/8」→「44508」のように
  シリアル値表示になってしまう。
  よって、日付については書式で回避するのがよいだろう。
  ちなみに「;」が3つ並んでいて、4つのブロックに分かれているが
  それぞれ以下の条件の場合という意味になる
    (左から1番目)正数の場合  →唯一表示する
    (左から2番目)負数の場合
    (左から3番目)ゼロの場合  →空欄なので「0」を抑止している
    (左から4番目)文字列の場合
分類:Excel
PDO/続・MSSQLストアドプロシージャの戻り値取得
2021年11月01日
「警告: NULL 値は集計またはその他の SET 演算で削除されました。」が出ることにより
戻り値が取得できない問題についての解決策を考えた。

(案1)「SET ANSI_WARNINGS OFF;」で警告を無視する
  手っ取り早い方法だ。
  ただ、副作用が気になる。(例えば除数0エラーが検出できないとか)

(案2)「SUM(ISNULL(列, 0))」でNULLを0にして集計する
  確実な方法だ。
  ただ、処理時間が気になる。
  ちなみに「ISNULL(SUM(列), 0)」では効果はない。
  なお、NULLの集まりなのでNULLとして認識したい場合は、この案は採用できない。

(案3)戻り値を別ルートで取得する
  プレースホルダのoutputみたいな項目を通じて取得できないものか
  …と思ったが、できなさそうなので断念。

ということで、ひとまず(案2)が妥当なのだろう。(急を要するなら(案1)だけど)

なお、以下で検証ができる。
┌──────────────────────────────────────┐
│SELECT SUM([値]) FROM (VALUES (0),(NULL)) AS [表]([値]);                    │
└──────────────────────────────────────┘
分類:PDO
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
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 … 156 次へ