MW211 EXIT

devlog
ExcelVBA/マクロ抜きシート複写
2018年02月28日
シートを複写すると漏れなくシートのマクロも付いてくる。
それを除去したいという場合、コピー後にマクロを削除するのは困難なようなので
(自由のソースコードを改変できることになり、セキュリティ的に厳しい)
新規シートを追加し、マクロ以外を地道にコピーする方が(遠回りだけど)近道なようだ。
以下その関数。
┌──────────────────────────────────────┐
│Sub マクロ抜きシート複写(ByVal 入力シート As Worksheet, _                   │
│                         ByVal 出力シート As Worksheet)                     │
│    Dim 改頁 As Variant, 表示倍率 As Long                                   │
│    '-----------------------------------------------------------------------│
│    '  コピー                                                               │
│    '-----------------------------------------------------------------------│
│    入力シート.Cells.Copy  ' コピー                                         │
│    With 出力シート.Cells(1, 1)                                             │
│        .PasteSpecial Paste:=xlValues   ' 値貼り付け                        │
│        .PasteSpecial Paste:=xlFormats  ' 書式貼り付け                      │
│        .Select                                                             │
│    End With                                                                │
│    '-----------------------------------------------------------------------│
│    '  印刷設定の複写                                                       │
│    '-----------------------------------------------------------------------│
│    Call 複写PageSetup(入力シート.PageSetup, 出力シート.PageSetup)          │
│    '-----------------------------------------------------------------------│
│    '  改頁位置の複写                                                       │
│    '-----------------------------------------------------------------------│
│    For Each 改頁 In 入力シート.HPageBreaks                                 │
│        出力シート.HPageBreaks.Add 改頁.Location.Rows                       │
│    Next 改頁                                                               │
│    '-----------------------------------------------------------------------│
│    '  表示倍率の複写                                                       │
│    '-----------------------------------------------------------------------│
│    入力シート.Select:  表示倍率 = ActiveWindow.Zoom                        │
│    出力シート.Select:  ActiveWindow.Zoom = 表示倍率                        │
│    '-----------------------------------------------------------------------│
│    '  クリップボードのクリア                                               │
│    '-----------------------------------------------------------------------│
│    Application.CutCopyMode = False                                         │
│    ' 上記で解消できないものは、全セル選択から一セル選択に変更で対応        │
│    ' →「図が大きすぎます。」エラー対策                                    │
│    入力シート.Cells(1, 1).Copy                                             │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Private Sub 複写PageSetup(ByVal 入力 As Object, _                           │
│                          ByVal 出力 As Object)                             │
│    With 出力                                                               │
│        .AlignMarginsHeaderFooter = 入力.AlignMarginsHeaderFooter           │
│        .BlackAndWhite = 入力.BlackAndWhite                                 │
│        .BottomMargin = 入力.BottomMargin                                   │
│        .CenterFooter = 入力.CenterFooter                                   │
│        .CenterHeader = 入力.CenterHeader                                   │
│        .CenterHorizontally = 入力.CenterHorizontally                       │
│        .CenterVertically = 入力.CenterVertically                           │
│        .DifferentFirstPageHeaderFooter = 入力.DifferentFirstPageHeaderFooter
│        .Draft = 入力.Draft                                                 │
│        .FirstPageNumber = 入力.FirstPageNumber                             │
│        .FitToPagesTall = 入力.FitToPagesTall                               │
│        .FitToPagesWide = 入力.FitToPagesWide                               │
│        .FooterMargin = 入力.FooterMargin                                   │
│        .HeaderMargin = 入力.HeaderMargin                                   │
│        .LeftFooter = 入力.LeftFooter                                       │
│        .LeftHeader = 入力.LeftHeader                                       │
│        .LeftMargin = 入力.LeftMargin                                       │
│        .OddAndEvenPagesHeaderFooter = 入力.OddAndEvenPagesHeaderFooter     │
│        .Order = 入力.Order                                                 │
│        .Orientation = 入力.Orientation                                     │
│        .PaperSize = 入力.PaperSize                                         │
│        .PrintArea = 入力.PrintArea                                         │
│        .PrintComments = 入力.PrintComments                                 │
│        .PrintErrors = 入力.PrintErrors                                     │
│        .PrintGridlines = 入力.PrintGridlines                               │
│        .PrintHeadings = 入力.PrintHeadings                                 │
│        .PrintNotes = 入力.PrintNotes                                       │
│        .PrintQuality = 入力.PrintQuality                                   │
│        .PrintTitleColumns = 入力.PrintTitleColumns                         │
│        .PrintTitleRows = 入力.PrintTitleRows                               │
│        .RightFooter = 入力.RightFooter                                     │
│        .RightHeader = 入力.RightHeader                                     │
│        .RightMargin = 入力.RightMargin                                     │
│        .ScaleWithDocHeaderFooter = 入力.ScaleWithDocHeaderFooter           │
│        .TopMargin = 入力.TopMargin                                         │
│        .Zoom = 入力.Zoom                                                   │
│        ' 以下省略(複雑なので)                                              │
│''''''''.Application = 入力.Application                                     │
│''''''''.CenterFooterPicture = 入力.CenterFooterPicture                     │
│''''''''.CenterHeaderPicture = 入力.CenterHeaderPicture                     │
│''''''''.Creator = 入力.Creator                                             │
│''''''''.EvenPage = 入力.EvenPage                                           │
│''''''''.FirstPage = 入力.FirstPage                                         │
│''''''''.LeftFooterPicture = 入力.LeftFooterPicture                         │
│''''''''.LeftHeaderPicture = 入力.LeftHeaderPicture                         │
│''''''''.Pages = 入力.Pages                                                 │
│''''''''.Parent = 入力.Parent                                               │
│''''''''.RightFooterPicture = 入力.RightFooterPicture                       │
│''''''''.RightHeaderPicture = 入力.RightHeaderPicture                       │
│    End With                                                                │
│End Sub                                                                     │
└──────────────────────────────────────┘
複写PageSetup()の部分(PageSetupオブジェクト配下プロパティの全コピー)が、
もっと簡単にできればいいのだが…。

