MW211 EXIT

devlog
ExcelVBA/チャート描画
2019年12月18日
四角形で描画するとこんな感じ。
┌──────────────────────────────────────┐
│Sub 描画(ByVal y開始 As Long, _                                             │
│         ByVal x開始 As Long, _                                             │
│         ByVal y終了 As Long, _                                             │
│         ByVal x終了 As Long, _                                             │
│         ByVal 文言 As String)                                              │
│    Dim 図形 As Shape                                                       │
│    With ActiveSheet                                                        │
│        Set 図形 = .Shapes.AddShape( _                                      │
│            msoShapeRectangle, _                                            │
│            .Cells(y開始, x開始).Left, _                                    │
│            .Cells(y開始, x開始).Top, _                                     │
│            .Cells(y終了 + 1, x終了 + 1).Left - .Cells(y開始, x開始).Left, _│
│            .Cells(y終了 + 1, x終了 + 1).Top - .Cells(y開始, x開始).Top _   │
│        )                                                                   │
│    End With                                                                │
│    With 図形                                                               │
│        .Fill.ForeColor.RGB = RGB(255, 255, 255)                            │
│        .Line.ForeColor.RGB = RGB(0, 0, 0)                                  │
│        With .TextFrame2.TextRange.Font                                     │
│            .Size = 9                                                       │
│            .Name = "MS ゴシック"                                         │
│        End With                                                            │
│        With .TextFrame                                                     │
│            .HorizontalAlignment = xlHAlignCenter                           │
│            .VerticalAlignment = xlVAlignCenter                             │
│            .Characters.Font.Color = RGB(0, 0, 0)                           │
│            .Characters.Text = 文言                                         │
│        End With                                                            │
│    End With                                                                │
│End Sub                                                                     │
└──────────────────────────────────────┘

ちなみに、事前に全削除するには以下のような感じ。
┌──────────────────────────────────────┐
│Dim 図形 As Shape                                                           │
│With ActiveSheet                                                            │
│    For Each 図形 In .Shapes                                                │
│        If 図形.Type = msoShapeRectangle Then                               │
│            図形.Delete                                                     │
│        End If                                                              │
│    Next 図形                                                               │
│End With                                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/セル範囲から各種値を取得
2019年12月16日
┌──────────────────────────────────────┐
│Dim セル範囲 As Range                                                       │
├──────────────────────────────────────┤
│MsgBox "セル名:" & セル範囲.Address                                        │
│MsgBox "シート名:" & セル範囲.Parent.Name                                  │
│MsgBox "ブック名:" & セル範囲.Parent.Parent.Name                           │
└──────────────────────────────────────┘
セルの親がシートで、おじいちゃんがブックという関係になる。
分類:ExcelVBA
ExcelVBA/別ブックを開く場合にイベントを抑止
2019年12月13日
ブック(Excelファイル)を開く際に、以下のようにイベントを定義していたとする。
┌──────────────────────────────────────┐
│Private Sub Workbook_Open()                                                 │
│    ' イベント                                                              │
│End Sub                                                                     │
└──────────────────────────────────────┘
このブックを他から開いた場合に、このイベントが発動してしまうが
これを抑止する方法。

以下のようにファイルを開く直前にイベントを抑止すればよい。
┌──────────────────────────────────────┐
│Dim ブック As Workbook                                                      │
│Application.EnableEvents = False    '←★イベント抑止                       │
│Set ブック = Workbooks.Open(Filename:="(入力ファイルのパス)")               │
│Application.EnableEvents = True     '←★イベント抑止の解除                 │
│'(各種処理)                                                                 │
│ブック.Close SaveChanges:=False                                             │
└──────────────────────────────────────┘
一旦、開いてしまえば、こちらのイベントは無関係となるので
イベント抑止を元に戻してあげてよい。

