MW211 EXIT

devlog
ExcelVBA/コンボボックスでユーザフォーム起動
2019年08月20日
┌──────────────────────────────────────┐
│Private Sub ComboBox_Change()                                               │
│    UserForm.Show                                                           │
│End Sub                                                                     │
└──────────────────────────────────────┘
コンボボックスの選択(変更)とともにユーザフォームを起動しようとした場合
コンボボックスが開いたままとなり、さらに選択(変更)できてしまい
エラーを誘発してしまう。

コンボボックスの選択が確定した後にユーザフォームを起動すればよいのだが
それに適うイベントというのが見当たらない

仕方がないので、代案。
敢えてフォーカスを外して閉じてからユーザフォームを起動すればよい。
┌──────────────────────────────────────┐
│Private Sub ComboBox_Change()                                               │
│    Me.Cells(1, 1).Activate     'メニューを閉じるため別にフォーカスをあてる │
│    Me.ComboBox.Activate        '  戻す                                     │
│    UserForm.Show                                                           │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/DB読込時の進捗表示
2019年08月10日
以下のような感じ。
┌──────────────────────────────────────┐
│Dim データベース As New ADODB.Connection                                    │
│Dim テーブル As New ADODB.Recordset                                         │
├──────────────────────────────────────┤
│With データベース                                                           │
│    .ConnectionString = 接続情報                                            │
│    .CursorLocation = adOpenStatic  ' .RecordCountのために静的カーソルを選択│
│    .Open                                                                   │
│End With                                                                    │
├──────────────────────────────────────┤
│Do Until テーブル.EOF                                                       │
│    DoEvents                                                                │
│    Application.StatusBar = "進捗率=" & テーブル.AbsolutePosition _        │
│                                 & "/" & テーブル.RecordCount               │
│Loop                                                                        │
│Application.StatusBar = False                                               │
└──────────────────────────────────────┘
DBオープン時に静的カーソル(adOpenStatic)を選択しないと、
レコード総数(.RecordCount)が取得できないので注意。
現在の位置(.AbsolutePosition)と対比させれば進捗率が出せる。
(上記例は数式を表示しているだけ)
分類:ExcelVBA
ExcelVBA/キーブレイクの例
2019年08月09日
こんな感じ。
┌──────────────────────────────────────┐
│Dim y As Long                                                               │
│Dim oldキー1 As String, newキー1 As String                                  │
│Dim oldキー2 As String, newキー2 As String                                  │
│Dim 総計 As Long, 中計 As Long, 中計 As Long                                │
├──────────────────────────────────────┤
│y = 1                                                                       │
│総計 = 0                                                                    │
│Do Until テーブル.EOF                                                       │
│    '-----------------------------------------------------------------------│
│    中計 = 0                                                                │
│    '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -│
│    oldキー1 = テーブル.Fields("キー1").Value                               │
│    Do                                                                      │
│        '-------------------------------------------------------------------│
│        小計 = 0                                                            │
│        '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -│
│        oldキー2 = テーブル.Fields("キー2").Value                           │
│        Do                                                                  │
│            小計 = 小計 + テーブル.Fields("値").Value                       │
│            中計 = 中計 + テーブル.Fields("値").Value                       │
│            総計 = 総計 + テーブル.Fields("値").Value                       │
│            テーブル.MoveNext                                               │
│            If Not テーブル.EOF Then                                        │
│                newキー1 = テーブル.Fields("キー1").Value                   │
│                newキー2 = テーブル.Fields("キー2").Value                   │
│            End If                                                          │
│        Loop Until テーブル.EOF _                                           │
│                Or newキー1 <> oldキー1 _                                   │
│                Or newキー2 <> oldキー2                                     │
│        '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -│
│        シート.Cells(y, 1).Value = 小計                                     │
│        y = y + 1                                                           │
│        '-------------------------------------------------------------------│
│    Loop Until テーブル.EOF _                                               │
│            Or newキー1 <> oldキー1                                         │
│    '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -│
│    シート.Cells(y, 1).Value = 中計                                         │
│    y = y + 1                                                               │
│    '-----------------------------------------------------------------------│
│Loop                                                                        │
│シート.Cells(y, 1).Value = 総計                                             │
└──────────────────────────────────────┘
VBAの場合「OrElse」がないので、EOFとなった時に
直接「テーブル.Fields("キー1").Value」などをキーブレイク条件に記載すると
「テーブル.EOF(= True)」を飛び越えて参照しにいってしまうためエラーとなる。
この点に注意だ。 
分類:ExcelVBA
ExcelVBA/テキストボックスの自動伸縮
2019年07月30日
テキストボックスのサイズを自動で可変にする設定は以下の通り。
┌──────────────────────────────────────┐
│With シート.TextBox                                                         │
│    .AutoSize = True                                                        │
│    .MultiLine = True                                                       │
│    .WordWrap = False                                                       │
│End With                                                                    │
└──────────────────────────────────────┘
但し、一旦にアクティブにしないと再計算されないようなので
以下のようにアクティブにしてあげる。
┌──────────────────────────────────────┐
│With シート.TextBox                                                         │
│    .Activate                                                               │
│    .SelStart = 0                                                           │
│End With                                                                    │
│シート.Cells(1, 1).Activate                                                 │
└──────────────────────────────────────┘

