MW211 EXIT

devlog
ExcelVBA/With句内で自身を指す
2018年02月10日
「.Offset()」だね。
┌──────────────────────────────────────┐
│With セル                                                                   │
│    If .Value = "" Then                                                     │
│        MsgBox "入力してね"                                                 │
│        Application.GoTo .Offset()                                          │
│    End If                                                                  │
│End With                                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/リボンの最小化と非表示
2018年01月26日
Excel2010までは「リボンの最小化」しかなかったが
(というか「リボンの最小化」の導入はExcel2010からだが)
Excel2013から「リボンの非表示」も導入された。

力関係的には、「リボンの非表示」>「リボンの最小化」なので
リボンが非表示状態で、最小化云々をやろうとするとエラー(*1)となってしまう。
*1:「'ExecuteMso'メソッドは失敗しました:'_CommandBars'オブジェクト」

たとえば、以下は最小化されていない場合に、最小化するマクロだが…
┌──────────────────────────────────────┐
│If Application.CommandBars.GetPressedMso("MinimizeRibbon") = False Then     │
│    Application.CommandBars.ExecuteMso "MinimizeRibbon"                     │
│End If                                                                      │
└──────────────────────────────────────┘
非表示状態の場合には、エラーとなってしまう。

なので、非表示状態じゃない時という条件が必要になる。
しかも、Excel2010では非表示自体ないので、その条件文にも注意が必要。

例えばこんな感じになる(事前に非表示を解消してしまう方法)。
┌──────────────────────────────────────┐
│If CInt(Application.Version) >= 15 Then     ' Excel2013(バージョン15.0)以降 │
│    If Application.CommandBars.GetPressedMso("HideRibbon") = True Then      │
│        Application.CommandBars.ExecuteMso "HideRibbon"                     │
│    End If                                                                  │
│End If                                                                      │
│If Application.CommandBars.GetPressedMso("MinimizeRibbon") = False Then     │
│    Application.CommandBars.ExecuteMso "MinimizeRibbon"                     │
│End If                                                                      │
└──────────────────────────────────────┘
なお、"HideRibbon"も"MinimizeRibbon"もトグル命令なので、状態が反転する。
False下で実行するとTrueとなり非表示化・最小化し、
True下で実行するとFalseとなりそれが解除される。
分類:ExcelVBA
ExcelVBA/ボタンの設定
2018年01月25日
ボタンを設定するには以下の方法がある。
┌──────────┬───────────────────────────┐
│フォームコントロール│マクロを登録する                                      │
├──────────┼───────────────────────────┤
│ActiveXコントロール │イベントとして登録する                                │
├──────────┼───────────────────────────┤
│オートシェイブ      │マクロを登録する                                      │
└──────────┴───────────────────────────┘
分類:ExcelVBA
ExcelVBA/セルの範囲
2018年01月21日
┌───────────┬──────────────────────────┐
│起点セル.CurrentRegion│空白で囲まれた範囲(矩形)を選択                      │
├───────────┼──────────────────────────┤
│シート.UsedRange      │(空白関係なく)すべての使用済み範囲(矩形)を選択      │
└───────────┴──────────────────────────┘
分類:ExcelVBA
ExcelVBA/.Formulaのイコール
2018年01月16日
┌─┬────────────────────────────────────┐
│A│With Selection                                                          │
│  │    .Formula = .Formula                                                 │
│  │End With                                                                │
├─┼────────────────────────────────────┤
│B│With Selection                                                          │
│  │    .Formula = "=" & .Formula                                           │
│  │End With                                                                │
└─┴────────────────────────────────────┘
上記の違い。

元々の値が数式だった場合には、影響はなし。
Aで「=」が足りないとか、Bで「=」が過剰とか、怒られたりはしない。

違いは、元の値が数式っぽい文字列だった場合。
例えば「A1」という文字だったら、Aはそのままだが、Bは数式「=A1」となる。
分類:ExcelVBA
ExcelVBA/選択とオブジェクト
2018年01月15日
選択中のものは、セルだけとは限らない。オブジェクトの場合もある。
オブジェクトも一つの種類のオブジェクトとは限らない。
但し、セルとオブジェクトを同時に選択することはない。
何を選択しているかは、「TypeName(Selection)」で確認すればよい。
なお、複数のオブジェクトを選択している場合には
その種類に差異があるかは不問で「DrawingObjects」となる。
┌──────┬───────┬──────────────┐
│セル        │Range         │                            │
├──────┼───────┼─────┬────────┤
│オブジェクト│DrawingObjects│TextBox   │テキストボックス│
│            │              ├─────┼────────┤
│            │              │Line      │直線            │
│            │              ├─────┼────────┤
│            │              │Rectangle │四角形          │
│            │              ├─────┼────────┤
│            │              │Oval      │円(楕円)        │
│            │              ├─────┼────────┤
│            │              │Picture   │画像            │
└──────┴───────┴─────┴────────┘