オブジェクト配下プロパティの全コピーの方法はみつからないようだ。
分類:ExcelVBA
ExcelVBA/列幅の記録と呼出
2018年02月22日
非表示の「列幅保存用」シートを用意しておき、
以下のマクロでセーブしてロードする。
┌──────────────────────────────────────┐
│Sub 列幅セーブ()                                                            │
│    ActiveSheet.Cells.Copy                                                  │
│    ThisWorkbook.Worksheets("列幅保存用").Cells.PasteSpecial _              │
│        Paste:=xlPasteColumnWidths                                          │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Sub 列幅ロード()                                                            │
│    ThisWorkbook.Worksheets("列幅保存用").Cells.Copy                        │
│    ActiveSheet.Cells.PasteSpecial Paste:=xlPasteColumnWidths               │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA実験/コンストラクタで他クラスを実行
2018年02月15日
あるクラスのコンストラクタで他クラスを呼び出したら、どの順で実行されるか?
┌──────────────────────────────────────┐
│Public Sub 実験コンストラクタで他クラスを実行()                             │
│    Dim objクラス1 As New クラス1                                           │
│    Call objクラス1.実行                                                    │
│End Sub                                                                     │
├──────────────────────────────────────┤
│'クラス1.cls                                                                │
│Private Sub Class_Initialize()                                              │
│    Dim objクラス2 As New クラス2                                           │
│    Call objクラス2.実行                                                    │
│End Sub                                                                     │
│Public Sub 実行()                                                           │
│    MsgBox "②クラス1実行"                                                  │
│End Sub                                                                     │
├──────────────────────────────────────┤
│'クラス2.cls                                                                │
│Public Sub 実行()                                                           │
│    MsgBox "①クラス2実行"                                                  │
│End Sub                                                                     │
└──────────────────────────────────────┘
当たり前だが「コンストラクタ(→他クラスを実行)→自クラスを実行」の順で実行される
分類:ExcelVBA
ExcelVBA実験/LetとGet
2018年02月14日
次はLetとGetの起動タイミングをみてみよう
┌──────────────────────────────────────┐
│Private メンバ変数 As Long                                                  │
├──────────────────────────────────────┤
│Property Let 実験プロパティ(ByVal 入力値 As Long)                           │
│    メンバ変数 = 入力値                                                     │
│    MsgBox "①Letが実行された"                                              │
│End Property                                                                │
├──────────────────────────────────────┤
│Property Get 実験プロパティ() As Long                                       │
│    実験プロパティ = メンバ変数                                             │
│    MsgBox "②Getが実行された"                                              │
│End Property                                                                │
├──────────────────────────────────────┤
│Sub 実験LetGet()                                                            │
│    実験プロパティ = 777                                                    │
│    MsgBox "③" & 実験プロパティ                                            │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA実験/値渡し・参照渡し
2018年02月13日
今日から始まった実験シリーズ~!

