MW211 EXIT

devlog
ExcelVBA/【未解決】エラー時の関数名
2019年10月29日
例えば以下のような例外が発生した場合に、どの関数(どのクラスのどのメソッド)で
発生したかをログに出力できたらすばらしい。
┌──────────────────────────────────────┐
│    On Error GoTo l_Catch                                                   │
│    MsgBox 1 / 0                                                            │
│    Exit Sub                                                                │
│l_Catch:                                                                    │
│    MsgBox Err.Description                          '→「0で除算しました。」│
└──────────────────────────────────────┘

でも、その簡単な方法が今のところ見当たらない。
例えば以下みたいに簡単に指定できればいいのだが。
┌──────────────────────────────────────┐
│    MsgBox __CLASS__                                                        │
│    MsgBox __METHOD__                                                       │
│    MsgBox __FUNC__                                                         │
└──────────────────────────────────────┘

まず、実行中の行番号がわかれば以下でいける。
#といっても、自身のソースファイル名を指定(With句の部分)する必要があるが
  モジュールなら「Application.VBE.ActiveCodePane.CodeModule」で取得できるが
┌──────────────────────────────────────┐
│With ThisWorkbook.VBProject.VBComponents("Moduleモジュール").CodeModule     │
│    MsgBox .ProcOfLine(Erl, 0)                                '→関数名     │
│End With                                                                    │
├──────────────────────────────────────┤
│With ThisWorkbook.VBProject.VBComponents("Classクラス").CodeModule          │
│    MsgBox .Name()                                             '→クラス名  │
│    MsgBox .ProcOfLine(Erl, 0)                                 '→メソッド名│
│End With                                                                    │
└──────────────────────────────────────┘
行番号は隠し関数の「Erl()」で取得できるのだが、微妙なのがその前準備。

普段使わない行番号を振っておかなければならないのだ。
┌──────────────────────────────────────┐
│77: On Error GoTo l_Catch                                                   │
│    MsgBox 1 / 0                                                            │
│    Exit Sub                                                                │
│l_Catch:                                                                    │
│    MsgBox Erl                                                     '→「77」│
├──────────────────────────────────────┤
│77: On Error GoTo l_Catch                                                   │
│88: MsgBox 1 / 0                                                            │
│    Exit Sub                                                                │
│l_Catch:                                                                    │
│    MsgBox Erl                                                     '→「88」│
└──────────────────────────────────────┘
かなりめんどくさい、これは却下か。

他にもっと簡単な方法はないものか。
分類:ExcelVBA
MSSQL/大文字小文字の区別
2019年10月28日
MSSQLだと、大文字と小文字を基本的に区別しない。
それは、デフォルトだと「Japanese_CI_AS」だからである。

区別にするには「COLLATE Japanese_CS_AS」オプションをつければよい。

まず、各オプション値については、以下の通り。
┌──────────────────────────────────────┐
│「Japanese_CI_AI_KI_WI」~「Japanese_CS_AS_KS_WS」の組み合わせもしくは      │
│「Japanese_BIN」、「Japanese_BIN2」が設定可能                               │
│┌─┬────────────┐┌─┬────────────┬───┐    │
││S │区別する     (Sensitive)││C │大文字と小文字    (Case)│a    A│    │
│├─┼────────────┤├─┼────────────┼───┤    │
││I │区別しない (Insensitive)││A │濁点や半濁点    (Accent)│か  が│    │
│└─┴────────────┘├─┼────────────┼───┤    │
│                                │K │ひらがなとカタカナ(Kana)│あ  ア│    │
│                                ├─┼────────────┼───┤    │
│                                │W │半角と全角       (Width)│a   a│    │
│                                └─┴────────────┴───┘    │
└──────────────────────────────────────┘

次に「COLLATE」句の使い方は、以下の通り。

表生成時に定義してしまう場合
┌──────────────────────────────────────┐
│CREATE TABLE [表] (                                                         │
│    [文字列]  [nvarchar](16) COLLATE Japanese_CS_AS NULL,                   │
│);                                                                          │
└──────────────────────────────────────┘

WHERE文にて作用させる場合
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM [TESTDB].[dbo].[T_TEST2]                                           │
│    WHERE [文字列] = 'a' COLLATE Japanese_CS_AS;                            │
└──────────────────────────────────────┘

