MW211 EXIT

devlog
ExcelVBA/進捗表示
2015年07月09日
進捗状況を確認したい場合、いちいちメッセージダイアログを開くと
閉じる作業が必要になり、全然自動化じゃなくなってしまう。

そこで、ステータスバーに出しまくるという方法を使うと便利。
┌──────────────────────────────────────┐
│Application.StatusBar = "メッセージ"                                        │
└──────────────────────────────────────┘

上書しまくりOKで、最後にメッセージを消去したい場合には、以下の様にする。
┌──────────────────────────────────────┐
│Application.StatusBar = False                                               │
└──────────────────────────────────────┘

なお、処理が重くなると、表示も固まってしまいがちなので
こういった場合は「DoEvents」と併用した方がよいようだ。
┌──────────────────────────────────────┐
│DoEvents                                                                    │
│Application.StatusBar = "メッセージ"                                        │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/引数の省略
2015年06月27日
┌──────────────────────────────────────┐
│CREATE FUNCTION [dbo].[関数](                                               │
│    @引数   int = 0                                                         │
│) RETURNS @結果 int                                                         │
│AS                                                                          │
│BEGIN                                                                       │
│  :処理                                                                    │
│END;                                                                        │
└──────────────────────────────────────┘
MSSQLのストアドファンクションでは上記のような感じだが(なぜそれを例にする?!)
ExcelVBAの場合は、以下のようか感じである。
┌──────────────────────────────────────┐
│Sub 関数(Optional ByVal 引数 As Long = 0)                                   │
│  :処理                                                                    │
│End Sub                                                                     │
└──────────────────────────────────────┘
引数の先頭に「Optional」修飾子をつけてあげればよい。
分類:ExcelVBA
ExcelVBA/サブルーチン・関数のアクセス
2015年06月23日
┌───────────┬────┬────┬────────────────┐
│       パターン       │外部利用│直接実行│              備考              │
├───────────┼────┼────┼────────────────┤
│Public Sub            │        │        │                                │
├───────────┤   ○   │   ○   ├────────────────┤
│Sub                   │        │        │アクセス修飾子の省略はPublic扱い│
├───────────┼────┼────┼────────────────┤
│Option Private Module │        │        │Option Private Moduleを付けると │
│Public Sub            │        │        │            直接実行できなくなる│
├───────────┤   ○   │   ×   ├────────────────┤
│Public Function       │        │        │引数があると、直接実行はできない│
├───────────┤        │        │                                │
│Function              │        │        │アクセス修飾子の省略はPublic扱い│
├───────────┼────┼────┼────────────────┤
│Private Sub           │        │        │                                │
├───────────┤   ×   │   ×   ├────────────────┤
│Private Function      │        │        │                                │
└───────────┴────┴────┴────────────────┘
分類:ExcelVBA
ExcelVBA/PHPのin_array()代替
2015年06月22日
その要素が配列にあるかを返す関数。「inArray(要素,配列) → TrueかFalse」
┌──────────────────────────────────────┐
│Function inArray(ByVal needle As Variant, _                                 │
│                 ByVal haystack As Variant) As Boolean                      │
│    inArray = (UBound(Filter(haystack, needle)) >= 0)                       │
│End Function                                                                │
└──────────────────────────────────────┘

でも、これだと部分一致検索になってしまうのであった。。。

完全一致検索を実現するには以下のように地道にやるしかないようだ。
┌──────────────────────────────────────┐
│Public Function inArray(ByVal needle As Variant, _                          │
│                        ByVal haystack As Variant) As Boolean               │
│    Dim theValue As Variant                                                 │
│    If IsEmpty(haystack) Then                                               │
│        inArray = False                                                     │
│        Exit Function                                                       │
│    End If                                                                  │
│    For Each theValue In haystack                                           │
│        If needle = theValue Then                                           │
│            inArray = True                                                  │
│            Exit Function                                                   │
│        End If                                                              │
│    Next theValue                                                           │
│    inArray = False                                                         │
│End Function                                                                │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/セルの書式設定
2015年06月21日
「配置/文字の制御/縮小して全体を表示する」の設定
┌──────────────────────────────────────┐
│セル.ShrinkToFit = True                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/オートフィルタ連動マクロ
2015年06月17日
ExcelVBA/オートフィルタ連動マクロ
オートフィルタの設定に伴ってマクロを起動する方法。