なお、他のイベント(入力イベントなど)についても考え方は同じ。
分類:ExcelVBA
ExcelVBA/一頁で印刷する方法
2019年12月12日
【方法1】「拡大縮小印刷」の「次のページ数に合わせて印刷 横1×縦1」を行う
┌──────────────────────────────────────┐
│With ActiveSheet.PageSetup                                                  │
│    .Zoom = False                                                           │
│    .FitToPagesWide = 1                                                     │
│    .FitToPagesTall = 1                                                     │
│End With                                                                    │
│' 印刷範囲の点線表示は変わらないのでわざと画面を切り替える                  │
│With ActiveWindow                                                           │
│    If .View = xlPageBreakPreview Then                                      │
│        .View = xlNormalView                                                │
│    End If                                                                  │
│    .View = xlPageBreakPreview                                              │
│End With                                                                    │
└──────────────────────────────────────┘
────────────────────────────────────────
【方法2】頁の境目を最端までドラッグ&ドロップする(拡大率指定のままで実現)
┌──────────────────────────────────────┐
│With ActiveSheet                                                            │
│    If .VPageBreaks.Count > 0 Then                                          │
│        .VPageBreaks(1).DragOff Direction:=xlToRight, RegionIndex:=1        │
│    End If                                                                  │
│    If .HPageBreaks.Count > 0 Then                                          │
│        .HPageBreaks(1).DragOff Direction:=xlDown, RegionIndex:=1           │
│    End If                                                                  │
│End With                                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/固定頁の印刷設定
2019年12月11日
一頁目と同じサイズの二頁目以降がある場合に、印刷範囲を設定する方法
┌──────────────────────────────────────┐
│Sub 頁印刷範囲設定()                                                        │
│    Const 列数 As Long = 10                                                 │
│    Const 行数 As Long = 60                                                 │
│    Const 頁数 As Long = 5                                                  │
│    Dim i As Long                                                           │
│    With ActiveSheet                                                        │
│        ' ①念のため(頁数設定ではなく)拡大率設定にする                      │
│        .PageSetup.Zoom = 100                                               │
│        ' ②任意の改頁を全クリアする                                        │
│        .ResetAllPageBreaks                                                 │
│        ' ③一旦、印刷範囲を一頁目に絞る                                    │
│        .PageSetup.PrintArea = Range(.Cells(1, 1), .Cells(行数, 列数))      │
│        ' ④自然な改頁をすべて除去する                                      │
│        If .VPageBreaks.Count > 0 Then                                      │
│            .VPageBreaks(1).DragOff Direction:=xlToRight, RegionIndex:=1    │
│        End If                                                              │
│        If .HPageBreaks.Count > 0 Then                                      │
│            .HPageBreaks(1).DragOff Direction:=xlDown, RegionIndex:=1       │
│        End If                                                              │
│        ' ⑤印刷範囲を最大にする                                            │
│        .PageSetup.PrintArea _                                              │
│            = Range(.Cells(1, 1), .Cells(行数 * 頁数, 列数))                │
│        ' ⑥任意の改頁を決まった行ごとに設定する                            │
│        For i = 1 To 頁数                                                   │
│            .HPageBreaks.Add Rows(i * 行数 + 1)                             │
│        Next i                                                              │
│    End With                                                                │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/昔ながらの文字長
2019年11月29日
昔のExcelでは、全角文字=2バイトだった(ShiftJISだったので)
でも今はUnicodeになったのでその常識が通じない。
でも、それを使いたい場合がある。
ということで、自前でリメンバーLenB、LeftBを。
┌──────────────────────────────────────┐
│'===========================================================================│
│'  ShiftJISバイト長(全角文字=2バイト)                                      │
│'===========================================================================│
│Public Function LenSjis(ByVal 入力 As String) As Long                       │
│    LenSjis = LenB(StrConv(入力, vbFromUnicode))                            │
│End Function                                                                │
├──────────────────────────────────────┤
│'===========================================================================│
│'  ShiftJISバイト長で左から切り抜き                                         │
│'===========================================================================│
│Public Function LeftSjis(ByVal 入力 As String, _                            │
│                         ByVal バイト長 As Long) As String                  │
│    Dim 結果 As String                                                      │
│    結果 = StrConv(LeftB(StrConv(入力, vbFromUnicode), バイト長), vbUnicode)│
│    If LenSjis(結果) > バイト長 Then                                        │
│        結果 = Left(入力, Len(結果) - 1)                                    │
│    End If                                                                  │
│    LeftSjis = 結果                                                         │
│End Function                                                                │
└──────────────────────────────────────┘
分類:ExcelVBA
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
前へ 1 … 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 … 156 次へ