MW211 EXIT

devlog
ExcelVBA/ダイアログでファイルを選択
2015年03月11日
ダイアログでファイルを選択する、単純な例(雛形)。
┌──────────────────────────────────────┐
│Sub ファイルを開く()                                                        │
│    Dim ファイル名 As Variant                                               │
│    ファイル名 = Application.GetOpenFilename( _                             │
│                     FileFilter:="Microsoft Excelブック,*.xls?", _          │
│                     FilterIndex:=1, _                                      │
│                     Title:="ファイルを選択してください", _                 │
│                     MultiSelect:=False _                                   │
│                 )                                                          │
│    MsgBox ファイル名                                                       │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ストアドプロシージャReadもクローズが必要
2015年03月02日
ExceVBAでADODBを使ってアクセスする場合、オープン処理というのを行う。
なので、クローズ処理というのが対応して必要になる。
(プロセスを終了してしまえばクローズ処理は端折れるのだがなんか気持ち悪い)

で、ストアドプロシージャについては、「adCmdStoredProc」を指定することにより
専用処理を使用することができる。
これも「.Execute」をテーブルオブジェクトに代入すれば
Openした場合と同じように操作できる。

で、疑問なのだが、後者の場合、Close処理は必要なのだろうか?

これを解決するために、オープン状態を確認するデバッグ文を仕込んでみた。

その結果、後者の場合もオープン状態はオープン中だということがわかる。
ということで、後者も前者と同じ様にクローズ処理を実装した方がよさそうだ。

ちなみに、実験したのは、以下のような感じの処理
(グローバル変数(メンバ変数)の設定処理は省略して記載)
┌──────────────────────────────────────┐
│Private mデータベース As New ADODB.Connection                               │
│Private mSQL文 As String                                                    │
├──────────────────────────────────────┤
│Dim テーブル As New ADODB.Recordset                                         │
│Dim SQLコマンド As New ADODB.Command                                        │
│'-(オープン) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -│
│With SQLコマンド                                                            │
│    .ActiveConnection = mデータベース                                       │
│    .CommandText = mSQL文                                                   │
│End With                                                                    │
│テーブル.Open SQLコマンド                                                   │
│If mテーブル.State = adStateClosed Then                                     │
│    MsgBox "エラー", vbCritical                                             │
│    ' エラー処理                                                            │
│    Exit Sub                                                                │
│End If                                                                      │
│MsgBox テーブル.State   ' オープン状態のの確認 → 1(adStateOpen)=オープン中│
│'-(参照処理) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -│
│' テーブル.Fields(列名).Value などを参照                                    │
│'-(クローズ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -│
│If テーブル.State <> adStateClosed Then                                     │
│    テーブル.Close                                                          │
│End If                                                                      │
└──────────────────────────────────────┘
┌──────────────────────────────────────┐
│Private mデータベース As New ADODB.Connection                               │
├──────────────────────────────────────┤
│Dim テーブル As New ADODB.Recordset                                         │
│Dim SQLコマンド As New ADODB.Command                                        │
│'-(オープン) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -│
│With SQLコマンド                                                            │
│    .ActiveConnection = mデータベース                                       │
│    .CommandType = adCmdStoredProc                                          │
│    .CommandText = "ストアドプロシージャ"                                   │
│    Set テーブル = .Execute                                                 │
│End With                                                                    │
│MsgBox テーブル.State   ' オープン状態のの確認 → 1(adStateOpen)=オープン中│
│'-(参照処理) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -│
│' テーブル.Fields(列名).Value などを参照                                    │
│'-(クローズ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -│
│If テーブル.State <> adStateClosed Then                                     │
│    テーブル.Close                                                          │
│End If                                                                      │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/今月の頭と末を求める方法
2015年03月01日
以下のような感じ。
┌──────────────────────────────────────┐
│Dim 今月頭 As Date: 今月頭 = DateSerial(今年, 今月    , 1)                  │
├──────────────────────────────────────┤
│Dim 今月末 As Date: 今月末 = DateSerial(今年, 今月 + 1, 0)                  │
└──────────────────────────────────────┘
日に「0」を指定することにより、「-1日」(前日)扱いとなる。
よって、来月の前日を求めれば今月末が求まるということだ。
分類:ExcelVBA
ExcelVBA/ダイアログアイコン
2015年02月20日
┌─┬───────┬─┬─┬──┬─────────────────────┐
│16│vbCritical    │○│×│警告│MsgBox "エラー発生", vbCritical           │
├─┼───────┼─┼─┼──┼─────────────────────┤
│32│vbQuestion    │Q│?│問合│If MsgBox("しますか?", _                 │
│  │              │  │  │    │          vbOKCancel + vbQuestion, _      │
│  │              │  │  │    │          "確認") <> vbOK Then            │
├─┼───────┼─┼─┼──┼─────────────────────┤
│48│vbExclamation │△│!│注意│MsgBox "見直してください", vbExclamation  │
├─┼───────┼─┼─┼──┼─────────────────────┤
│64│vbInformation │Q│i│情報│MsgBox "正常終了", vbInformation          │
└─┴───────┴─┴─┴──┴─────────────────────┘
分類:ExcelVBA
ExcelVBA/Continue文
2015年02月07日
ExcelVBAではContinue文がない。