オートフィルタ変更イベント的なものはないので
代わりに「SUBTOTAL()」と再計算イベントを複合して対応する。

つまり、「SUBTOTAL()」で行件数を算出するようにして(第一引数=3)、
オートフィルタで行数が変動するのを再計算イベントで捕捉するという感じ。

以下のような形となる。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【全表示の場合】
┌────┬──┬───┬───┬───┬───┐┌────┐
│抽出条件│キー│項目A │項目B │項目C │項目Z ││=SUBTOTAL(3,A:A)
├────┼──┼───┼───┼───┼───┤└────┘
│A       │A1  │あ    │      │      │ん    │
│A       │A2  │あ    │      │      │ん    │
├────┼──┼───┼───┼───┼───┤
│B       │B1  │      │い    │      │ん    │
│B       │B2  │      │い    │      │ん    │
├────┼──┼───┼───┼───┼───┤
│C       │C1  │      │      │う    │ん    │
│C       │C2  │      │      │う    │ん    │
├────┼──┼───┼───┼───┼───┤
│D       │D1  │      │      │      │ん    │
│D       │D2  │      │      │      │ん    │
└────┴──┴───┴───┴───┴───┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【抽出条件を「A」のみにした場合】
┌────┬──┬───┬───┐┌────┐
│抽出条件│キー│項目A │項目Z ││=SUBTOTAL(3,A:A)
├────┼──┼───┼───┤└────┘
│A       │A1  │あ    │ん    │
│A       │A2  │あ    │ん    │
└────┴──┴───┴───┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【抽出条件を「A」と「B」にした場合】
┌────┬──┬───┬───┬───┐┌────┐
│抽出条件│キー│項目A │項目B │項目Z ││=SUBTOTAL(3,A:A)
├────┼──┼───┼───┼───┤└────┘
│A       │A1  │あ    │      │ん    │
│A       │A2  │あ    │      │ん    │
├────┼──┼───┼───┼───┤
│B       │B1  │      │い    │ん    │
│B       │B2  │      │い    │ん    │
└────┴──┴───┴───┴───┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【シートに記述するマクロ】
┌──────────────────────────────────────┐
│Option Explicit                                                             │
│Const X_抽出条件 As Long = 1                                                │
│'===========================================================================│
│'  再計算時のイベント(SUBTOTAL(3,A:A)の設定が必須)                          │
│'    オートフィルタの変更を検出できないため                                 │
│'===========================================================================│
│Private Sub Worksheet_Calculate()                                           │
│    Dim 配列 As Variant                                                     │
│    Dim 判定結果 As Variant                                                 │
│    With ActiveSheet                                                        │
│        If Not .AutoFilterMode Then                     ' フィルタ未設定    │
│            .Columns("A:G").Hidden = False                                  │
│            Exit Sub                                                        │
│        End If                                                              │
│        If .AutoFilter.Filters.Count < X_抽出条件 Then  ' キー列に未設定    │
│            Exit Sub                                                        │
│        End If                                                              │
│        If Not .AutoFilter.Filters(X_抽出条件).On Then  ' 絞り込み未設定    │
│            .Columns("A:G").Hidden = False                                  │
│            Exit Sub                                                        │
│        End If                                                              │
│        ' 抽出条件の配列化                                                  │
│        Select Case .AutoFilter.Filters(X_抽出条件).Count                   │
│            Case 1:                                                         │
│                配列 = Array(.AutoFilter.Filters(X_抽出条件).Criteria1)     │
│            Case 2:                                                         │
│                配列 = Array(.AutoFilter.Filters(X_抽出条件).Criteria1, _   │
│                             .AutoFilter.Filters(X_抽出条件).Criteria2)     │
│            Case Else:                                                      │
│                配列 = .AutoFilter.Filters(X_抽出条件).Criteria1            │
│        End Select                                                          │
│        ' 表示変更                                                          │
│        .Columns("A:G").Hidden = False                                      │
│        判定結果 = Filter(配列, "=A")                                       │
│        If UBound(判定結果) = -1 Then                                       │
│            .Columns("C:C").Hidden = True                                   │
│        End If                                                              │
│        判定結果 = Filter(配列, "=B")                                       │
│        If UBound(判定結果) = -1 Then                                       │
│            .Columns("D:D").Hidden = True                                   │
│        End If                                                              │
│        判定結果 = Filter(配列, "=C")                                       │
│        If UBound(判定結果) = -1 Then                                       │
│            .Columns("E:E").Hidden = True                                   │
│        End If                                                              │
│    End With                                                                │
│End Sub                                                                     │
│'===========================================================================│
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ADODBのNULL
2015年06月07日
ExcelVBAのADODBでストアドプロシージャの引数に「NULL」を指定したい場合は?
┌──────────────────────────────────────┐
│With SQLコマンド                                                            │
│    .ActiveConnection = データベース                                        │
│    .CommandType = adCmdStoredProc                                          │
│    .CommandText = "PROCEDURE_ストアドプロシージャ"                         │
│    .NamedParameters = True                                                 │
│    .Parameters.Append .CreateParameter("@引数", adInteger, adParamInput)   │
│    .Parameters("@引数").Value = Null                                       │
│    .Execute                                                                │
│End With                                                                    │
└──────────────────────────────────────┘
まんま「Null」を代入!
分類:ExcelVBA
ExcelVBA/CopyFromRecordsetは便利だが
2015年04月21日
「.CopyFromRecordset」だとあらかじめ設定していた書式が効かない。

