MW211 EXIT

devlog
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
ExcelVBA/ActiveXコントロールのCaption
2019年09月12日
シート内のActiveXコントロールをループする処理は以下の通り。
┌──────────────────────────────────────┐
│Dim 図形 As Object                                                          │
│With ActiveSheet                                                            │
│    For Each 図形 In .Shapes                                                │
│        If 図形.Type = msoOLEControlObject Then                             │
│            Debug.Print 図形.Name                                           │
│        End If                                                              │
│    Next 図形                                                               │
│End With                                                                    │
└──────────────────────────────────────┘

じゃということで、ラベルのキャプションを取得しようとしたらエラーとなる。
┌──────────────────────────────────────┐
│Dim 図形 As Object                                                          │
│With ActiveSheet                                                            │
│    For Each 図形 In .Shapes                                                │
│        If 図形.Type = msoOLEControlObject Then                             │
│            Debug.Print 図形.Caption                                        │
│        End If                                                              │
│    Next 図形                                                               │
│End With                                                                    │
└──────────────────────────────────────┘

以下だとOKのようだ。
┌──────────────────────────────────────┐
│Dim 図形 As Object                                                          │
│With ActiveSheet                                                            │
│    For Each 図形 In .Shapes                                                │
│        If 図形.Type = msoOLEControlObject Then                             │
│            Debug.Print 図形.OLEFormat.Object.Object.Caption                │
│        End If                                                              │
│    Next 図形                                                               │
│End With                                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ActiveXが存在するか?
2019年09月11日
例えば、特定のラベルの値(キャプション)を取得する場合に
そのラベルが存在しない場合にはエラーとなる。

これを回避するには事前に存在チェックする必要がある。

しかし、その存在チェックは簡単にはできない。

以下のようにActiveXコントロールを検索し
該当する名称のものがあるかいないかで判断する形となる。
┌──────────────────────────────────────┐
│Dim 図形 As Shape                                                           │
│With シート                                                                 │
│    For Each 図形 In .Shapes                                                │
│        If 図形.Type = msoOLEControlObject Then                             │
│            MsgBox 図形.Name                                                │
│        End If                                                              │
│    Next 図形                                                               │
│End With                                                                    │
└──────────────────────────────────────┘
自前のサブ関数を作るのがよいだろう。
分類:ExcelVBA
ExcelVBA/引数を配列にする方法
2019年09月10日
┌──────────────────────────────────────┐
│Call 関数(Array("a", "b", "c"))                                             │
├──────────────────────────────────────┤
│Public Sub 関数(ByVal 引数 As Variant)                                      │
│    Dim 値 As Variant                                                       │
│    For Each 値 In 引数                                                     │
│        MsgBox 値                                                           │
│    Next 値                                                                 │
│End Sub                                                                     │
└──────────────────────────────────────┘
基本的に配列で渡してVariant型で受ければよい。

ParamArrayオプションを付けると引数自体を配列(可変)にすることもできる。
┌──────────────────────────────────────┐
│Call 関数("a", "b", "c")                                                    │
├──────────────────────────────────────┤
│Public Sub 関数(ParamArray 引数() As Variant)                               │
│    Dim 値 As Variant                                                       │
│    For Each 値 In 引数                                                     │
│        MsgBox 値                                                           │
│    Next 値                                                                 │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ExcelのRange型からCells型への変換
2019年09月07日
ということでExcelVBA版を作った。いい感じ。
┌──────────────────────────────────────┐
│Public Sub セル範囲変換Range→Cells()                                       │
│    Dim theCell As Range                                                    │
│    Dim theMatches As Object, theMatch  As Object                           │
│    Dim REG As Object                                                       │
│    Set REG = CreateObject("VBScript.RegExp")                               │
│    REG.Global = False                                                      │
│    For Each theCell In Selection                                           │
│        ' Range("A1")形式を置換                                             │
│        REG.Pattern = "Range\(""([A-Z]+)(\d+)""\)"                          │
│        Do While REG.Test(theCell.Value)                                    │
│            Set theMatches = REG.Execute(theCell.Value)                     │
│            For Each theMatch In theMatches                                 │
│                theCell.Value = REG.Replace( _                              │
│                    theCell.Value, _                                        │
│               "Cells($2, " & Columns(theMatch.SubMatches(0)).Column & ")" _│
│                )                                                           │
│            Next theMatch                                                   │
│        Loop                                                                │
│        ' Range("A1:B2")形式を置換                                          │
│        REG.Pattern = "Range\(""([A-Z]+)(\d+):([A-Z]+)(\d+)""\)"            │
│        Do While REG.Test(theCell.Value)                                    │
│            Set theMatches = REG.Execute(theCell.Value)                     │
│            For Each theMatch In theMatches                                 │
│                theCell.Value = REG.Replace( _                              │
│                    theCell.Value, _                                        │
│                    "Range(" _                                              │
│      & "Cells($2, " & Columns(theMatch.SubMatches(0)).Column & ")" & ", " _│
│      & "Cells($4, " & Columns(theMatch.SubMatches(2)).Column & ")" & ")" _ │
│                )                                                           │
│            Next theMatch                                                   │
│        Loop                                                                │
│    Next theCell                                                            │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
秀丸/ExcelのRange型からCells型への変換
2019年09月06日
┌──┬───────────────────────────────────┐
│検索│Range\("([A-Z]+)(\d+):([A-Z]+)(\d+)"\)                                │
├──┼───────────────────────────────────┤
│置換│Range(Cells(\2, \1), Cells(\4, \3))                                   │
└──┴───────────────────────────────────┘
「Range("A2:C4")」→「Range(Cells(2, A), Cells(4, C))」

ここまではできた

ABC…を123…に変換するところで行き詰ったので、これ以上はVBAでやることにした。
「変換関数(\1)」みたいなことができりゃいいんだけどね
分類:秀丸エディタ
前へ 1 次へ