Excel 5.0 DialogSheet

[Excel5.0ダイアログExcel5.0ダイアログシートを用いたセル参照](https://excel.syogyoumujou.com/memorandum/excel5_0_dialog_1.html)
Excel5.0の解説を見つけたものの、うまく動かなかったので、その点をメモっておく。
<UL>
<li>オブジェクトは1番から始まるが、インデックスでとるとエラーになる可能性が大きく、名前でとった方がいいようだ。
<li>ただしオブジェクトの名前は自動的に付けられる
<li>また、オブジェクトブラウザではは非表示になっている。
<li>公式のExcelのVBAの解説にはなく.Net Framework Microsoft.Office.InterOp.Excelにある。
</UL>
またExcel4.0の解説も英語ではあるが、この項目にある。


#Excel5.0の特徴
<UL>
<li>何といってもRange範囲を数式Wizardの様に設定できること。
<li>これによって、範囲指定がマウスで可能になる。
<li>この機能はFormにはない。
<li>そしておそらく、Excelの数式Wizardもこれを利用しているのではないか。それなら、この機能はなくならないだろう。
</UL>

###解説と違う挙動がある
####Textというプロパティが効かない

```vb
Sub E5_Dialog_2()
    Dim s As String
    If TypeName(Selection) = "Range" Then
        s = Selection.Areas(1).Address
    End If
    With ThisWorkbook.Sheets("Dialog1")
        .EditBoxes(1).Text = s
        If .Show = False Then Exit Sub
        MsgBox .EditBoxes(1).Text
    End With
End Sub
```

`.EditBoxes(1).Text`というTextというプロパティがあるようになっている。古い資料を見ても存在しているのは確実である。
しかし、現在はなぜかない。バグなのか不明。
このTextというプロパティは他のOfficeの例からすると
TextFrame.TextRange.textのような印象がある。
しかし、またTextFrame2はなく、TextFrame2.TextRange.Textのようなことはできない。
またTextFrameにもない。

プロパティを見るとCaptionでしか内容を取得できないようだ。
いつの間にか変わっているのかもしれない。
この挙動を使うと、フォームを終了させても取得したデータが残る。
フォームはUnloadすると消えてしまうが、元がシートなので消えない。
フォームの場合にはセルに記録しないとできないが、Excel5.0であればその必要はない。
フォームで初期設定をする場合、毎回立ち上げたり、記録するセルを設定する必要があるが、Excel5.0DialogBoxならその必要はない。
こうした点が異なっている。
###Excel5.0ダイアログシートの欠点
####名前で指定しないとエラーになることが多い
最初、フォームを作っているときに、エディットボックス（テキストボックスのこと）の名前を設定できないため、あとから調べないといけない。
このため、あとから書き換わることもあるが代替テキストを設定して目印にする。
Exce5DialogSheetObjectNameListによって出力できる

####DialogSheetはFor Each ではループしない
しかし、Worksheetであるような Workbook.Dialogsheetsをとり、For Eachで回すことはできない。
For　i = 1 のパターンしか効かない。

###挿入されるシート名が2013と最新版では違う
たとえば、Excel2013あたりでは挿入すると `Dialog1`という名前で挿入されたが、Excel365になると`ダイアログ1`という名称で挿入される。

###以上を踏まえたExcel2013以上のDialogSheet1の操作

<UL>
<li>上記のサイトの手順通りDialogシートを挿入する。
<li>このシートの名前はDialog1と半角英数字とすること。なっていない場合は書き換えること。
<li>次に、EditBox（テキストボックス）を挿入する。
<li>この名前は、"Edit Box 5"だったとする。
<li>Dialogの実行をクリックしてDialogが立ち上がっている状態で実行する
</UL>

```vb
Option Explicit
Public gl_CellRange As String
Sub E5_Dialog_2()
' https://excel.syogyoumujou.com/memorandum/excel5_0_dialog_1.html
' Sheetsで取得
' DialogSheet EditBoxは隠し
' EditBoxはIndexではなく、名前で求めた方が無難
' TextPropertyが動かず、Captionで取得
' EditBoxは定数が二つ
' Dialogsheet周りのヘルプはVBAにはない。英語版のInterOpにある。このため、すべてがVBAで使えるわけではない。
' [DialogSheet Interface](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.office.interop.excel.xlbuiltindialog?view=excel-pia)
' [XlBuiltInDialog Enum](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.office.interop.excel.xlbuiltindialog?view=excel-pia)
' [XlFormControl Enum](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.office.interop.excel.xlformcontrol?view=excel-pia)
' Dialogsheet自体はフォームではなくワークシート
Dim s As String
Dim oEditBox
Dim dws As DialogSheet: Set dws = Sheets("Dialog1")
If TypeName(Selection) = "Range" Then
s = Selection.Areas(1).Address
End If
With dws
Debug.Print Sheets(ActiveSheet.Name).EditBoxes(1).Caption 'DiralogBoxが立ち上がっていると補足できる。Index番号は1から開始らしい
Set oEditBox = .EditBoxes("Edit Box 5")
'.EditBoxes("Edit Box 5").Text
If dws.Visible = False Then Exit Sub
gl_CellRange = "": gl_CellRange = oEditBox.Caption 'ここでGlobalかモジュールレベルの変数に代入(一応クリアを入れている)
Debug.Print oEditBox.Caption
oEditBox.Caption = "" '消去しないと残る。その方がよい場合はこの項目は不要。不要になったら最後に消去でもよい。
End With
End Sub
```

###Excel5.0ダイアログシートのオブジェクトの名前を調べるツール
番号ではなぜかエラーを起こすため、名前を収集するツールを作成した。

```vb
Sub Exce5DialogSheetObjectNameList()
Dim dWss As Excel.DialogSheets
Dim dws As Excel.DialogSheet
Dim shps As Excel.Shapes, shp As Excel.Shape
Dim iDialog As Long
On Error Resume Next
If ThisWorkbook.DialogSheets.Count = 0 Then Exit Sub
For iDialog = 1 To ThisWorkbook.DialogSheets.Count
Set dws = ThisWorkbook.DialogSheets(iDialog)
Set shps = dws.Shapes
For Each shp In shps
Debug.Print dws.Name, shp.Name, shp.Type, shp.AlternativeText
Next
Next
On Error GoTo 0
If Err.Number <> 0 Then Debug.Print Err.Number, Err.Description
End Sub
```


Dialogsheetが立ち上がっていない場合でもエラーを排して取得
上記で`oEditBox.Caption = ""`を実行しないと、取得した範囲がそのまま残る。
そこで、これが取得できないか。エラーになるが、これを排除すると取得可能である。
ということは、一度ダイアログボックスを立ち上げてデータを取得すれば、ダイアログボックスを終了させてもデータが残り、取得できる。
(AlterNative Textに入っているときもある。)


```vb
Sub E5_Dialog_3()

Dim s As String
Dim oEditBox
Dim dws As DialogSheet: Set dws = Sheets("Dialog1")
If TypeName(Selection) = "Range" Then
s = Selection.Areas(1).Address
End If
On Error Resume Next
With dws
Debug.Print Sheets(ActiveSheet.Name).EditBoxes(1).Caption 'DiralogBoxが立ち上がっていると補足できる。Index番号は1から開始らしい
Set oEditBox = .EditBoxes("Edit Box 5")
Debug.Print .EditBoxes("Edit Box5").Caption
End With
End Sub
```

```vb
Sub Exce5DialogSheetObjectNameList()
Dim dWss As DialogSheets
Dim dws As DialogSheet: Set dws = Sheets("Dialog1")
Dim shps As Shapes, shp As Shape
On Error Resume Next
If ThisWorkbook.DialogSheets.Count = 0 Then Exit Sub
For Each dws In dWss
Set shps = dws.Shapes
For Each shp In shps
Debug.Print dws.Name, shp.Name, shp.Type, shp.AlternativeText
Next
Next
On Error GoTo 0
If Err.Number <> 0 Then Debug.Print Err.Number, Err.Description
End Sub
```


#ダイアログボックスの枠のタイトルの変更方法
通常はプロパティの表が立ち上がるが、これではそれはない。
いずれにしてもコントロールの書式設定しか立ち上がらない。これでは値は設定できない。
強制的にクリックして編集可能状態にしなければならない。
カーソルが写らなかったので、線は手書きだが、このような形でクリックするシア内。
どうもこれは全部Excel方眼で、セルではないのだろうか。
つまりExcel方眼の起源はMicrosoft自身なのである。

#参考文献と補足
[シートの操作](http://officetanaka.net/excel/vba/sheet/)
>Excelの解説本などでは「シート」と「ワークシート」が混在して使われています。ほとんどの場合は、「シート＝ワークシート」と認識して間違いはありませんが、厳密に言うとイコールではありません。シートには次の種類があるからです。
<UL>
<Li>ワークシート
<Li>グラフシート
<Li>Excel 5.0/95のモジュールシート
<Li>Excel 5.0/95のダイアログシート
<Li>Excel 4.0のマクロシート 
</UL>

[リボンの中で最も利用されないボタン](http://officetanaka.net/excel/excel2007/047.htm)
Excel2007からずっと変わっていない。
コメントですらスレッドコメントというわけのわからない名前にするExcelが位置を変えないというのはシステム（アプリケーション）で利用している可能性を強く疑わせる。

[エクセルの大御所にアドバイスをいただきました！](https://abekkan.com/vba-office-tanaka/)
ExcelのフォームはActiveXよりフォームの方を使うべき
これから考えてもExcel5.0はずっとメンテされていることが考えられる。

[ダイアログを作ってみる](http://www5b.biglobe.ne.jp/~kouta_y/news/newsvba/vba11/newsvba11.htm)
[Excel5.0Dialogを使った開発用テンプレート](https://www.still.co.jp/still/support/074sms.htm)
>「MS Excel 5.0ダイアログ」シートの場合は各オブジェクトに対する設定が簡単で、またダイアログを表示させるのもStiLLの機能で行うことができますので、マクロを一切使わずにダイアログを表示する仕組みを作ることができます。

つまりローコードとしてExcel5.0は見直されるべきだという主張である。
なぜかtextがなくなったりしているが、確実にLowである。
FormはVbModalがあるが、そういうのもない。

[Excel95のダイアログシートをExcel97以上で使うには？](http://www.max.hi-ho.ne.jp/happy/YNxv9e8.html)
[コンボボックスで入力した値をセルに順次格納するには？](http://www.max.hi-ho.ne.jp/happy/YNxv98312.html)
[ｅｘｃｅｌのダイアログでフォントを変更するには？](https://oshiete.goo.ne.jp/qa/617717.html)
>EXCEL5.0ダイアログの場合ラベルキャプションのフォントサイズはいじれないようです。システムフォントに依存します。
位置はマウスでドラッグできます。

ユーザフォームで作成しなおしてはいかがですか？