まずは値渡しと参照渡しの違いを体感してみよう
┌──────────────────────────────────────┐
│Public Sub 実験値渡し()                                                     │
│    Dim 変数 As String                                                      │
│    変数 = "値渡し"                                                         │
│    Call サブ関数(変数)                                                     │
│    MsgBox 変数     ' →「値渡し」                                          │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Private Sub サブ関数(ByVal 変数 As String)                                  │
│    変数 = "参照渡し"                                                       │
│End Sub                                                                     │
└──────────────────────────────────────┘
┌──────────────────────────────────────┐
│Public Sub 実験参照渡し()                                                   │
│    Dim 変数 As String                                                      │
│    変数 = "値渡し"                                                         │
│    Call サブ関数(変数)                                                     │
│    MsgBox 変数     ' →「参照渡し」                                        │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Private Sub サブ関数(変数 As String)                                        │
│    変数 = "参照渡し"                                                       │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ボタン押下のApplication.Goto
2018年02月12日
「Application.Goto」命令で、特定のセルに飛んでも、
フォーカスがあたるだけで、アクティブ(セレクト)になる訳ではない場合ある。

つまり、ボタン押下のイベントで「Application.Goto」命令で
自シートのいずれかのセルに飛ぶと、飛ぶことはできるが
その後、キー操作を受け付けない(セルをダブルクリックするか何かしなければならない)

これは、アクティブなのがボタン(オブジェクト)側だからである。

これを解消する(アクティブにする)には、「Application.Goto」命令直後に
「ActiveCell.Select」など(*1)を実行すればよい。

*1:以下のいずれでもOK
  ・「ActiveCell.Activate」
  ・「ActiveCell.Select」
  ・「Selection.Activate」
  ・「Selection.Select」

なお、他シートへ飛ぶ場合には、
ボタンにフォーカスが当たっているのは自シート側なので
このような現象は発生しづらいが、直前のそのシートでボタンを押下しているなど
オブジェクト側にフォーカスが当たっていれば、同じ論理でキー操作を受け付けなくなる

例えば、二つのシートにボタンを配置し、
それぞれ他方の特定のシートに飛ぶようにした場合、
飛んだ先のシートではいずれもキー操作を受け付けないことになる