DISTINCT句にて作用させる場合
┌──────────────────────────────────────┐
│SELECT DISTINCT [文字列] COLLATE Japanese_CS_AS AS [文字列]                 │
│    FROM [TESTDB].[dbo].[T_TEST2]                                           │
└──────────────────────────────────────┘
分類:MSSQL
MSSQL/週単位で集計
2019年10月24日
日付ごとのデータを週単位で集計する場合は、
集計キーとなる列(同一週内で同一の値となるもの)を作り、それでGROUP BYすればよい。
┬──────────────────────────────────────┬
│毎週日曜日を起点する場合                                                    │
┴──────────────────────────────────────┴
【集計キーを起点日からの週目とする方法】
┌──────────────────────────────────────┐
│SELECT [日付],                                                              │
│       DATEDIFF(week, '2019-09-29', [日付]) AS [週目]                       │
│    FROM (                                                                  │
│        VALUES ('2019-10-01'),('2019-10-02'),('2019-10-03'),('2019-10-04'), │
│               ('2019-10-05'),('2019-10-06'),('2019-10-07'),('2019-10-08'), │
│               ('2019-10-09'),('2019-10-10'),('2019-10-11'),('2019-10-12'), │
│               ('2019-10-13'),('2019-10-14'),('2019-10-15'),('2019-10-16'), │
│               ('2019-10-17'),('2019-10-18'),('2019-10-19'),('2019-10-20'), │
│               ('2019-10-21'),('2019-10-22'),('2019-10-23'),('2019-10-24'), │
│               ('2019-10-25'),('2019-10-26'),('2019-10-27'),('2019-10-28'), │
│               ('2019-10-29'),('2019-10-30'),('2019-10-31')                 │
│    ) AS [表]([日付])                                                       │
│    ORDER BY [日付] ASC;                                                    │
└──────────────────────────────────────┘
  ※起点日は日~土曜日のいずれを指定しても同じ結果になる
────────────────────────────────────────
【集計キーを年頭からの週目とする方法】
┌──────────────────────────────────────┐
│SELECT [日付],                                                              │
│       DATEPART(week, [日付]) AS [週目]                                     │
│    FROM (                                                                  │
│        VALUES ('2019-10-01'),('2019-10-02'),('2019-10-03'),('2019-10-04'), │
│               ('2019-10-05'),('2019-10-06'),('2019-10-07'),('2019-10-08'), │
│               ('2019-10-09'),('2019-10-10'),('2019-10-11'),('2019-10-12'), │
│               ('2019-10-13'),('2019-10-14'),('2019-10-15'),('2019-10-16'), │
│               ('2019-10-17'),('2019-10-18'),('2019-10-19'),('2019-10-20'), │
│               ('2019-10-21'),('2019-10-22'),('2019-10-23'),('2019-10-24'), │
│               ('2019-10-25'),('2019-10-26'),('2019-10-27'),('2019-10-28'), │
│               ('2019-10-29'),('2019-10-30'),('2019-10-31')                 │
│    ) AS [表]([日付])                                                       │
│    ORDER BY [日付] ASC;                                                    │
└──────────────────────────────────────┘
  ※年を跨ぐとリセットされるので年末年始の識別が難解
