MW211 EXIT

devlog
秀丸/ExcelのRange型からCells型への変換
2019年09月06日
┌──┬───────────────────────────────────┐
│検索│Range\("([A-Z]+)(\d+):([A-Z]+)(\d+)"\)                                │
├──┼───────────────────────────────────┤
│置換│Range(Cells(\2, \1), Cells(\4, \3))                                   │
└──┴───────────────────────────────────┘
「Range("A2:C4")」→「Range(Cells(2, A), Cells(4, C))」

ここまではできた

ABC…を123…に変換するところで行き詰ったので、これ以上はVBAでやることにした。
「変換関数(\1)」みたいなことができりゃいいんだけどね
分類:秀丸エディタ
ExcelVBA/任意の文字列たちを結合するが空文字は除く
2019年08月29日
例えば任意の複数の文字列を区切り文字で結合したい場合に
以下のようにすればよい。
┌──────────────────────────────────────┐
│CSV結果 = Join(Array(文字列1, 文字列2, 文字列3), ",")                       │
└──────────────────────────────────────┘
非常にお手軽なのだが難点があって、文字列が空文字の場合にも
「,,」みたいに結合されてしまう。(CSV的にはOKかもしれないが)

これを簡単に解決する方法はないようなので、関数を作った。
┌──────────────────────────────────────┐
│CSV結果 = 引数をCSV結合(文字列1, 文字列2, 文字列3)                          │
├──────────────────────────────────────┤
│Public Function 引数をCSV結合(ParamArray 配列()) As String                  │
│    Dim 結果 As Variant, 値 As Variant                                      │
│    For Each 値 In 配列                                                     │
│        If 値 <> "" Then                                                    │
│            Call 配列末尾追加(結果, 値)                                     │
│        End If                                                              │
│    Next 値                                                                 │
│    If IsArray(結果) Then                                                   │
│        引数をCSV結合 = Join(結果, ",")                                     │
│    Else                                                                    │
│        引数をCSV結合 = ""                                                  │
│    End If                                                                  │
│End Function                                                                │
├──────────────────────────────────────┤
│Private Sub 配列末尾追加(ByRef 配列 As Variant, _                           │
│                         ByVal 追加要素 As Variant)                         │
│    On Error GoTo l_Catch                                                   │
│    If IsArray(配列) Then                                                   │
│        ReDim Preserve 配列(UBound(配列) + 1)                               │
│    Else                                                                    │
│        ReDim 配列(0)                                                       │
│    End If                                                                  │
│    配列(UBound(配列)) = 追加要素                                           │
│    Exit Sub                                                                │
│l_Catch:                                                                    │
│    ReDim 配列(0)                                                           │
│    配列(UBound(配列)) = 追加要素                                           │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
JavaScript/オブジェクト指向
2019年08月22日
連想配列でクラスを代用するには以下の方法がある。
┌──────────────────────────────────────┐
│const オブジェクト = {                                                      │
│    メンバ変数  :値,                                                        │
│    メソッド    :function(引数) {                                           │
│                     return 引数 * this.メンバ変数;                         │
│                 },                                                         │
│    メソッド    :引数 => {                                                  │
│                     return 引数 * this.メンバ変数;                         │
│                 },                                                         │
│    メソッド(引数) {                                                        │
│        return 引数 * this.メンバ変数;                                      │
│    }                                                                       │
│};                                                                          │
└──────────────────────────────────────┘
ES2015からはクラスが導入された。
┌──────────────────────────────────────┐
│class クラス {                                                              │
│////メンバ変数 = 値;  ←これはNG                                            │
│    constructor(引数) {                                                     │
│        this.メンバ変数 = 引数;                                             │
│    }                                                                       │
│    メソッド() {                                                            │
│        return this.メンバ変数;                                             │
│    }                                                                       │
│}                                                                           │
├──────────────────────────────────────┤
│const インスタンス = new クラス(引数);                                      │
│インスタンス.メソッド();                                                    │
├──────────────────────────────────────┤
│class 継承クラス extends クラス {                                           │
│    constructor(引数) {                                                     │
│        super();                                                            │
│    }                                                                       │
│}                                                                           │
└──────────────────────────────────────┘
分類:JavaScript
ExcelVBA/コンボボックスでユーザフォーム起動
2019年08月20日
┌──────────────────────────────────────┐
│Private Sub ComboBox_Change()                                               │
│    UserForm.Show                                                           │
│End Sub                                                                     │
└──────────────────────────────────────┘
コンボボックスの選択(変更)とともにユーザフォームを起動しようとした場合
コンボボックスが開いたままとなり、さらに選択(変更)できてしまい
エラーを誘発してしまう。

