MW211 EXIT

devlog
ExcelVBA/MSSQLのトランザクション処理
2014年08月31日
下記のような流れとなる。
┌──────────────────────────────────────┐
│    Dim データベース As New ADODB.Connection                                │
│    Dim テーブル As New ADODB.Recordset                                     │
│    ────────────────────────────────────│
│    ' トランザクション開始                                                  │
│    データベース.connectionString = (省略)                                  │
│    データベース.Open                                                       │
│    On Error GoTo トランザクション中にエラー発生                            │
│    データベース.BeginTrans                                                 │
│    ────────────────────────────────────│
│    ' テーブル更新                                                          │
│    テーブル.ActiveConnection = データベース                                │
│    テーブル.Source = "テーブル名"                                          │
│    テーブル.CursorType = adOpenKeyset                                      │
│    テーブル.LockType = adLockOptimistic                                    │
│    テーブル.Open                                                           │
│    テーブル.Filter = "[キー]='" & キー                                     │
│    テーブル.Fields("更新項目").Value = 値                                  │
│    テーブル.Update                                                         │
│    テーブル.Close                                                          │
│    ────────────────────────────────────│
│    ' トランザクション完了                                                  │
│    データベース.CommitTrans                                                │
│    データベース.Close                                                      │
│    Set テーブル = Nothing                                                  │
│    Set データベース = Nothing                                              │
│    Exit Sub                                                                │
├──────────────────────────────────────┤
│トランザクション中にエラー発生:                                             │
│    ' ロールバック                                                          │
│    MsgBox "エラー発生!"                                                   │
│    データベース.RollbackTrans                                              │
│    データベース.Close                                                      │
│    Set テーブル = Nothing                                                  │
│    Set データベース = Nothing                                              │
└──────────────────────────────────────┘
自前でトランザクションのSQL文を発行するよりも
用意されているメソッドに従ってやった方がいいようだ。
(SQL文発行だとうまく行かなかった)
分類:ExcelVBA
ExcelVBA/ボタンのセル座標
2014年08月23日
押されたボタンのセルにおける座標を求める方法。

ボタン左上が属すセルのX座標とY座標は以下の通り。
x = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Column
y = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row

ボタン右下が属すセルのX座標とY座標は以下の通り。
x = ActiveSheet.Shapes(Application.Caller).BottomRightCell.Column
y = ActiveSheet.Shapes(Application.Caller).BottomRightCell.Row

残念ながら、左下(BottomLeft)と右上(TopRight)はないようだ。
分類:ExcelVBA
ExcelVBA/複合論理演算子のわな
2014年08月20日
普通、以下のルールがある。
  ・「① AND ②」 …  ①が偽なら(偽なので)、②以降は判定しない
  ・「① OR ②」  …  ①が真なら(真なので)、②以降は判定しない
これを利用して、①で、②で判定する予定の変数の存在チェックなんかをして
うまいことやることができる。

しかし、ExcelVBAの「And」や「Or」では、
無条件に全ての条件式を(つまり②以降も)判定してしまうので、これが効かない。

VBA.netでは「AndAlso」や「OrElse」といったこれを実現する
論理演算子が追加されたが、ExcelVBAでは未実装なので
この事実を考慮してコーディングする必要があるようだ。
分類:ExcelVBA
ExcelVBA/追加したボタンのイベント登録
2014年08月18日
「.OnAction」メソッドに関数名を文字列として登録する。
┌──────────────────────────────────────┐
│With ThisWorkbook.Worksheets("Sheet1")                                      │
│    With .Buttons.Add(Left, Top, Width, Height)                             │
│        .OnAction = "'clickAction(" & y * 100 + x & ")'"                    │
│    End With                                                                │
│End With                                                                    │
├──────────────────────────────────────┤
│Sub clickAction(z As Long)                                                  │
│    MsgBox z                                                                │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/セルに沿ってのボタン追加
2014年08月17日
以下のような感じ。(「x」と「y」は適宜座標の値を入れればよい)
┌──────────────────────────────────────┐
│With ThisWorkbook.Worksheets("Sheet1")                                      │
│    With .Buttons.Add(.Cells(y, x).Left, _                                  │
│                      .Cells(y, x).Top, _                                   │
│                      .Cells(y, x).Width, _                                 │
│                      .Cells(y, x).Height)                                  │
│        .Name = "button" & Format(y * 100 + x, "0000")                      │
│        .Font.Name = "MS ゴシック"                                        │
│        .Font.Size = 9                                                      │
│        .Text = "ボタン"                                                    │
│    End With                                                                │
│End With                                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/オートフィルタを解除する
2014年08月16日
基本は以下の通り。
┌──────────────────────────────────────┐
│Worksheets.AutoFilterMode = False                                           │
└──────────────────────────────────────┘

