MW211 EXIT

devlog
jQuery/非同期「$.when()」の中でループ
2022年03月16日
以下のようなHTMLタグがあり(ま、どんなんでもいいのだが)
┌──────────────────────────────────────┐
│<div id="i1"></div>                                                         │
│<div id="i2"></div>                                                         │
│<div id="i3"></div>                                                         │
└──────────────────────────────────────┘

以下のような関数にてアニメーションをランダムに完了させる
┌──────────────────────────────────────┐
│function test(i) {                                                          │
│    let d = new $.Deferred;                                                 │
│    $('#i' + i).animate(                                                    │
│        {'display' :'block'},                                               │
│        1000 + Math.floor(Math.random() * (250 + 1)),                       │
│        'swing',                                                            │
│        function() {                                                        │
│            console.log($(this).text());                                    │
│            d.resolve();                                                    │
│        }                                                                   │
│    );                                                                      │
│    return d.promise();                                                     │
│}                                                                           │
└──────────────────────────────────────┘

んで、以下のように非同期で並列処理を行い、
全部完了したら「完了」をコンソールログに出力する
┌──────────────────────────────────────┐
│$(function() {                                                              │
│    $.when(                                                                 │
│        test(1),                                                            │
│        test(2),                                                            │
│        test(3)                                                             │
│    )                                                                       │
│    .done(function() {                                                      │
│        console.log('完了');                                                │
│    })                                                                      │
│    .fail(function() {                                                      │
│        console.log('失敗');                                                │
│    });                                                                     │
│});                                                                         │
└──────────────────────────────────────┘
みたいなのは上記でできた。

さて、「$.when()」の中にベタ書きというのはこの場合はちょっといただけない。
「$.when()」の中で、ループさせることはできないか?(できないけど)

ということで、ループを用いる方法は以下の通り。
┌──────────────────────────────────────┐
│$(function() {                                                              │
│    let ary = [];                                                           │
│    for (let i = 1; i <= 3; i++) {                                          │
│        ary.push(test(i));                                                  │
│    }                                                                       │
│    $.when.apply(null, ary)                                                 │
│    .done(function() {                                                      │
│        console.log('完了');                                                │
│    })                                                                      │
│    .fail(function() {                                                      │
│        console.log('失敗');                                                │
│    });                                                                     │
│});                                                                         │
└──────────────────────────────────────┘
一回配列にぶちこめばよい。
但し、その配列を「$.when()」の中に直接ぶちこむと
「.done()」とかが効かなくなるので「.apply()」をかますのがミソ。
分類:jQuery
jQuery/値変更でイベント発動
2022年03月04日
以下のようにチェックボックスのイベントを設定し
チェックボックスの値を変更した(チェックを入れた)場合
画面からチェックを入れた時は発動するイベントが発動せずスルーされてしまう。
┌──────────────────────────────────────┐
│$(function() {                                                              │
│    $(':checkbox').on('change', function() {                                │
│        alert('イベント発動!');                                            │
│    });                                                                     │
│    $(':checkbox').prop('checked', true);                                   │
│});                                                                         │
└──────────────────────────────────────┘