コンボボックスの選択が確定した後にユーザフォームを起動すればよいのだが
それに適うイベントというのが見当たらない

仕方がないので、代案。
敢えてフォーカスを外して閉じてからユーザフォームを起動すればよい。
┌──────────────────────────────────────┐
│Private Sub ComboBox_Change()                                               │
│    Me.Cells(1, 1).Activate     'メニューを閉じるため別にフォーカスをあてる │
│    Me.ComboBox.Activate        '  戻す                                     │
│    UserForm.Show                                                           │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
MSSQL/文字列比較の末尾スペース
2019年08月11日
MSSQLでは文字列比較時に末尾のスペースを無視するのだ。
つまり可変長を固定長と比較しても、中身が同じだったら真になるのである。

ちなみに以下で確認すると「真」になる。
┌──────────────────────────────────────┐
│SELECT CASE                                                                 │
│         WHEN 'a' = 'a ' THEN '真'                                          │
│         ELSE                 '偽'                                          │
│       END AS [テスト];                                                     │
└──────────────────────────────────────┘

文字数としても末尾は除去されている。
┌──────────────────────────────────────┐
│SELECT LEN('a ');                                                   →1(≠2)│
└──────────────────────────────────────┘
分類:MSSQL
ExcelVBA/DB読込時の進捗表示
2019年08月10日
以下のような感じ。
┌──────────────────────────────────────┐
│Dim データベース As New ADODB.Connection                                    │
│Dim テーブル As New ADODB.Recordset                                         │
├──────────────────────────────────────┤
│With データベース                                                           │
│    .ConnectionString = 接続情報                                            │
│    .CursorLocation = adOpenStatic  ' .RecordCountのために静的カーソルを選択│
│    .Open                                                                   │
│End With                                                                    │
├──────────────────────────────────────┤
│Do Until テーブル.EOF                                                       │
│    DoEvents                                                                │
│    Application.StatusBar = "進捗率=" & テーブル.AbsolutePosition _        │
│                                 & "/" & テーブル.RecordCount               │
│Loop                                                                        │
│Application.StatusBar = False                                               │
└──────────────────────────────────────┘
DBオープン時に静的カーソル(adOpenStatic)を選択しないと、
レコード総数(.RecordCount)が取得できないので注意。
現在の位置(.AbsolutePosition)と対比させれば進捗率が出せる。
(上記例は数式を表示しているだけ)
分類:ExcelVBA
ExcelVBA/キーブレイクの例
2019年08月09日
こんな感じ。
┌──────────────────────────────────────┐
│Dim y As Long                                                               │
│Dim oldキー1 As String, newキー1 As String                                  │
│Dim oldキー2 As String, newキー2 As String                                  │
│Dim 総計 As Long, 中計 As Long, 中計 As Long                                │
├──────────────────────────────────────┤
│y = 1                                                                       │
│総計 = 0                                                                    │
│Do Until テーブル.EOF                                                       │
│    '-----------------------------------------------------------------------│
│    中計 = 0                                                                │
│    '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -│
│    oldキー1 = テーブル.Fields("キー1").Value                               │
│    Do                                                                      │
│        '-------------------------------------------------------------------│
│        小計 = 0                                                            │
│        '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -│
│        oldキー2 = テーブル.Fields("キー2").Value                           │
│        Do                                                                  │
│            小計 = 小計 + テーブル.Fields("値").Value                       │
│            中計 = 中計 + テーブル.Fields("値").Value                       │
│            総計 = 総計 + テーブル.Fields("値").Value                       │
│            テーブル.MoveNext                                               │
│            If Not テーブル.EOF Then                                        │
│                newキー1 = テーブル.Fields("キー1").Value                   │
│                newキー2 = テーブル.Fields("キー2").Value                   │
│            End If                                                          │
│        Loop Until テーブル.EOF _                                           │
│                Or newキー1 <> oldキー1 _                                   │
│                Or newキー2 <> oldキー2                                     │
│        '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -│
│        シート.Cells(y, 1).Value = 小計                                     │
│        y = y + 1                                                           │
│        '-------------------------------------------------------------------│
│    Loop Until テーブル.EOF _                                               │
│            Or newキー1 <> oldキー1                                         │
│    '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -│
│    シート.Cells(y, 1).Value = 中計                                         │
│    y = y + 1                                                               │
│    '-----------------------------------------------------------------------│
│Loop                                                                        │
│シート.Cells(y, 1).Value = 総計                                             │
└──────────────────────────────────────┘
VBAの場合「OrElse」がないので、EOFとなった時に
直接「テーブル.Fields("キー1").Value」などをキーブレイク条件に記載すると
「テーブル.EOF(= True)」を飛び越えて参照しにいってしまうためエラーとなる。
この点に注意だ。 
分類:ExcelVBA
ExcelVBA/テキストボックスの自動伸縮
2019年07月30日
テキストボックスのサイズを自動で可変にする設定は以下の通り。
┌──────────────────────────────────────┐
│With シート.TextBox                                                         │
│    .AutoSize = True                                                        │
│    .MultiLine = True                                                       │
│    .WordWrap = False                                                       │
│End With                                                                    │
└──────────────────────────────────────┘
但し、一旦にアクティブにしないと再計算されないようなので
以下のようにアクティブにしてあげる。
┌──────────────────────────────────────┐
│With シート.TextBox                                                         │
│    .Activate                                                               │
│    .SelStart = 0                                                           │
│End With                                                                    │
│シート.Cells(1, 1).Activate                                                 │
└──────────────────────────────────────┘