┬──────────────────────────────────────┬
│毎週任意の曜日を起点する場合                                                │
┴──────────────────────────────────────┴
【集計キーを基準日とする方法】(下記例では毎週月曜日を基準日としている)
┌──────────────────────────────────────┐
│SELECT [日付],                                                              │
│       CONVERT(date,                                                        │
│               DATEADD(                                                     │
│                   day,                                                     │
│                   -1 * (                                                   │
│                       DATEPART(weekday,                                    │
│                                DATEADD(day, -1 * 2 + 1, [日付]))           │
│                   ) + 1,                                                   │
│                   [日付])                                                  │
│       ) AS [週集計日]                                                      │
│    FROM (                                                                  │
│        VALUES ('2019-10-01'),('2019-10-02'),('2019-10-03'),('2019-10-04'), │
│               ('2019-10-05'),('2019-10-06'),('2019-10-07'),('2019-10-08'), │
│               ('2019-10-09'),('2019-10-10'),('2019-10-11'),('2019-10-12'), │
│               ('2019-10-13'),('2019-10-14'),('2019-10-15'),('2019-10-16'), │
│               ('2019-10-17'),('2019-10-18'),('2019-10-19'),('2019-10-20'), │
│               ('2019-10-21'),('2019-10-22'),('2019-10-23'),('2019-10-24'), │
│               ('2019-10-25'),('2019-10-26'),('2019-10-27'),('2019-10-28'), │
│               ('2019-10-29'),('2019-10-30'),('2019-10-31')                 │
│    ) AS [表]([日付])                                                       │
│    ORDER BY [日付] ASC;                                                    │
└──────────────────────────────────────┘
────────────────────────────────────────
分類:MSSQL
ExcelVBA/EXE実行(2)WScript.Exec()
2019年10月05日
WSHを使ってのEXE実行の例。
┌──────────────────────────────────────┐
│Dim 標準出力 As String                                                      │
│Dim objWSH As Object                                                        │
│Set objWSH = CreateObject("WScript.Shell")                                  │
│Dim objEXEC As Object                                                       │
│Set objEXEC = objWSH.Exec("C:\TOOLS\TEST.exe")                              │
│With objEXEC                                                                │
│    Do While .Status = 0                                                    │
│        DoEvents                                                            │
│    Loop                                                                    │
│    標準出力 = .StdOut.ReadAll                                              │
│End With                                                                    │
│MsgBox 標準出力                                                             │
└──────────────────────────────────────┘
これだと標準出力などを取得できる。
分類:ExcelVBA
ExcelVBA/EXE実行(1)Shell()
2019年10月04日
Shell()を使ってのEXE実行の例。
┌──────────────────────────────────────┐
│Dim プロセスID As Long                                                      │
│プロセスID = Shell("C:\TOOLS\TEST.exe", 1)                                  │
│If プロセスID = 0 Then                                                      │
│    MsgBox "起動に失敗しました"                                             │
│    Exit Sub                                                                │
│End If                                                                      │
│MsgBox "実行完了"                                                           │
└──────────────────────────────────────┘
実行できるだけあまり多くを期待しない方がよさそうだ。(よくわからない)
分類:ExcelVBA
その実行ファイルは32bitか?64bitか?
2019年10月03日
その実行ファイルが32bit版なのか64bit版なのかを判別する簡単な方法

その実行ファイルをバイナリエディタで開くと、
冒頭の方(といってもちょっと後の方)に
「50 45 00 00」という値があるので、その後の値で判別できる
┌───┬─────────┐
│32bit │50 45 00 00 4C 01 │
├───┼─────────┤
│64bit │50 45 00 00 64 86 │
└───┴─────────┘
分類:Windows
MSSQL/DBを別名でリストアする方法
2019年10月01日
基本的に、通常のリストアを同じように進める。(データベースの復元を実行)

その中で、以下の二つを行う。

(1) 「全般」にて、「転送先」の「データベース」の名称を直接入力して変更する
┌──────────────────────────────────────┐
│データベースの復元                                                          │
├──────┬───────────────────────────────┤
│■全般      │ソース────────────────────────────│
│□ファイル  │  ○データベース                                              │
│□オブション│  ●デバイス                                                  │
│            │                ┌─────────────────────┐│
│            │    データベース│旧DB                                      ││
│            │                └─────────────────────┘│
│            │転送先────────────────────────────│
│            │                ┌─────────────────────┐│
│            │    データベース│新DB                                      │★
│            │                └─────────────────────┘│

(2) 「ファイル」にて、
    「すべてのファイルをフォルダーに移動する」にチェックを入れる
┌──────────────────────────────────────┐
│データベースの復元                                                          │
├──────┬───────────────────────────────┤
│□全般      │次のデータベースファイルに復元────────────────│
│■ファイル  │  ■すべてのファイルをフォルダーに移動する                    ★
│□オブション│                                ┌─────────────┐│
│            │    データファイルのフォルダー  │                          ││
│            │                                └─────────────┘│
│            │                                ┌─────────────┐│
│            │    ログファイルのフォルダー    │                          ││
│            │                                └─────────────┘│
│            │┌───────┬ファイルの┬───────┬───────┐│
│            ││論理ファイル名│      種類│元のファイル名│復元先        ││
│            │├───────┼─────┼───────┼───────┤│
│            ││旧DB          │行データ  │…旧DB.mdf    │…新DB.mdf    ││
│            │├───────┼─────┼───────┼───────┤│
│            ││旧DB_log      │ログ      │…旧DB_log.ldf│…新DB_log.ldf││
│            │└───────┴─────┴───────┴───────┘│
この時点では物理ファイル(復元先)は新DBになるが、論理ファイル名は旧DBのまま。