これを発動させるようにするには「.change()」メソッドをつけて
イベントを能動的に実行してあげればよい。
┌──────────────────────────────────────┐
│$(function() {                                                              │
│    $(':checkbox').on('change', function() {                                │
│        alert('イベント発動!');                                            │
│    });                                                                     │
│    $(':checkbox').prop('checked', true).change();                          │
│});                                                                         │
└──────────────────────────────────────┘
分類:jQuery
MSSQL/(年と)週番号から週の開始日を求める
2022年02月24日
┌──────────────────────────────────────┐
│SELECT DATEADD([week],                                                      │
│               週番号 - 1,                                                  │
│               DATEADD([dd],                                                │
│                       1 - DATEPART([dw], DATEFROMPARTS(年, 1, 1)),         │
│                       DATEFROMPARTS(年, 1, 1))) AS [週頭日]                │
└──────────────────────────────────────┘
もっといい方法はないものか?
分類:MSSQL
ExcelVBA/シートのグループごと集計
2022年01月20日
A列とB列が複合キーでC列の値を集計したい場合のマクロ。
┌──────────────────────────────────────┐
│Option Explicit                                                             │
├──────────────────────────────────────┤
│Public Sub 集計()                                                           │
│    Application.ScreenUpdating = False                                      │
│    Dim yMax As Long, y As Long, yKey As Long                               │
│    With ThisWorkbook.Worksheets("対象名")                                  │
│        Call ソート                                                         │
│        yMax = .UsedRange.Rows(.UsedRange.Rows.Count).Row                   │
│        y = 1                                                               │
│        Do While y <= yMax                                                  │
│            yKey = y                                                        │
│            Do                                                              │
│                If y <> yKey Then                                           │
│                    .Cells(yKey, 3).Value = .Cells(yKey, 3).Value _         │
│                                          + .Cells(y, 3).Value              │
│                    .Rows(y).ClearContents                                  │
│                End If                                                      │
│                y = y + 1                                                   │
│            Loop While y <= .Rows.Count _                                   │
│                And .Cells(y, 1).Value = .Cells(yKey, 1).Value _            │
│                And .Cells(y, 2).Value = .Cells(yKey, 2).Value              │
│        Loop                                                                │
│        Call ソート                                                         │
│    End With                                                                │
│    Application.ScreenUpdating = True                                       │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Private Sub ソート()                                                        │
│    With ThisWorkbook.Worksheets("対象名")                                  │
│        With .Sort                                                          │
│            With .SortFields                                                │
│                .Clear                                                      │
│                .Add Key:=ThisWorkbook.Worksheets("対象名").Columns(1), _   │
│                     SortOn:=xlSortOnValues, _                              │
│                     Order:=xlAscending, _                                  │
│                     DataOption:=xlSortNormal                               │
│                .Add Key:=ThisWorkbook.Worksheets("対象名").Columns(2), _   │
│                     SortOn:=xlSortOnValues, _                              │
│                     Order:=xlAscending, _                                  │
│                     DataOption:=xlSortNormal                               │
│            End With                                                        │
│            .SetRange ThisWorkbook.Worksheets("対象名").Cells               │
│            .Header = xlYes                                                 │
│            .MatchCase = True                                               │
│            .Orientation = xlTopToBottom                                    │
│            .SortMethod = xlPinYin                                          │
│            .Apply                                                          │
│        End With                                                            │
│    End With                                                                │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
MSSQL/マトリクス月間表
2021年11月10日
┌──────────────────────────────────────┐
│GO                                                                          │
│    DECLARE @引数年 [int];  SET @引数年 = 2021;                             │
│    DECLARE @引数月 [int];  SET @引数月 = 11;                               │
│    -- ---------------------------------------------------------------------│
│    SET NOCOUNT ON;--EXECUTEによる参照の場合はなくても大丈夫そうだが念のため│
│    DECLARE @sql    [nvarchar](max);                                        │
│    -- ---------------------------------------------------------------------│
│    --   列(@テーブル変数)                                                  │
│    -- ---------------------------------------------------------------------│
│    DECLARE @列 table (                                                     │
│        [日付]  [date]  NOT NULL,                                           │
│        PRIMARY KEY (                                                       │
│            [日付]  ASC                                                     │
│        )                                                                   │
│    );                                                                      │
│    WITH [カレンダM] AS (                                                  │
│             SELECT DATEFROMPARTS(@引数年, @引数月, 1) AS [日付]            │
│             UNION ALL                                                      │
│             SELECT DATEADD(dd, 1, [日付])             AS [日付]            │
│                 FROM [カレンダM]                                          │
│                 WHERE YEAR(DATEADD(dd, 1, [日付]))  = @引数年              │
│                   AND MONTH(DATEADD(dd, 1, [日付])) = @引数月              │
│         )                                                                  │
│    INSERT INTO @列                                                         │
│        SELECT [日付]                                                       │
│            FROM [カレンダM];                                              │
│    -- ---------------------------------------------------------------------│
│    --   行(#一時テーブル)                                                  │
│    -- ---------------------------------------------------------------------│
│    CREATE TABLE #行 (                                                      │
│        [キー]  [int]   NOT NULL,                                           │
│        PRIMARY KEY (                                                       │
│            [キー]  ASC                                                     │
│        )                                                                   │
│    );                                                                      │
│    INSERT INTO #行                                                         │
│        SELECT DISTINCT [キー]                                              │
│            FROM 入力データ                                                 │
│            WHERE YEAR([日付])  = @引数年                                   │
│              AND MONTH([日付]) = @引数月;                                  │
│    -- ---------------------------------------------------------------------│
│    --   行列(#一時テーブル)                                                │
│    -- ---------------------------------------------------------------------│
│    CREATE TABLE #行列 (                                                    │
│        [キー]  [int]   NOT NULL,                                           │
│        [日付]  [date]  NOT NULL,                                           │
│        [値]    [int]   NULL,                                               │
│        PRIMARY KEY (                                                       │
│            [キー]  ASC,                                                    │
│            [日付]  ASC                                                     │
│        )                                                                   │
│    );                                                                      │
│    INSERT INTO #行列                                                       │
│        SELECT [キー],                                                      │
│               [日付],                                                      │
│               SUM([値]) AS [値]                                            │
│            FROM 入力データ                                                 │
│            WHERE YEAR([日付])  = @引数年                                   │
│              AND MONTH([日付]) = @引数月                                   │
│            GROUP BY [キー],                                                │
│                     [日付];                                                │
│    -- ---------------------------------------------------------------------│
│    --   明細                                                               │
│    -- ---------------------------------------------------------------------│
│    SELECT @sql = ISNULL(@sql + ',','')                                     │
│                + '(SELECT COUNT(*)'                                        │
│                + '     FROM #行列'                                         │
│                + '     WHERE #行列.[キー] = #行.[キー]'                    │
│                + '       AND #行列.[日付] = '                              │
│                          + CHAR(39) + CONVERT([varchar], [日付]) + CHAR(39)│
│                + ') AS [' + FORMAT(DAY([日付]), '00') + ']'                │
│        FROM @列                                                            │
│        ORDER BY [日付] ASC;                                                │
│    SET @sql = 'SELECT #行.[キー],'                                         │
│             + @sql                                                         │
│             + '    FROM #行'                                               │
│             + '    ORDER BY #行.[キー] ASC;';                              │
│    EXECUTE (@sql);                                                         │
│    -- ---------------------------------------------------------------------│
│    --   一時テーブルの削除                                                 │
│    -- ---------------------------------------------------------------------│
│    DROP TABLE #行列;                                                       │
│    DROP TABLE #行;                                                         │
│GO                                                                          │
└──────────────────────────────────────┘
分類:MSSQL
Excel/図形のサイズ変更
2021年11月09日
図形の境界線をつかんでサイズを変更する際に、
以下のキーを複合するといい感じにサイズが調整される。
┌──────┬──────────────────┐
│Alt         │セルの境界線に合わせてサイズ変更    │
├──────┼──────────────────┤
│Ctrl        │中心固定でサイズ変更                │
├──────┼──────────────────┤
│Shift       │縦横比率固定でサイズ変更            │
├──────┼──────────────────┤
│Ctrl+Shift │中心固定かつ縦横比率固定でサイズ変更│
└──────┴──────────────────┘
分類:Excel
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
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 … 156 次へ