純粋構造化プログラムの原則に従ってIf文で対処となるが、
とはいえ、Continue文は便利だ。

で、これは禁断のGoTo文で代替するのが最善のようだ。
┌──────────────────────────────────────┐
│For文                                                                       │
│    If 条件 Then                                                            │
│        GoTo Continue                                                       │
│    End If                                                                  │
│    処理                                                                    │
│Continue:                                                                   │
│Next                                                                        │
└──────────────────────────────────────┘

純粋に処理の流れ通りなら、「Continue:」ラベルは前の方がよいかもしれない。
┌──────────────────────────────────────┐
│For文                                                                       │
│Continue:                                                                   │
│    If 条件 Then                                                            │
│        GoTo Continue                                                       │
│    End If                                                                  │
│    処理                                                                    │
│Next                                                                        │
└──────────────────────────────────────┘
しかし、前方へのGoTo文を許すのは、Continue文代替に限ってとしても、
それこそ禁断中の禁断ともいえる(後方ならまだスパゲティコードは避けられる)

よって、前出の対応の方がよいのではないだろうか。
分類:ExcelVBA
ExcelVBA/色の型
2015年01月18日
「RGB()」で指定する色を変数で保持する場合、そのデータ型は何なのか?

┌──────────────────────────────────────┐
│Dim 色 As Long = RGB(255, 255, 255)                                         │
└──────────────────────────────────────┘
Long型でOK。
分類:ExcelVBA
ExcelVBA/EditModeとClose
2015年01月16日
MSSQLとのアクセスにて。

「.EditMode」の値の遷移を以下にまとめた。
┌──────────────────┬────────────┐
│Dim テーブル As New ADODB.Recordset │ テーブル.EditModeの値  │
├──────────────────┼────────────┤
│テーブル.Open …                    │「0(adEditNone)」       │
├──────────────────┤                        │
│テーブル.Fields("列名").Value = 値  ├────────────┤
├──────────────────┤「1(adEditInProgress)」 │
│テーブル.AddNew                     ├────────────┤
├──────────────────┤「2(adEditAdd)」        │
│テーブル.Fields("列名").Value = 値  │                        │
├──────────────────┤                        │
│テーブル.Update                     ├────────────┤
├──────────────────┤「0(adEditNone)」       │
│テーブル.Close                      │                        │
└──────────────────┴────────────┘
値が代入されれば更新モード(「1(adEditInProgress)」)、
「.AddNew」が実行されれば追加モード(「2(adEditAdd)」)となり、
「.Update」で、元(「0(adEditNone)」)に戻るようだ。

「.Close」時に元(「0(adEditNone)」)に戻ってない場合には
エラー(「このコンテキストで操作は許可されていません。」)となってしまう。

よって、「.Update」を漏らさずやるか、
更新失敗等の場合には必ず一次的なロールバック「.CancelUpdate」を
必ず行うこと。