ということで、テキストボックスの数式を置換するマクロはこんな感じになる。
┌──────────────────────────────────────┐
│Public Sub テキストボックスの数式参照相対化()                               │
│    Dim theObject As Object                                                 │
│    Select Case TypeName(Selection)                                         │
│        Case "DrawingObjects"                                               │
│            For Each theObject In Selection                                 │
│                If TypeName(theObject) = "TextBox" Then                     │
│                    With theObject                                          │
│                        .Formula = Replace(.Formula, "$", "")               │
│                    End With                                                │
│                End If                                                      │
│            Next theObject                                                  │
│        Case "TextBox"                                                      │
│            With Selection                                                  │
│                .Formula = Replace(.Formula, "$", "")                       │
│            End With                                                        │
│        Case Else                                                           │
│            MsgBox "テキストボックスを選択してください"                     │
│            Exit Sub                                                        │
│    End Select                                                              │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/勝手に折り返される
2017年12月29日
【現象】
  「セルの書式設定」で「折り返して全体を表示する」のチェックを外して
  無効にしたのに、なぜか文字列を出力すると、
「折り返して全体を表示する」のチェックが復活して、折り返して表示される。

【原因】
  出力した文字列に改行コード(LF)が含まれているため。
分類:ExcelVBA
ExcelVBA/セル範囲の入力(ユーザフォーム編)
2017年12月28日
ユーザフォームでセル範囲を入力させるには
「RefEdit」というコントロール(オブジェクト)を使う。
これはフォームのツールボックスに既定で存在する。

以下のようなイベント関数ができる。(「RefEdit1」の部分はオブジェクト名に依存)
┌──────────────────────────────────────┐
│Private Sub RefEdit1_BeforeDragOver(Cancel As Boolean,                      │
│                                    ByVal Data As MSForms.DataObject,       │
│                                    ByVal x As stdole.OLE_XPOS_CONTAINER,   │
│                                    ByVal y As stdole.OLE_YPOS_CONTAINER,   │
│                                    ByVal DragState As MSForms.fmDragState, │
│                                    Effect As MSForms.fmDropEffect,         │
│                                    ByVal Shift As Integer)                 │
│End Sub                                                                     │
└──────────────────────────────────────┘

そんでもってボタンオブジェクト(「CommandButton1」の部分はオブジェクト名に依存)で
以下のように参照してあげればよい。
┌──────────────────────────────────────┐
│Private Sub CommandButton1_Click()                                          │
│    Dim 範囲 As Range                                                       │
│    Set 範囲 = Range(RefEdit1.Value)                                        │
│    MsgBox 範囲.Rows.Count  ' 選択した(範囲の)行数はいくつ?                │
│End Sub                                                                     │
└──────────────────────────────────────┘
「RefEdit」オブジェクトの値が範囲(Range)相当となる。
分類:ExcelVBA
ExcelVBA/セル範囲の入力
2017年12月27日
Application.InputBox()を使って、ユーザにセルを選択させる方法。
┌──────────────────────────────────────┐
│Dim 指定範囲 As Range                                                       │
│On Error Resume Next                                                        │
│Set 指定範囲 = Application.InputBox("セルを選択してください", Type:=8)      │
│On Error GoTo 0                                                             │
│If 指定範囲 Is Nothing Then                                                 │
│    MsgBox "キャンセルされました"                                           │
│    Exit Sub                                                                │
│End If                                                                      │
│指定範囲.Interior.Color = RGB(0, 255, 0)                                    │
└──────────────────────────────────────┘
「Type:=8」だとセル選択となる。
なお、キャンセルの場合、戻り値がなくエラーとなるが
回避方法は「On Error Resume Next」となってしまう。
分類:ExcelVBA
ExcelVBA/Worksheet_ChangeのTarget
2017年12月26日
┌──────────────────────────────────────┐
│Private Sub Worksheet_Change(ByVal Target As Range)                         │
│    If Target.Value = "×" Then                                             │
│        MsgBox "入力エラー", vbCritical                                     │
│    End If                                                                  │
│End Sub                                                                     │
└──────────────────────────────────────┘
こんな感じで入力チェックを実装した場合、
コピー&ペーストで複数セルを同時入力された場合にエラーとなってしまう。
→試にタブ区切りで二単語以上をつないだものをまとめてコピぺしてみるとよい

ということで、Worksheet_ChangeのTargetは
複数セル同時入力されることを見越して、Foreach文にしておくのがよい。
┌──────────────────────────────────────┐
│Private Sub Worksheet_Change(ByVal Target As Range)                         │
│    Dim セル As Range                                                       │
│    For Each セル In Target                                                 │
│        If セル.Value = "×" Then                                           │
│            MsgBox "入力エラー", vbCritical                                 │
│        End If                                                              │
│    Next セル                                                               │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
前へ 1 … 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 … 27 次へ