MW211 EXIT

devlog
ExcelVBA/サブウインドウを開きつつ
2014年12月11日
サブウインドウを開きつつメインウインドウをいじりたい場合。

┌──────────────────────────────────────┐
│UserForm.Show                                                               │
└──────────────────────────────────────┘
通常は、サブウインドウが前面に表示されると奥にあるメインウインドウには
アクセスできない。
それはそれで使えるのだが、同時並行でメインウインドウも使いたい場合。

以下のように「vbModeless」をつける。
┌──────────────────────────────────────┐
│UserForm.Show vbModeless                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ユーザ名とコンピュータ名を取得する
2014年12月09日
┌──────────────────────────────────────┐
│Private Function getユーザ名() As String                                    │
│    Dim objWSH As Object                                                    │
│    Set objWSH = CreateObject("WScript.Network")                            │
│    getユーザ名 = objWSH.UserName & "[" & objWSH.ComputerName & "]"         │
│End Function                                                                │
└──────────────────────────────────────┘
上記のような感じ。
「ユーザ名[コンピュータ名]」で取得できる。
分類:ExcelVBA
ExcelVBA/プルダウンで入力可不可
2014年12月06日
プルダウンメニュー(ComboBox)で、直接入力を可とするか否かの設定
┌────┬─────────────────────────────────┐
│入力可  │UserForm.ComboBox.Style = fmStyleDropDownCombo                    │
├────┼─────────────────────────────────┤
│入力不可│UserForm.ComboBox.Style = fmStyleDropDownList                     │
└────┴─────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/起動直後のブレークポイント
2014年12月04日
ExcelVBAでデバッグする時にブレークポイントを設定するが
「ThisWorkbook」などで起動直後に動作するプログラムに設定するのが難しい。
なぜなら、ブレークポイントは保存されず
エディタで設定しようとすると、エディタを起動するまでに動作済みとなるため
捕捉ができないからだ。

そんな時に便利なのが「Stop」命令。
┌──────────────────────────────────────┐
│Stop                                                                        │
└──────────────────────────────────────┘
プログラム中に記述して、保存すれば、起動時にそこで止まってくれるのだ。
いわば、ブレークポイントを保存する機能のようなもんだ。
分類:ExcelVBA
ExcelVBA/あいまい判定
2014年11月26日
通常の判定は以下の通り。
┌──────────────────────────────────────┐
│If 変数 = "キーワード" Then                                                 │
│    MsgBox "該当あり"                                                       │
│End If                                                                      │
└──────────────────────────────────────┘