クローズ処理を以下の様にしておけば、たいていは大丈夫だろう。
┌──────────────────────────────────────┐
│If Not (テーブル.BOF Or テーブル.EOF) Then                                  │
│    If テーブル.EditMode = adEditInProgress _                               │
│    Or テーブル.EditMode = adEditAdd Then                                   │
│        テーブル.CancelUpdate                                               │
│    End If                                                                  │
│End If                                                                      │
│If テーブル.State <> adStateClosed Then                                     │
│    テーブル.Close                                                          │
│End If                                                                      │
└──────────────────────────────────────┘

ちなみに削除モード「4(adEditDelete)」ってのもあるのだが
こいつがよくわからない。

「.Delete」の前後では「0(adEditNone)」のままだし、
もちろん「1(adEditInProgress)」とかになっている状況で
「.Delete」をすると「0(adEditNone)」になる。

MSDNの説明は「カレント レコードが削除されたことを示します。」なので
エラー系で発生するというわけでもなさそう。
もちろんトランザクション中でコミット前でも即「0(adEditNone)」になる。
分類:ExcelVBA
ExcelVBA/マクロを起動しない
2014年12月25日
マクロを実行しないでExcelを起動する

→Shiftを押しながら起動する


マクロを強制中断する

→Ctrlを押しながらPauseを押す
分類:ExcelVBA
ExcelVBA/サブウインドウのみの入力にする
2014年12月23日
サブウインドウ(UserFrom)以外の入力ができなくするには、
以下の様にパラメータを設定すればよい。
┌──────────────────────────────────────┐
│UserFrom.ShowModal = True                                                   │
└──────────────────────────────────────┘

逆に、本体のExcelシートが入力できる余地を残すのは以下の設定となる。
┌──────────────────────────────────────┐
│UserFrom.ShowModal = False                                                  │
└──────────────────────────────────────┘

但し、同一サブウインドウを続けて開くと厄介なことになりそうなので
以下のようなガードを入れたりする必要が出てくる。
┌──────────────────────────────────────┐
│If UserForms.Count = 0 Then                                                 │
│    UserForm.Show                                                           │
│End If                                                                      │
└──────────────────────────────────────┘
ま、利用者の柔軟性が高い分、考慮も必要だということだ。
分類:ExcelVBA
ExcelVBA/行列をまるっと移動
2014年12月16日
行列を16×16の範囲でまるっと移動するマクロ。
┌──────────────────────────────────────┐
│Sub 行をまるっと上へ移動()                                                  │
│    With ActiveCell                                                         │
│        If .Row > 1 Then                                                    │
│        .EntireRow.Cut                                                      │
│        .Offset(-1, 0).EntireRow.Insert Shift:=xlDown                       │
│        End If                                                              │
│    End With                                                                │
│End Sub                                                                     │
└──────────────────────────────────────┘
┌──────────────────────────────────────┐
│Sub 行をまるっと下へ移動()                                                  │
│    With ActiveCell                                                         │
│        If .Row < 16 Then                                                   │
│        .EntireRow.Cut                                                      │
│        .Offset(2, 0).EntireRow.Insert Shift:=xlDown                        │
│        End If                                                              │
│    End With                                                                │
│End Sub                                                                     │
└──────────────────────────────────────┘
┌──────────────────────────────────────┐
│Sub 列をまるっと左へ移動()                                                  │
│    With ActiveCell                                                         │
│        If .Column > 1 Then                                                 │
│        .EntireColumn.Cut                                                   │
│        .Offset(0, -1).EntireColumn.Insert Shift:=xlToRight                 │
│        End If                                                              │
│    End With                                                                │
│End Sub                                                                     │
└──────────────────────────────────────┘
┌──────────────────────────────────────┐
│Sub 列をまるっと右へ移動()                                                  │
│    With ActiveCell                                                         │
│        If .Column < 16 Then                                                │
│            .EntireColumn.Cut                                               │
│            .Offset(0, 2).EntireColumn.Insert Shift:=xlToRight              │
│        End If                                                              │
│    End With                                                                │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
前へ 1 … 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 次へ