なお、オブジェクト側がアクティブになっている場合
画面左上の「名前ボックス」は空欄となっているのが目安となる。
分類:ExcelVBA
ExcelVBA/With句内で自身を指す
2018年02月10日
「.Offset()」だね。
┌──────────────────────────────────────┐
│With セル                                                                   │
│    If .Value = "" Then                                                     │
│        MsgBox "入力してね"                                                 │
│        Application.GoTo .Offset()                                          │
│    End If                                                                  │
│End With                                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
MSSQL/マトリクス出力(pivot利用版)
2018年02月08日
┌──────────────────────────────────────┐
│GO                                                                          │
│    DECLARE @sql    nvarchar(max);                                          │
│    DECLARE @sql0   nvarchar(max);                                          │
│    DECLARE @sql1   nvarchar(max);                                          │
│    DECLARE @sql1a  nvarchar(max);                                          │
│    DECLARE @sql1b  nvarchar(max);                                          │
│    -- ---------------------------------------------------------------------│
│    --   見出                                                               │
│    -- ---------------------------------------------------------------------│
│    SELECT @sql0 = ISNULL(@sql0 + ',','')                                   │
│                 + '(SELECT [列名]'                                         │
│                 + '     FROM [列M]'                                       │
│                 + '     WHERE [列ID] = ' + CONVERT(varchar,[列ID])         │
│                 + ') AS [' + CONVERT(varchar,[列ID]) + ']'                 │
│        FROM [列M]                                                         │
│        ORDER BY [列順];                                                    │
│    SET @sql0 = 'SELECT 0    AS [行順],'                                    │
│              + '       NULL AS [行ID],'                                    │
│              + @sql0;                                                      │
│    -- ---------------------------------------------------------------------│
│    --   明細                                                               │
│    -- ---------------------------------------------------------------------│
│    SELECT @sql1a = ISNULL(@sql1a + ',','')                                 │
│                  + '[' + CONVERT(varchar,[列ID]) + ']',                    │
│           @sql1b = ISNULL(@sql1b + ',','')                                 │
│                  + '[ピボット].[' + CONVERT(varchar,[列ID]) + ']'          │
│        FROM [列M]                                                         │
│        ORDER BY [列順];                                                    │
│    SET @sql1 = 'SELECT [行M].[行順],'                                     │
│              + '       [ピボット].[行ID],'                                 │
│              + @sql1b                                                      │
│              + '    FROM ('                                                │
│              + '        SELECT [列M].[列ID],'                             │
│              + '               [行M].[行ID],'                             │
│              + '               [行列D].[データ]'                          │
│              + '            FROM [列M]'                                   │
│              + '                CROSS JOIN [行M]'                         │
│              + '                LEFT JOIN [行列D]'                        │
│              + '                  ON  [行列D].[列ID] = [列M].[列ID]'     │
│              + '                  AND [行列D].[行ID] = [行M].[行ID]'     │
│              + '    ) AS [行列M]'                                         │
│              + '    PIVOT ('                                               │
│              + '        MAX([データ]) FOR [列ID] IN (' + @sql1a + ')'      │
│              + '    ) AS [ピボット]'                                       │
│              + '        INNER JOIN [行M]'                                 │
│              + '          AND [行M].[行ID] = [ピボット].[行ID]';          │
│    -- ---------------------------------------------------------------------│
│    --   統合                                                               │
│    -- ---------------------------------------------------------------------│
│    SET @sql = 'SELECT *'                                                   │
│             + '    FROM (' + @sql0 + ' UNION ALL ' + @sql1 + ') AS [行列]' │
│             + '    ORDER BY [行順] ASC;';                                  │
│    EXECUTE (@sql);                                                         │
│GO                                                                          │
└──────────────────────────────────────┘
分類:MSSQL
MSSQL/マトリクス出力
2018年02月07日
┌──────────────────────────────────────┐
│GO                                                                          │
│    DECLARE @sql    [nvarchar](max);                                        │
│    DECLARE @sql0   [nvarchar](max);                                        │
│    DECLARE @sql1   [nvarchar](max);                                        │
│    -- ---------------------------------------------------------------------│
│    --   見出                                                               │
│    -- ---------------------------------------------------------------------│
│    SELECT @sql0 = ISNULL(@sql0 + ',','')                                   │
│                 + '(SELECT [列名]'                                         │
│                 + '     FROM [列M]'                                       │
│                 + '     WHERE [列ID] = ' + CONVERT([varchar], [列ID])      │
│                 + ') AS [' + CONVERT([varchar], [列ID]) + ']'              │
│        FROM [列M]                                                         │
│        ORDER BY [列順];                                                    │
│    SET @sql0 = 'SELECT 0    AS [行順],'                                    │
│              + '       NULL AS [行ID],'                                    │
│              + @sql0;                                                      │
│    -- ---------------------------------------------------------------------│
│    --   明細                                                               │
│    -- ---------------------------------------------------------------------│
│    SELECT @sql1 = ISNULL(@sql1 + ',','')                                   │
│                 + '(SELECT [行列D].[データ]'                              │
│                 + '     FROM [行列D]'                                     │
│                 + '     WHERE [行列D].[列ID] = '                          │
│                                                + CONVERT([varchar], [列ID])│
│                 + '       AND [行列D].[行ID] = [行M].[行ID]'             │
│                 + ') AS [' + CONVERT([varchar], [列ID]) + ']'              │
│        FROM [列M]                                                         │
│        ORDER BY [列順];                                                    │
│    SET @sql1 = 'SELECT [行M].[行順],'                                     │
│              + '       [行M].[行ID],'                                     │
│              + @sql1                                                       │
│              + '    FROM [行M]';                                          │
│    -- ---------------------------------------------------------------------│
│    --   統合                                                               │
│    -- ---------------------------------------------------------------------│
│    SET @sql = 'SELECT *'                                                   │
│             + '    FROM (' + @sql0 + ' UNION ALL ' + @sql1 + ') AS [行列]' │
│             + '    ORDER BY [行順] ASC;';                                  │
│    EXECUTE (@sql);                                                         │
│GO;                                                                         │
└──────────────────────────────────────┘