これをあいまい判定する場合には「Like」を使う。
┌──────────────────────────────────────┐
│If 変数 Like "*キーワード*" Then                                            │
│    MsgBox "該当あり"                                                       │
│End If                                                                      │
└──────────────────────────────────────┘
SQLのLike判定ライクだ。
分類:ExcelVBA
ExcelVBA/INIファイルの読み書き
2014年11月23日
クラス化すると以下のような感じ。
┌──────────────────────────────────────┐
│ClassINI.cls                                                                │
├──────────────────────────────────────┤
│Option Explicit                                                             │
│'***************************************************************************│
│'  クラス:INIファイル                                                      │
│'***************************************************************************│
│Private mINIファイル As String                                              │
│Private m環境名 As String                                                   │
│'===========================================================================│
│'  宣言:INIファイルアクセス関数(API)                                       │
│'===========================================================================│
│Private Declare Function GetPrivateProfileString Lib "kernel32" _           │
│    Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, _  │
│                                      ByVal lpKeyName As Any, _             │
│                                      ByVal lpDefault As String, _          │
│                                      ByVal lpReturnedString As String, _   │
│                                      ByVal nSize As Long, _                │
│                                      ByVal lpFileName As String) As Long   │
│Private Declare Function WritePrivateProfileString Lib "kernel32" _         │
│    Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, _│
│                                        ByVal lpKeyName As Any, _           │
│                                        ByVal lpString As Any, _            │
│                                        ByVal lpFileName As String) As Long │
│'===========================================================================│
│'  コンストラクタ                                                           │
│'===========================================================================│
│Private Sub Class_Initialize()                                              │
│End Sub                                                                     │
│'===========================================================================│
│'  メソッド:準コンストラクタ                                               │
│'===========================================================================│
│Public Sub 準コンストラクタ(ByVal INIファイル As String)                    │
│    If InStr(INIファイル, "\") = 0 Then                                     │
│        mINIファイル = Application.ThisWorkbook.Path & "\" & INIファイル    │
│    Else                                                                    │
│        mINIファイル = INIファイル                                          │
│    End If                                                                  │
│End Sub                                                                     │
│'===========================================================================│
│'  デストラクタ                                                             │
│'===========================================================================│
│Private Sub Class_Terminate()                                               │
│End Sub                                                                     │
│'===========================================================================│
│'  メソッド:参照                                                           │
│'===========================================================================│
│Public Function getter(ByVal セクション As String, _                        │
│                       ByVal キー As String, _                              │
│                       ByVal 既定値 As String) As String                    │
│    Dim ファイル名 As String                                                │
│    Dim リターンコード As Long                                              │
│    Dim 取得値 As String                                                    │
│    取得値 = Space$(256)                                                    │
│    リターンコード = GetPrivateProfileString(セクション, _                  │
│                                             キー, _                        │
│                                             既定値, _                      │
│                                             取得値, _                      │
│                                             255, _                         │
│                                             mINIファイル)                  │
│    If リターンコード > 0 Then                                              │
│        If InStr(取得値, Chr$(0)) > 0 Then                                  │
│            getter = Left$(取得値, InStr(取得値, Chr$(0)) - 1)              │
│        Else                                                                │
│            getter = ""                                                     │
│        End If                                                              │
│    Else                                                                    │
│        getter = 既定値                                                     │
│    End If                                                                  │
│End Function                                                                │
│'===========================================================================│
│'  メソッド:設定                                                           │
│'===========================================================================│
│Public Function setter(ByVal セクション As String, _                        │
│                       ByVal キー As String, _                              │
│                       ByVal 設定値 As String) As Long                      │
│    Dim ファイル名 As String                                                │
│    Dim リターンコード As Long                                              │
│    リターンコード = WritePrivateProfileString(セクション, _                │
│                                               キー, _                      │
│                                               設定値, _                    │
│                                               mINIファイル)                │
│    setter = リターンコード                                                 │
│End Function                                                                │
│'***************************************************************************│
└──────────────────────────────────────┘
以下のような感じで実行できる
┌──────────────────────────────────────┐
│Option Explicit                                                             │
│Public Sub 実行()                                                           │
│    Dim objINI As New ClassINI                                              │
│    Call objINI.準コンストラクタ("環境設定.ini")                            │
│    MsgBox objINI.getter("DB", "SERVER_NAME", "既定値")                     │
│    Call objINI.setter("DB", "SERVER_NAME", "設定値")                       │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/Variant型の比較
2014年11月16日
Variant型に値を代入等して比較等した結果。
┌──┬─────┬─────┬─────┬─────┬─────┬─────┐
│値\│= 0       │= 1       │= ""      │= "a"     │IsEmpty() │= Empty   │
├──┼─────┼─────┼─────┼─────┼─────┼─────┤
│未入│   ○真   │   ×偽   │   ○真   │   ×偽   │   ○真   │   ○真   │
├──┼─────┼─────┼─────┼─────┼─────┼─────┤
│   0│   ○真   │   ×偽   │   ×偽   │   ×偽   │   ×偽   │   ○真   │
├──┼─────┼─────┼─────┼─────┼─────┼─────┤
│   1│   ×偽   │   ○真   │   ×偽   │   ×偽   │   ×偽   │   ×偽   │
├──┼─────┼─────┼─────┼─────┼─────┼─────┤
│""  │   ×偽   │   ×偽   │   ○真   │   ×偽   │   ×偽   │   ○真   │
├──┼─────┼─────┼─────┼─────┼─────┼─────┤
│"a" │   ×偽   │   ×偽   │   ×偽   │   ○真   │   ×偽   │   ×偽   │
├──┼─────┼─────┼─────┼─────┼─────┼─────┤
│Null│   ×偽   │   ×偽   │   ×偽   │   ×偽   │   ×偽   │   ×偽   │
└──┴─────┴─────┴─────┴─────┴─────┴─────┘
┌──┬─────┬───────────┬─────┐
│値\│IsNull()  │= vbNullString        │Is Nothing│
├──┼─────┼───────────┼─────┤
│未入│   ×偽   │         ○真         │ (エラー) │
├──┼─────┼───────────┼─────┤
│   0│   ×偽   │         ×偽         │ (エラー) │
├──┼─────┼───────────┼─────┤
│   1│   ×偽   │         ×偽         │ (エラー) │
├──┼─────┼───────────┼─────┤
│""  │   ×偽   │         ○真         │ (エラー) │
├──┼─────┼───────────┼─────┤
│"a" │   ×偽   │         ×偽         │ (エラー) │
├──┼─────┼───────────┼─────┤
│Null│   ○真   │         ×偽         │ (エラー) │
└──┴─────┴───────────┴─────┘
┌──┬─────┬───────────┐
│値\│  Len()   │      VarType()       │
├──┼─────┼───────────┤
│未入│     0    │     0(vbEmpty)       │
├──┼─────┼───────────┤
│   0│     1    │     2(vbInteger)     │
├──┼─────┼───────────┤
│   1│     1    │     2(vbInteger)     │
├──┼─────┼───────────┤
│""  │     0    │     8(vbString)      │
├──┼─────┼───────────┤
│"a" │     1    │     8(vbString)      │
├──┼─────┼───────────┤
│Null│   Null   │     1(vbNull)        │
└──┴─────┴───────────┘
分類:ExcelVBA
ExcelVBA/IsEmpty関数の罠
2014年11月10日
「IsEmpty()」は「0」や「""」(長さ0の文字列)を比較する関数ではなく
未初期化(定義後一度も代入していない)を判定する関数なのだ。
┌──────────────────────────────────────┐
│Dim 変数 As Variant                                                         │
│MsgBox IsEmpty(変数) ' →True                                               │
│変数 = 0                                                                    │
│MsgBox IsEmpty(変数) ' →False                                              │
└──────────────────────────────────────┘
分類:注意、ExcelVBA
ExcelVBA/Gotoの謎
2014年11月02日
「Application.Goto」が、Excelファイルを開き直すと
なぜか「Application.GoTo」(Tが大文字)になるファイルがある。

そのファイルは「Goto」と入力すると、ファイルを閉じるまでは
おとなしく「Goto」でいてくれるのだけど、ファイルを開き直すと「GoTo」になる。
「GoTo」と入力してもその瞬間は「Goto」になるくせにだ。

VisualStudioの誤認?いやいや参照設定の優先順位とかの問題?
分類:ExcelVBA
ExcelVBA/更新系プレースホルダ
2014年10月31日
┌──────────────────────────────────────┐
│Dim データベース As New ADODB.Connection                                    │
│Dim キー As Long                                                            │
├──────────────────────────────────────┤
│データベース.Execute "UPDATE 表" _                                          │
│                   & "    SET 列 = 値" _                                    │
│                   & "    WHERE キー = " & キー & ";"                       │
└──────────────────────────────────────┘
上記のような更新処理をプレースホルダ処理に置き換えると以下のようになる。
┌──────────────────────────────────────┐
│Dim データベース As New ADODB.Connection                                    │
│Dim キー As Long                                                            │
├──────────────────────────────────────┤
│Const SQL文 As String = "UPDATE 表" _                                       │
│                      & "    SET 列 = 値" _                                 │
│                      & "    WHERE キー = ?;"                               │
│Dim SQLコマンド As New ADODB.Command                                        │
│With SQLコマンド                                                            │
│    .CommandText = SQL文                                                    │
│    .Parameters.Append .CreateParameter("キー", adInteger, adParamInput)    │
│    .ActiveConnection = データベース                                        │
│    .Parameters("キー") = キー                                              │
│    .Execute                                                                │
│End With                                                                    │
│Set SQLコマンド = Nothing                                                   │
└──────────────────────────────────────┘
分類:ExcelVBA
前へ 1 … 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 次へ