MW211 EXIT

devlog
ExcelVBA/複合キーで取得
2017年09月25日
該当なしの場合は、Nullが返る。
┌──────────────────────────────────────┐
│'===============================================================================
│'  サブ関数:getBy複合キー
│'===============================================================================
│Private Function getBy複合キー(ByVal シート As Worksheet, _
│                               ByVal 第一キー As String, _
│                               ByVal 第二キー As String) As Variant
│    Const X第一キー As Long = 1
│    Const X第二キー As Long = 2
│    Const X取得値 As Long = 3
│    Const yMin As Long = 2
│    Dim yMax As Long
│    Dim obj検索 As Range, 検索範囲 As Range, 起点アドレス As String
│    Dim 検索キー As String
│    検索キー = 第一キー
│    検索キー = Replace(検索キー, "~", "~~")
│    検索キー = Replace(検索キー, "*", "~*")
│    検索キー = Replace(検索キー, "?", "~?")
│    With シート
│        yMax = .UsedRange.Rows(.UsedRange.Rows.Count).Row
│        Set 検索範囲 = .Range(.Cells(yMin, X第一キー), .Cells(yMax, X第一キー))
│        Set obj検索 = 検索範囲.Find( _
│            What:=検索キー, _
│            After:=.Cells(yMin, X第一キー), _
│            LookIn:=xlValues, _
│            LookAt:=xlWhole, _
│            SearchOrder:=xlByRows, _
│            SearchDirection:=xlNext, _
│            MatchCase:=True, _
│            MatchByte:=True _
│        )
│        If obj検索 Is Nothing Then
│            getBy複合キー = Null
│            Exit Function
│        End If
│        起点アドレス = obj検索.Address
│        Do
│            If .Cells(obj検索.Row, X第二キー).Value = 第二キー Then
│                getBy複合キー = .Cells(obj検索.Row, X取得値).Value
│                Exit Function
│            End If
│            Set obj検索 = 検索範囲.FindNext(obj検索)
│        Loop Until obj検索.Address = 起点アドレス
│    End With
│    getBy複合キー = Null
│End Function
│'===============================================================================
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/複合キーで置換
2017年09月24日
┌──────────────────────────────────────┐
│'===============================================================================
│'  サブ関数:複合キーで置換
│'===============================================================================
│Private Sub 複合キーで置換(ByVal シート As Worksheet, _
│                           ByVal 第一キー As String, _
│                           ByVal 第二キー As String, _
│                           ByVal 置換値 As String)
│    Const X第一キー As Long = 1
│    Const X第二キー As Long = 2
│    Const X置換項目 As Long = 3
│    Const yMin As Long = 2
│    Dim yMax As Long
│    Dim obj検索 As Range, 検索範囲 As Range, 起点アドレス As String
│    Dim 検索キー As String
│    検索キー = 第一キー
│    検索キー = Replace(検索キー, "~", "~~")
│    検索キー = Replace(検索キー, "*", "~*")
│    検索キー = Replace(検索キー, "?", "~?")
│    With シート
│        yMax = .UsedRange.Rows(.UsedRange.Rows.Count).Row
│        Set 検索範囲 = .Range(.Cells(yMin, X第一キー), .Cells(yMax, X第一キー))
│        Set obj検索 = 検索範囲.Find( _
│            What:=検索キー, _
│            After:=.Cells(yMin, X第一キー), _
│            LookIn:=xlValues, _
│            LookAt:=xlWhole, _
│            SearchOrder:=xlByRows, _
│            SearchDirection:=xlNext, _
│            MatchCase:=True, _
│            MatchByte:=True _
│        )
│        If obj検索 Is Nothing Then
│            Exit Sub
│        End If
│        起点アドレス = obj検索.Address
│        Do
│            If .Cells(obj検索.Row, X第二キー).Value = 第二キー Then
│                .Cells(obj検索.Row, X置換項目).Value = 置換値
│            End If
│            Set obj検索 = 検索範囲.FindNext(obj検索)
│        Loop Until obj検索.Address = 起点アドレス
│    End With
│End Sub
│'===============================================================================
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/純COUNTIF
2017年09月22日
通常のCOUNTIFではワイルドーカード(*や?)が効いてしまい
正しく算出されない場合用の関数。
┌──────────────────────────────────────┐
│'===========================================================================│
│'  内部関数:純COUNTIF                                                      │
│'===========================================================================│
│Private Function 純COUNTIF(ByVal 範囲 As Range, _                           │
│                           ByVal 検索文字 As String) As Long                │
│''''検索文字 = Replace(検索文字, "~", "~~")     ' COUNTIF系では不要         │
│    検索文字 = Replace(検索文字, "*", "~*")                                 │
│    検索文字 = Replace(検索文字, "?", "~?")                                 │
│    純COUNTIF = WorksheetFunction.CountIf(範囲, 検索文字)                   │
│End Function                                                                │
│'===========================================================================│
└──────────────────────────────────────┘
要は「~」を先頭につければ無効化できるという話。
分類:ExcelVBA
ExcelVBA/複合キー重複チェック関数
2017年09月21日
┌──────────────────────────────────────┐
│'===============================================================================
│'  サブ関数:is複合重複
│'===============================================================================
│Private Function is複合重複(ByVal シート As Worksheet, _
│                            ByVal 第一キー As String, _
│                            ByVal 第二キー As String) As Boolean
│    Const X第一キー As Long = 1
│    Const X第二キー As Long = 2
│    Const yMin As Long = 2
│    Dim yMax As Long
│    Dim obj検索 As Range, 検索範囲 As Range, 起点アドレス As String
│    Dim 検索キー As String
│    検索キー = 第一キー
│    検索キー = Replace(検索キー, "~", "~~")
│    検索キー = Replace(検索キー, "*", "~*")
│    検索キー = Replace(検索キー, "?", "~?")
│    With シート
│        yMax = .UsedRange.Rows(.UsedRange.Rows.Count).Row
│        Set 検索範囲 = .Range(.Cells(yMin, X第一キー), .Cells(yMax, X第一キー))
│        Set obj検索 = 検索範囲.Find( _
│            What:=検索キー, _
│            After:=.Cells(yMin, X第一キー), _
│            LookIn:=xlValues, _
│            LookAt:=xlWhole, _
│            SearchOrder:=xlByRows, _
│            SearchDirection:=xlNext, _
│            MatchCase:=True, _
│            MatchByte:=True _
│        )
│        If obj検索 Is Nothing Then
│            is複合重複 = False
│            Exit Function
│        End If
│        起点アドレス = obj検索.Address
│        Do
│            If .Cells(obj検索.Row, X第二キー).Value = 第二キー Then
│                is複合重複 = True
│                Exit Function
│            End If
│            Set obj検索 = 検索範囲.FindNext(obj検索)
│        Loop Until obj検索.Address = 起点アドレス
│    End With
│    is複合重複 = False
│End Function
│'===============================================================================
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ゼロの判定
2017年09月20日
「= 0」で判定すると、空欄も真となるので注意。
┌─────┬───┬───┬───┐
│          │= ""  │= "0" │= 0   │
├───┬─┼───┼───┼───┤
│(不問)│  │  真  │  偽  │  真  │
├───┼─┼───┼───┼───┤
│文字列│' │  真  │  偽  │  偽  │
├───┼─┼───┼───┼───┤
│  数値│ 0│  偽  │  真  │  真  │
├───┼─┼───┼───┼───┤
│文字列│ 0│  偽  │  真  │  真  │
├───┼─┼───┼───┼───┤
│文字列│00│  偽  │  偽  │  真  │
├───┼─┼───┼───┼───┤
│  数値│ 1│  偽  │  偽  │  偽  │
├───┼─┼───┼───┼───┤
│文字列│a │  偽  │  偽  │  偽  │
└───┴─┴───┴───┴───┘
分類:ExcelVBA
ExcelVBA/行末尾に追加コピー
2017年09月12日
例えば、複写元シート(一行目は見出行なので除く)を
複写先シートの末尾(最終行の次の行)にコピペするのは、以下のような感じとなる。
┌──────────────────────────────────────┐
│Dim yMax As Long                                                            │
│With 複写元シート                                                           │
│    yMax = .UsedRange.Rows(.UsedRange.Rows.Count).Row                       │
│    .Range(.Rows(2), .Rows(yMax)).Copy                                      │
│End With                                                                    │
│With 複写先シート                                                           │
│    yMax = .UsedRange.Rows(.UsedRange.Rows.Count).Row                       │
│    .Rows(yMax + 1).PasteSpecial                                            │
│End With                                                                    │
│Application.CutCopyMode = False                                             │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/文字列結合に「+」
2017年08月29日
ExcelVBAでは、「文字列 & 文字列」のように文字列結合は「&」も用いるのが一般的。
でも「文字列 + 文字列」のように「+」で代用もできてしまう。
数値の加算と区別する上でも「&」に統一した方がよい。
分類:ExcelVBA
ExcelVBA/CountIf()で大文字小文字の区別
2017年07月17日
┌──────────────────────────────────────┐
│WorksheetFunction.CountIf(範囲, 値)                                         │
└──────────────────────────────────────┘
上記では、大文字と小文字の区別ができない。

Excel関数なら以下のようにすれば大文字と小文字を区別できる。
┌──────────────────────────────────────┐
│=SUMPRODUCT((EXACT(範囲,値))*1)                                             │
└──────────────────────────────────────┘

しかし、これを、VBAにしようとすると「WorksheetFunction.Exact()」がないので
実装た困難である。

だが、Excel関数を直接実行する「Evaluate()」を使えば実装できなくはない。
┌──────────────────────────────────────┐
│Evaluate("SUMPRODUCT(EXACT(" & 範囲 & "," & Chr(34) & 値 & Chr(34) & ")*1)")│
└──────────────────────────────────────┘
だけど「Evaluate()」は処理速度が遅いのがネックである。

ちなみに範囲の部分は「Selection」だったら「Selection.Address」とかになる。
分類:ExcelVBA
ExcelVBA/デスクトップのパス
2017年07月06日
ファイルをデスクトップへ出力する場合などに、デスクトップのパスを知りたくなるが
その方法は以下の通り。
┌──────────────────────────────────────┐
│Dim objWSH As Object                                                        │
│Set objWSH = CreateObject("WScript.Shell")                                  │
│MsgBox objWSH.SpecialFolders("Desktop")                                     │
└──────────────────────────────────────┘
なお、末尾に「\」はつかないので、続けてファイルを指定する場合には
「\」をはさむ必要がある。
分類:ExcelVBA
ExcelVBA/途中経過の表示
2017年07月05日
大量のデータを処理する場合、現在、どこまで進んでいるか知りたくなる。

そんな場合、以下のように、ステータスバーに件数を表示すればよい。
┌──────────────────────────────────────┐
│For y = 1 To 10000                                                          │
│    If .Rows(y).Row Mod 100 = 0 Then                                        │
│        DoEvents                                                            │
│        Application.StatusBar = .Rows(y).Row                                │
│    End If                                                                  │
│    ' 処理                                                                  │
│Next y                                                                      │
│Application.StatusBar = False  ' 最後に表示をクリア                         │
└──────────────────────────────────────┘
  ・行番号「.Rows(y).Row」を表示するようにしているが、
    もちろんそのまま「y」でもOK。
  ・処理が速めなので、100件ごとに間引いている。
  ・「DoEvents」がないと、途中でステータスバーの表示自体も固まってしまい
    表示されなくなるので、これは必須だ。
分類:ExcelVBA
前へ 1 … 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 … 27 次へ