なお、[列ID]が文字列の場合は以下に変更。
┌──────────────────────────────────────┐
│                 + '     WHERE [行列D].[列ID] = '                          │
│                                                + CONVERT([varchar], [列ID])│
└──────────────────────────────────────┘
  ↓
┌──────────────────────────────────────┐
│                 + '     WHERE [行列D].[列ID]                              │
│                                          = ' + CHAR(39) + [列ID] + CHAR(39)│
└──────────────────────────────────────┘
分類:MSSQL
Oracle/年月表(年度版)
2018年02月06日
年度版(4月~翌3月)。
┌──────────────────────────────────────┐
│WITH "年月D" AS (                                                          │
│    SELECT "年",                                                            │
│           "月",                                                            │
│           COUNT(*) AS "値"                                                 │
│        FROM (                                                              │
│            SELECT "年"                                                     │
│                   "月"                                                     │
│                FROM "表"                                                   │
│        )                                                                   │
│        GROUP BY "年",                                                      │
│                 "月"                                                       │
│)                                                                           │
│SELECT *                                                                    │
│    FROM (                                                                  │
│        SELECT CASE                                                         │
│                 WHEN "カレンダM"."月" < 4 THEN "カレンダM"."年" - 1      │
│                 ELSE                            "カレンダM"."年"          │
│               END AS "年度",                                               │
│               CASE                                                         │
│                 WHEN "カレンダM"."月" < 4 THEN "カレンダM"."月" + 12     │
│                 ELSE                            "カレンダM"."月"          │
│               END AS "月",                                                 │
│               NVL("年月D"."値", 0) AS "値"                                │
│            FROM (                                                          │
│                SELECT "年"."年",                                           │
│                       "月"."月"                                            │
│                    FROM (                                                  │
│                        SELECT 開始年度 + ROWNUM - 1  AS "年"               │
│                            FROM DUAL                                       │
│                                CONNECT BY ROWNUM <= 終了年度 - 開始年度 + 2│
│                    ) "年"                                                  │
│                        CROSS JOIN (                                        │
│                            SELECT ROWNUM AS "月"                           │
│                                FROM DUAL CONNECT BY ROWNUM <= 12           │
│                        ) "月"                                              │
│            ) "カレンダM"                                                  │
│                LEFT JOIN "年月D"                                          │
│                  ON  "年月D"."年" = "カレンダM"."年"                     │
│                  AND "年月D"."月" = "カレンダM"."月"                     
│    ) "集計D"                                                              │
│     PIVOT (                                                                │
│        SUM("値") FOR "月" IN ( 4 AS  "4月",                                │
│                                5 AS  "5月",                                │
│                                6 AS  "6月",                                │
│                                7 AS  "7月",                                │
│                                8 AS  "8月",                                │
│                                9 AS  "9月",                                │
│                               10 AS "10月",                                │
│                               11 AS "11月",                                │
│                               12 AS "12月",                                │
│                               13 AS  "1月",                                │
│                               14 AS  "2月",                                │
│                               15 AS  "3月")                                │
│    ) "ピボット"                                                            │
│    WHERE "年度" BETWEEN 開始年度 AND 終了年度                              │
│    ORDER BY "年度" ASC;                                                    │
└──────────────────────────────────────┘
  ・「開始年度」と「終了年度」の部分はそれぞれの数値に置き換える
  ・「年月D」の中身を変えれば、元データをいろいろなものにできる
分類:Oracle
前へ 1 2 次へ