MW211 EXIT

devlog
ExcelVBA/Range型の右下
2018年08月31日
Range型のデータが矩形範囲の場合、そのまま行もしくは列を参照すると
左上基準で値が取得される
┌──────────────────────────────────────┐
│矩形範囲.Row    → 左上の上                                                 │
│矩形範囲.Column → 左上の左                                                 │
└──────────────────────────────────────┘

この場合以下のようにしてあげれば右下基準で値を取得できる。
┌──────────────────────────────────────┐
│矩形範囲.Cells(矩形範囲.Cells.Count).Row    → 右下の下                     │
│矩形範囲.Cells(矩形範囲.Cells.Count).Column → 右下の右                     │
└──────────────────────────────────────┘

つまり、以下のように取得できる。
┌──────────────────────────────────────┐
│Range("B3").Row                                          '→3               │
│Range("B3").Column                                       '→2               │
├──────────────────────────────────────┤
│Range("B3:C4").Row                                       '→3               │
│Range("B3:C4").Column                                    '→2               │
├──────────────────────────────────────┤
│Range("B3:E6").Cells(Range("B3:E6").Cells.Count).Row     '→6               │
│Range("B3:E6").Cells(Range("B3:E6").Cells.Count).Column  '→5               │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/A1形式の文字列をRange型に変換
2018年08月30日
A1形式の文字列(例えば「B3」)をRange型に変換する方法は実は簡単。
Range()にぶち込めばよいのだ。

すなわち「Range("B3")」でOK。

つまり、以下みたいな感じにできる。
┌──────────────────────────────────────┐
│Const 文字列 As String = "B3"                                               │
│Dim 範囲 As Range                                                           │
│範囲 = Range(文字列)                                                        │
│MsgBox 範囲.Column  '→2                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/Excel関数でPHPのimplode()代替
2018年08月28日
┌──────────────────────────────────────┐
│IMPLODE = Join(配列, 区切文字)                                              │
└──────────────────────────────────────┘
ExcelVBAにおけるPHPのimplode()と同等の関数は「Join()」なのだが
Excel関数には同等の関数が見当たらない。

ということで、VBA側の関数として実装してみる。
┌──────────────────────────────────────┐
│Public Function IMPLODE(ByVal 範囲 As Range, ByVal 区切文字 As String)      │
│    Dim 配列 As Variant, セル As Variant                                    │
│    配列 = Array()                                                          │
│    For Each セル In 範囲                                                   │
│        If セル.Value <> "" Then                                            │
│            ReDim Preserve 配列(UBound(配列) + 1)                           │
│            配列(UBound(配列)) = セル.Value                                 │
│        End If                                                              │
│    Next セル                                                               │
│    IMPLODE = Join(配列, 区切文字)                                          │
│End Function                                                                │
└──────────────────────────────────────┘
使用方法としては以下のようになる。
┌──────────────────────────────────────┐
│=IMPLODE(A1:B3,",")                                                         │
└──────────────────────────────────────┘
セル範囲を左上から右へそして下段へという範囲で空欄以外が抽出される。
分類:ExcelVBA
ExcelVBA/ActiveXコントロールのコピー
2018年08月27日
┌──────────────────────────────────────┐
│入力シート.Shapes("TextBox").Copy                                           │
│With 出力シート                                                             │
│    .Cells(1, 1).Select                                                     │
│    .Paste                                                                  │
│End With                                                                    │
└──────────────────────────────────────┘
上記のような感じでいけた。