なお、固定に戻すのは以下のような感じ。(.Heightと.Widthの値は任意)
┌──────────────────────────────────────┐
│With シート.TextBox                                                         │
│    .AutoSize = False                                                       │
│    .MultiLine = True                                                       │
│    .WordWrap = True                                                        │
│    .Height = 100                                                           │
│    .Width = 100                                                            │
│End With                                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
PHP/APIクライアントテスト用サーバ
2019年07月02日
クライアント側からPOSTした内容をそのまま返すサーバ。
┌──────────────────────────────────────┐
│echo print_r(json_decode(file_get_contents('php://input'), TRUE), TRUE);    │
└──────────────────────────────────────┘
分類:PHP
Oracle/掛け算(総積)
2019年06月26日
各行の値を足し算する(総和)のは以下の通り、基本中の基本だ。
┌──────────────────────────────────────┐
│SELECT SUM("数")                                                            │
│    FROM "表";                                                              │
└──────────────────────────────────────┘

じゃ、掛け算にできるか?(総積)
┌──────────────────────────────────────┐
│SELECT ROUND(EXP(SUM(LN("数"))))                                            │
│    FROM "表";                                                              │
└──────────────────────────────────────┘
こんな感じでてきてしまうのである。

自前の表を使って確認してみると確かに「2×3=6」という結果になる
┌──────────────────────────────────────┐
│WITH "表" AS (                                                              │
│         SELECT *                                                           │
│             FROM (                                                         │
│                           SELECT 2 AS "数" FROM DUAL                       │
│                 UNION ALL SELECT 3 AS "数" FROM DUAL                       │
│             )                                                              │
│     )                                                                      │
│SELECT ROUND(EXP(SUM(LN("数"))))                                            │
│    FROM "表";                                                              │
└──────────────────────────────────────┘

やっていることは以下の通り
(1) 「LN()」で一旦、自然対数(log)に変換する
(2) 「SUM()」でそれらを足し算する(総和を求める)
(3) その結果を「EXP()」で元に戻す
(4) 計算の過程で端数(ほんの小さい誤差)が出るので「ROUND()」で四捨五入し調整
分類:Oracle
前へ 1 … 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 … 156 次へ