「Worksheets」を部分を、以下のようにファイル内ループで全シートとかにすれば
一括解除できる。
┌──────────────────────────────────────┐
│Dim objSheet As Object                                                      │
│Dim sh As Worksheet                                                         │
│For Each sh In ThisWorkbook                                                 │
│    sh.AutoFilterMode = False                                               │
│Next sh                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
VBA/オブジェクトの始末
2014年08月15日
オブジェクトを作ったら、最後いや用無しになった段階で
「Nothing」を代入して解放してあげましょうね。
┌──────────────────────────────────────┐
│Set オブジェクト = Nothing                                                  │
└──────────────────────────────────────┘

以下のようにやってあげれば丁寧かも。
┌──────────────────────────────────────┐
│If オブジェクト IsNot Nothing Then Set オブジェクト = Nothing               │
├──────────────────────────────────────┤
│If Not オブジェクト Is Nothing Then Set オブジェクト = Nothing              │
└──────────────────────────────────────┘
いや、無駄か。う~ん、わからん。ただ単に無条件で代入してあげても問題ないかも。
分類:ExcelVBA
ExcelVBA/ActiveXコントロール部品の設定
2014年08月13日
「デザインモード」にした上で右クリックで「プロパティ」を編集する

共通の代表的なプロパティ
・フォント  …フォントタイプのみ代表的に表示されるが
              詳細設定でフォントサイズも変更できる

ボタンの代表的なプロパティ
・Caption  …ボタンのラベル名

コンボボックス(プルダウンメニュー)の代表的なプロパティ
・Style=2(fmStyleDropDownList)  …入力禁止にする
分類:ExcelVBA
ExcelVBA/ボタンを追加する
2014年08月12日
「開発タブ」の「挿入」。
分類:ExcelVBA
ExcelVBA/データ範囲の縮小
2014年08月10日
以下のように「.SpecialCells(xlLastCell)」を使うと、
「Ctrl+End」と同じ挙動となる。
┌──────────────────────────────────────┐
│Cells(1, 1).SpecialCells(xlLastCell)                                        │
└──────────────────────────────────────┘
「Cells(1, 1).SpecialCells(xlLastCell).Row」という風にすると
空行を跨いだ最後の行を調査できるので便利だ。
つまり、「.SpecialCells(xlLastCell)」は
データのある範囲の末尾に行けるということだ。

但し、一度、末尾の方に値を入力すると、それを削除しても
データのある範囲は縮小されない。
ファイルを保存する時に再計算されるのだ。

よって、「.Cells.Clear」だけでは元あったデータの範囲が残ってしまうということだ。

これでは困る場合、ファイルを保存すれば解決する訳だが
そんなことのためにファイルにアクセスしたくはない。

その解決方法の裏技。
「.UsedRange.Row」をシートに対して使ってあげればいい。
ということで、以下のようなダミー処理を実行すればいいらしい。
┌──────────────────────────────────────┐
│ダミー変数 = UsedRange.Row                                                  │
└──────────────────────────────────────┘

ま、たいていは範囲の境目とかを検索する時に再計算したくなるものだから
以下のようにダミーの代入処理をかましてやればいいのかもしれない。
┌──────────────────────────────────────┐
│With ThisWorkbook.ActiveSheet                                               │
│    y = .UsedRange.Row  'ダミー処理                                         │
│    y = .Cells(1, 1).SpecialCells(xlLastCell).Row                           │
│End With                                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
前へ 1 … 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 次へ