但し、オブジェクト名は初期化されるようで「TextBox1」とかになる。
分類:ExcelVBA
ExcelVBA/別ファイルを開く(2)空のファイル
2018年08月26日
ちなみに、空のファイルを開く、というかアプリケーションを新規起動するには
以下のように「Shell()」(起動成功有無の戻り値あり)を実行してあげればよい。
┌─────┬────────────────────────────────┐
│Word      │Call Shell("winword.exe", vbNormalFocus)                        │
├─────┼────────────────────────────────┤
│Excel     │Call Shell("excel.exe", vbNormalFocus)                          │
├─────┼────────────────────────────────┤
│PowerPoint│Call Shell("powerpnt.exe", vbNormalFocus)                       │
├─────┼────────────────────────────────┤
│メモ帳    │Call Shell("notepad.exe", vbNormalFocus)                        │
└─────┴────────────────────────────────┘
いずれもパスが通っているという前提である。

これらを応用して、紐づいていないアプリで無理やりファイルを開くこともできる。
┌──────────────────────────────────────┐
│Call Shell("winword.exe " & Chr(34) & "C:\説明書.pdf" & Chr(34), _          │
│           vbNormalFocus)                                                   │
└──────────────────────────────────────┘
上記は、PDFファイルを無理やりメモ帳で開いた場合の例。
分類:ExcelVBA
ExcelVBA/別ファイルを開く(1)紐づくアプリで開く
2018年08月25日
ファイルがアプリケーションに紐づいているのであれば、
当該ファイルを以下のように、WSHから.Runしてあげればよい
┌──────────────────────────────────────┐
│Dim objWSH As Object                                                        │
│Set objWSH = CreateObject("Wscript.Shell")                                  │
│objWSH.Run Chr(34) & "C:\説明書.pdf" & Chr(34)                              │
└──────────────────────────────────────┘
パスはスペースが混じるといけないので、Chr(34)で囲っておいた方がよい。

ちなみにシェルから.ShellExecuteでも同様のことができる。
┌──────────────────────────────────────┐
│Dim objShell As Object                                                      │
│Set objShell = CreateObject("Shell.Application")                            │
│objShell.ShellExecute Chr(34) & "C:\説明書.pdf" & Chr(34)                   │
└──────────────────────────────────────┘

また、順番に複数のファイルを開くようにするには、第三引数に「True」を設定する。
これで、一つ目のファイルを閉じた時に二つ目のファイルが開くようにできる。
┌──────────────────────────────────────┐
│Dim objWSH As Object                                                        │
│Set objWSH = CreateObject("Wscript.Shell")                                  │
│objWSH.Run Chr(34) & "C:\説明書1.pdf" & Chr(34), 0, True                    │
│objWSH.Run Chr(34) & "C:\説明書2.pdf" & Chr(34)                             │
└──────────────────────────────────────┘
この指定がない場合には、最初の瞬間に両方のファイルがほぼ同時に開くことになる。
分類:ExcelVBA
削除したiPhoneメールの復活
2018年08月24日
iPhoneのメーラにて、ゴミ箱アイコンをクリックしてしまいメールを削除した場合
ちょっと非表示がわかりにくいので大いに焦る。

ゴミ箱内における当該メールの本文は以下のように表示されたりするのである。
┌──────────────────────────────────────┐
│フォーマットの方法に問題があるため、このメッセージは表示できません。        │
│別のフォーマットまたはメールプログラムを使ってメッセージを再送信するように  │
│送信者へ依頼してください。                                                  │
│                                                                            │
│text/plain                                                                  │
├──────────────────────────────────────┤
│このメッセージには本文がありません。                                        │
└──────────────────────────────────────┘

しかし、焦ることはない。ただ普通にゴミ箱に転送されたのと同じ状態なのだ。

ということで、復活する方法。

(1) ゴミ箱(の最初の画面)のメール一覧にて、右上の「編集」をクリック
(2) メール選択モードになるので、当該メールを選択(チェックを入れる)
(3) フッタメニューより「移動」をクリック
(4) 移動先として「受信」フォルダを選択