なお、固定に戻すのは以下のような感じ。(.Heightと.Widthの値は任意)
┌──────────────────────────────────────┐
│With シート.TextBox                                                         │
│    .AutoSize = False                                                       │
│    .MultiLine = True                                                       │
│    .WordWrap = True                                                        │
│    .Height = 100                                                           │
│    .Width = 100                                                            │
│End With                                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/連想配列の全クリアとその判定方法
2019年03月08日
┌──────────────────────────────────────┐
│Dim 連想配列 As Object                                                      │
│Set 連想配列 = CreateObject("Scripting.Dictionary")                         │
├──────────────────────────────────────┤
│連想配列.RemoveAll  ' 全クリア                                              │
├──────────────────────────────────────┤
│If 連想配列.Count = 0 Then                                                  │
│    MsgBox "空っぽ"                                                         │
│End If                                                                      │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/プロジェクトまたはライブラリが見つかりません。
2019年02月19日
【現象】
  新しいExcel(例えばExcel2016)で保存したマクロ付きExcelを
  古いExcel(例えばExcel2010)で開いたら、エラーが発生
  ┌───────────────────────┐
  │コンパイルエラー:                             │
  │プロジェクトまたはライブラリが見つかりません。│
  └───────────────────────┘
【原因】
  参照設定が自動変換されるが、その際に変換できないものがあった
  (当該事象は、ファイルを保存するだけで発生する)
  →「参照設定」ダイアログにて、チェックの入っている参照設定中に
    「参照不可」との文言が混じっているはずで、それが直接の原因
【処置】
  当該チェックをはずせばエラーは解消される
  しかし、当該オブジェクトを参照している箇所が動作しなくなるので
  オブジェクト型を汎用的なものにするなどの工夫が必要
  ┌───┬────────────────────────────────┐
  │改善前│Dim objメーラ New As Outlook.Application                        │
  ├───┼────────────────────────────────┤
  │改善後│Dim objメーラ As Object                                         │
  │      │Set objメーラ = CreateObject("Outlook.Application")             │
  └───┴────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/オートシェイプ画像をフォームへ出力
2019年02月09日
オートシェイプとしてシートに貼り付けられた画像は
そのままフォームには表示できない模様。
一旦、画像ファイルとして出力して、それをフォームに表示する形になる。
しかも画像ファイルとして出力する際には、グラフの貼り付けて保存する形をとる。
┌──────────────────────────────────────┐
│Dim 画像 As Shape, 画像パス As String, 仮グラフ As Variant                  │
│For Each 画像 In ActiveSheet.Shapes                                         │
│    If 画像.Type = 13 Or 画像.Type = 11 Then ' 画像の場合                   │
│        画像パス = ThisWorkbook.Path & "\ダミー.jpg"                        │
│                                                                            │
│        画像.CopyPicture                                                    │
│        Set 仮グラフ = ActiveSheet.ChartObjects.Add(0, _                    │
│                                                    0, _                    │
│                                                    画像.Width, _           │
│                                                    画像.Height).Chart      │
│        仮グラフ.Parent.Select  ' Excel2016特有の不具合対策                 │
│        仮グラフ.Paste                                                      │
│        仮グラフ.Export Filename:=画像パス, filtername:="JPG"               │
│        仮グラフ.Parent.Delete                                              │
│                                                                            │
│        ユーザフォーム.画像.Picture = LoadPicture(m画像パス)                │
│        ユーザフォーム.Show                                                 │
│        Kill 画像パス                                                       │
│        ' ユーザフォーム側でクローズして戻ってくる想定                      │
│    End If                                                                  │
│Next 画像                                                                   │
│MsgBox "おしまい", vbInformation, "終"                                      │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/画像採取
2019年02月04日
ファイルパスかURLを指定したセルを選択して実行すると
右隣りに画像が採取されるマクロ。
┌──────────────────────────────────────┐
│Public Sub 右隣に画像を採取します()                                         │
│    Dim セル As Range                                                       │
│    For Each セル In Selection                                              │
│        If セル.Value <> "" Then                                            │
│            Call 画像追加(セル)                                             │
│        End If                                                              │
│    Next セル                                                               │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Private Sub 画像追加(ByVal セル As Range)                                   │
│    Dim 画像 As Shape                                                       │
│    On Error GoTo l_Catch                                                   │
│    With セル                                                               │
│        Set 画像 = ActiveSheet.Shapes.AddPicture( _                         │
│            Filename:=.Value, _                                             │
│            LinkToFile:=False, _                                            │
│            SaveWithDocument:=True, _                                       │
│            Left:=.Left + .Width, _                                         │
│            Top:=.Top, _                                                    │
│            Width:=.Offset(, 1).Width, _                                    │
│            Height:=.Offset(, 1).Height _                                   │
│        )                                                                   │
│    End With                                                                │
│    Exit Sub                                                                │
│l_Catch:                                                                    │
│    セル.Offset(, 1).Value = "ファイルが見つかりません"                     │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/起動時に常に画面を最大化
2019年01月31日
「ThisWorkbook.cls」にて
┌──────────────────────────────────────┐
│Private Sub Workbook_Open()                                                 │
│    Application.WindowState = xlMaximized                                   │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ユーザフォームがLoad中か判定
2019年01月24日
「Unload フォーム」もしくは「×」ボタン押下でユーザフォームを閉じた場合と
「フォーム.Hide」で非表示にした場合(隠した場合)とで、それを識別する方法。

ベタにUserForms中に登録されているか検索する他ないようだ。
┌──────────────────────────────────────┐
│Public Function isLoad(ByVal userFormName As String) As Boolean             │
│    Dim theUserForm As UserForm                                             │
│    For Each theUserForm In UserForms                                       │
│        If TypeName(theUserForm) = userFormName Then                        │
│            isLoad = True                                                   │
│            Exit Function                                                   │
│        End If                                                              │
│    Next theUserForm                                                        │
│    isLoad = False                                                          │
│End Function                                                                │
└──────────────────────────────────────┘
分類:ExcelVBA
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 … 27 次へ