(3) リストアを実行後、以下SQL文を実行し論理ファイル名を変更する
┌──────────────────────────────────────┐
│ALTER DATABASE [新DB] MODIFY FILE (NAME = 旧DB, NEWNAME = 新DB);            │
│ALTER DATABASE [新DB] MODIFY FILE (NAME = 旧DB_log, NEWNAME = 新DB_log);    │
└──────────────────────────────────────┘

これで完璧。
分類:MSSQL
VBS/配列の末尾に追加して文字列結合
2019年09月28日
「System.Collections.ArrayList」オブジェクトで
Join()ができなさそうだったので、クラスを自前で作った。
┌──────────────────────────────────────┐
│'***************************************************************************│
│'  クラス:配列                                                             │
│'***************************************************************************│
│Class ClassArray                                                            │
│    Private mArray()                                                        │
│    Private mIsInit                                                         │
│    '=======================================================================│
│    '  コンストラクタ                                                       │
│    '=======================================================================│
│    Private Sub Class_Initialize                                            │
│        mIsInit = True                                                      │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  デストラクタ                                                         │
│    '=======================================================================│
│    Private Sub Class_Terminate                                             │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  メソッド:(末尾に)追加                                               │
│    '=======================================================================│
│    Public Sub add(theValue)                                                │
│        If mIsInit Then                                                     │
│            mIsInit = False                                                 │
│            ReDim mArray(0)                                                 │
│        Else                                                                │
│            ReDim Preserve mArray(UBound(mArray) + 1)                       │
│        End If                                                              │
│        mArray(UBound(mArray)) = theValue                                   │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  メソッド:(結合し)文字列を取得                                       │
│    '=======================================================================│
│    Public Function getString(theDelimiter)                                 │
│        getString = Join(mArray, theDelimiter)                              │
│    End Function                                                            │
│    '=======================================================================│
│End Class                                                                   │
│'***************************************************************************│
├──────────────────────────────────────┤
│Dim theArray                                                                │
│Set theArray = New ClassArray                                               │
│theArray.add("あいうえお")                                                  │
│theArray.add("かきくけこ")                                                  │
│theArray.add("さしすせそ")                                                  │
│MsgBox theArray.getString("、")                                             │
└──────────────────────────────────────┘
分類:WSH・VBS
MSSQL/文字列比較の末尾スペース(2)
2019年09月27日
┌──────────────────────────────────────┐
│SELECT LEN('a ');                                                   →1(≠2)│
└──────────────────────────────────────┘
文字数としても末尾は除去されるのでお手上げな気がする

でも、末尾の空白は置換には反応するという特性がある。
┌──────────────────────────────────────┐
│REPLACE('a ',' ','_')                                               →「a_」│
└──────────────────────────────────────┘

この特性を活かせば、末尾に空白があるか否かを識別できる。
┌──────────────────────────────────────┐
│SELECT 列                                                                   │
│    FROM 表                                                                 │
│    WHERE LEN(REPLACE(列,' ','_')) <> LEN(列);                              │
└──────────────────────────────────────┘
上記では、末尾に空白があるもののみ抽出されるはずだ。
分類:MSSQL
ExcelVBA/コメントのマクロ制御
2019年09月13日
こんな感じ。
┌──────────────────────────────────────┐
│With ActiveCell                                                             │
│    If TypeName(.Comment) = "Nothing" Then                    ' 存在チェック│
│        .AddComment "コメント" & vbLf & "します"              ' 追加        │
│    Else                                                                    │
│        MsgBox .Comment.Text                                  ' 取得        │
│        .ClearComments                                        ' 削除        │
│    End If                                                                  │
│End With                                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
前へ 1 … 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 … 156 次へ