すると「受信」フォルダに本文は元のまま復活しているので
後は移動するなり、なんなりすればOK。
分類:iPhone
Office拡張子
2018年08月23日
┌───────────────────────┬────┬────┬────┐
│                 Officeの種類                 │旧式(*1)│マクロ無│マクロ有│
└───────────────────────┴────┴────┴────┘
┌───────────────────────┬────┬────┬────┐
│Word                                          │.doc    │.docx   │.docm   │
├───────────────────────┼────┼────┼────┤
│Wordのテンプレート形式                        │.dot    │.dotx   │.dotm   │
└───────────────────────┴────┴────┴────┘
┌───────────────────────┬────┬────┬────┐
│Excel                                         │.xls    │.xlsx   │.xlsm   │
├───────────────────────┼────┼────┼────┤
│Excelのテンプレート形式                       │.xlt    │.xltx   │.xltm   │
├───────────────────────┼────┼────┼────┤
│Excelのアドイン形式                           │.xla    │   -   │.xlam   │
└───────────────────────┴────┴────┴────┘
┌───────────────────────┬────┬────┬────┐
│PowerPointのプレゼンテーション形式            │.ppt    │.pptx   │.pptm   │
├───────────────────────┼────┼────┼────┤
│PowerPointのスライドショー形式                │.pps    │.ppsx   │.ppsm   │
├───────────────────────┼────┼────┼────┤
│PowerPointのテンプレート形式                  │.pot    │.potx   │.potm   │
├───────────────────────┼────┼────┼────┤
│PowerPointのアドイン形式                      │.ppa    │   -   │.ppam   │
└───────────────────────┴────┴────┴────┘
  *1:Office97からOffice2003までの形式(拡張子ではマクロ有無が判別できない)
分類:Windows
パワーポイント/最初からスライドショー
2018年08月22日
パワポファイルを開いた直後からスライドショー表示にして
その舞台裏を見せなくする方法。

やり方は簡単で「.pps」系拡張子で保存すればよい

「.pps」系拡張子は以下の通り。
┌───┬─────────┬────────────────────────┐
│.pps  │旧方式            │Excelにおける「.xls」にあたるもの               │
├───┼─────────┼────────────────────────┤
│.ppsx │新方式でマクロなし│Excelにおける「.xlsx」にあたるもの              │
├───┼─────────┼────────────────────────┤
│.ppsm │新方式でマクロあり│Excelにおける「.xlsm」にあたるもの              │
└───┴─────────┴────────────────────────┘

なお、この拡張子にしてしまうと舞台裏が見えなくできる代わりに
舞台裏が見れなくなる(要は編集できなくなる)。

編集したい場合には、空のパワポを起動し、そちらからファイルを開く形にすればよい。
分類:PowerPoint
ExcelVBA/テキストボックスの入力
2018年08月18日
【ActiveXコントロールのテキストボックスを入力不可にする方法】

  ■「.Enabled = Flase」にする
    →但し、文字色が淡くなる(濃くはできない)

  ■Textbox_Change()イベントで入力直後に元の値に戻す
    →但し、元の値がわかってなければならない
      (TextBox_GotFocus()イベントで取得しておくとか)
      また、イベントを再度起動してしまい無限ループに陥らないよう注意が必要

  □当該テキストボックスの保護ロックの状態にして(*1)
    シートを保護する(*2)
    但し、これは入力を不可とするものではなく
    デザインモード時にテキストボックスの位置やサイズを変更できなくするものの模様
    →つまり入力不可としては使えない

    *1:デザインモードで、右クリックメニュー「コントロールの書式設定」より
        「保護」タブの「■ロック」にチェックを入れる
    *2:シートの右クリックメニューから「シートの保護」を選ぶか
        リボンメニュー「ホーム」タブの「書式」から「シートの保護」を選ぶ

  □「.Locked = True」にする
    →これは前述の「■ロック」にチェックを入れたのと同等なので
      入力不可としては使えない

    なお、フォーム上のテキストボックスの場合は入力不可として使える模様
分類:ExcelVBA
前へ 1 2 3 次へ