仕方がないので、別途以下みたいな感じで値の貼り付けを行う必要がある。
┌──────────────────────────────────────┐
│With .Columns(1)                                                            │
│    .Value = .Value                                                         │
│    .AutoFit                                                                │
│End With                                                                    │
└──────────────────────────────────────┘

ただ、根本的に解決するには、以下の様に一件ずつ読み込む方式に
変更してしまうのがいいだろう。
┌──────────────────────────────────────┐
│Dim テーブル As New ADODB.Recordset                                         │
├──────────────────────────────────────┤
│Cells(2, 1).CopyFromRecordset テーブル                                      │
└──────────────────────────────────────┘
  ↓
┌──────────────────────────────────────┐
│Dim テーブル As New ADODB.Recordset                                         │
├──────────────────────────────────────┤
│y = 2                                                                       │
│Do Until テーブル.EOF                                                       │
│    For x = 1 To テーブル.Fields.Count                                      │
│        Cells(y, x).Value = テーブル.Fields(x - 1).Value                    │
│    Next x                                                                  │
│    y = y + 1                                                               │
│    テーブル.MoveNext                                                       │
│Loop                                                                        │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ファイル(ブック)の保存
2015年04月20日
作業中のブックを保存するのは以下のような感じ。
┌──────────────────────────────────────┐
│ActiveWorkbook.SaveAs fileName:="出力ファイル.xls", _                       │
│                      FileFormat:=XlFileFormat.xlExcel8                     │
├──────────────────────────────────────┤
│ActiveWorkbook.SaveAs fileName:="出力ファイル.xlsx", _                      │
│                      FileFormat:=XlFileFormat.xlOpenXMLWorkbook            │
└──────────────────────────────────────┘
#上段が「.xls」形式、下段が「.xlsx」形式

保存ダイアログを出してブックを保存するのは以下のような感じ。
┌──────────────────────────────────────┐
│Application.Dialogs(xlDialogSaveAs).Show arg1:="出力ファイル.xls", _        │
│                                         arg2:=XlFileFormat.xlExcel8        │
├──────────────────────────────────────┤
│Application.Dialogs(xlDialogSaveAs).Show arg1:="出力ファイル.xlsx", _       │
│                                         arg2:=XlFileFormat.xlOpenXMLWorkbook
└──────────────────────────────────────┘
#上段が「.xls」形式、下段が「.xlsx」形式

いずれも、最後に保存しないで閉じるとかを組み合わせるだろう。
┌──────────────────────────────────────┐
│ActiveWorkbook.Close SaveChanges:=False                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/行範囲の指定
2015年03月13日
「Rows("1:3")」をR1C1的に指定したい場合。

△「Rows(1 & ":" & 3)」
  →ちょっとカッコ悪い「Columns()」に応用が効かない

×「Rows(1, 3)」
  →こういう指定はできない

×「Rows(Rows(1), Rows(3))」
  →こういう指定はできない

×「Rows(Cells(1,), Cells(3,))」
  →こういう指定はできない

○「Range(Rows(1), Rows(3))」
  →「Range()」を使うことになる
分類:ExcelVBA
前へ 1 … 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 … 27 次へ