Top > Programmingとか > Office > タブと闘う

2004年08月06日

10 XLSTARTとmodeless

検証環境 自作マシン(PentuimIII1.2GHz/512MB)
WinXPHomeSP1/IE6.0SP1/MSExcel2003SP1

前回までのお話でタブと戦うは一段落つけたつもりだったんですが。
気になることが2点ほど出てきてしまったので、ほんの追加でちょいちょい…とお話しするつもりだったんですが、なんだかけっこぅ大事になってきてしまいそぅな。

ので、ちょいと腰を据えて、キチンとお話してみよぅかと思います。
もぅ少し便利になるかもしれませんので、よろしくお付き合いください。



まず。

前回のごめんさらにだめだ。でもせっかくなのでモジュール提供において、

Excelってば起動時に、XLSTARTフォルダのファイルを全部読み込むんだっ!

と叫んでいたんですよ、私。
ってことは逆に考えると、

Excelの起動時に読み込ませたいマクロは、
XLSTARTフォルダの中にありさえすれば
ファイル名は何でもいい

てゅうことではないですか。がびーん。
前回、basやらfrmやらで提供して自分でPersonal.xlsに組み込めと言ってしまったのは、いったい何だったんでしょうか。

すなおにSalTabView.xlsとでもして、XLSTARTフォルダに置いてもらえればOKOKって言っておけばいいってことではないですか。
答えは自分の目の前にあったのに、迂闊にも気づいたのはお話ししてから半年も経ってからでしたよ。



さて、もぅ一点。

実は最初っからあきらめまくっていたので、今までのお話の中ではまったく触れもしなかったんですが。

UserFormを表示させるメソッドShowには、引数としてmodal/modelessを指定できるのでした。

これを指定できると、UserFormを表示させたままSheetを操作できるようになるので、またひとつ便利になってしまぅんですが。

では、なんで今までそんな便利なことをしなかったかといぅと。

本シリーズを書き始めた時のExcel97では、modal/modelessの指定ができなかったからだったのでした。

その後使用するExcelを2000→XP(2002)→2003と変えていったわけなんですが、modelessの指定を再度試すって発想が湧かないままここまで突っ走ってきたんですね。

ところが先日Excel2003のHelpをぼーたら読んでいたら、Showメソッドの説明に、引数 modalの説明が書いてあるではありませんか。

えっ!?

あわてて調べてみたら、Excel2000から引数 modal は使用できるよぅになっていたんですね。うかつー。 ってことで、先日公開したファイルの中の[modTabView.bas]-[ShowTabView]のShowメソッドに「vbModeless」を書き加えるだけで、frmTabViewを表示させたままSheetの操作が可能に!

'**************************
' タブ選択ダイアログの表示
'**************************
Sub ShowTabView()
Dim strRet As String
Dim lngRet As Long
Dim strMsg As String
Dim ctlButton As CommandBarButton
Dim i As Long
Dim FNo As Integer
'*** 初回起動時、ツールバーへのボタン登録を確認する
'パラメータ用ファイルの存在確認
strRet = Dir(ThisWorkbook.Path & "\..\TabView.dat")
'*** パラメータ用ファイルが存在していなければ初回起動と見なす
If (strRet = "") Then
'ツールバーへのボタンの登録
strMsg = "標準ツールバーへ「タブ選択ダイアログ起動」ボタンを追加しますか?"
lngRet = MsgBox(strMsg, vbYesNo, "タブ選択ダイアログ")
If (lngRet = vbYes) Then
Set ctlButton = CommandBars("Standard").Controls.Add(Type:=msoControlButton)
ctlButton.Caption = "TabView"
ctlButton.TooltipText = "タブ選択ダイアログ"
ctlButton.OnAction = ThisWorkbook.Name & "!ShowTbView"
ctlButton.FaceId = 2587
End If
Else
'Form表示座標の取得
FNo = FreeFile
On Error Resume Next
Open ThisWorkbook.Path & "\..\TabView.dat" For Input As #FNo
If (Err) Then
lngX = 0
lngY = 0
Else
Input #FNo, lngX, lngY
Close FNo
End If
On Error GoTo 0

End If
'*** タブ選択ダイアログの表示
frmTabView.Show vbModeless
End Sub
ってことでひとつ。


…といぅわけにはいきませんね。

今までUserForm側からの操作しか考えていなかったのが、Workbook/Sowksheet側からの操作にもシンクロさせないとエラーしまくりの状態になってしまぅのは目に見えています。

ので、Excelからのイベントへの対応やら何やらで、これからしばらくいろいろイジってみたいと思います。

→さて、また一仕事だ。

2004年02月16日

09 ごめんさらにだめだ。でもせっかくなのでモジュール提供

検証環境 SONY VAIO PCG-U1(Crusoe860MHz/240MB) WinXPHomeSP1/IE6.0SP1/MSExcel2002SP2

さーて。

ながながと説明してきた「Tabと闘う」完結編でございます。
長かったよなぁ。特に何も書かなかった期間が。< だめじゃん。

てことでしみじみと、Excelを起動してみました。

…あら?今、なんか、ちらりと見えたよぅな。…え?

of03-09-1.gif

tatakau.datが読み込まれてるっ!

…知らんかった。Excelってば起動時に、

XLSTARTフォルダのファイルを全部読み込むんだっ!

試しに、bmpファイルを置いてみると。

of03-09-2.gif

うーむ、愚直な奴。



あーいぇいぇ、ここで言いたいのは、


XLSTARTフォルダに、Excelに読み込ませる以外の
ファイルを置いちゃいけない

ってことですね。ぬかったわぁ。

なので、tatakau.datは、XLSTARTフォルダの親フォルダ - Excelフォルダになりますね - に格納することにちょっと待て

確か私、前回、「Personal.xlsに格納して使う方ばっかりだとは限らないんですよね。」とか言ってたんですよね。
てことは、別に起動時に読み込まれるExcelファイルとして用意するとは限らないわけで。てことは、別にXLSTARTフォルダにあるとも限らないわけで。
無条件に「XLSTARTフォルダの親フォルダ」って決め打ち指定してしまうと、全然違う用途のフォルダにtatakau.datを書き込んでみたり、最悪ルートフォルダに用意されちゃうとエラーになっちゃう、ってことですかい?

とはいぅものの。
9x系とNT系ではそもそもXLSTARTフォルダの存在位置も違いますし、このへんをコードで自動判別させるのは…できなくはないかもしれませんが、労多くして益少なしな感じがひしひしと。

やむを得ん。
ここは導入いただく方に、どこらへんにtatakau.datを格納するか、コードを編集していただくことにしましょう。

まずはmodTatakauモジュールから。

Option Explicit
Public lngX As Long 'Form表示X座標
Public lngY As Long 'Form表示Y座標
Public gstrPath As String 'tatakau.datの保存先
'**************************
' タブ選択ダイアログの表示
'**************************
Sub ShowTatakau()
Dim strRet As String
Dim lngRet As Long
Dim strMsg As String
Dim ctlButton As CommandBarButton
Dim i As Long
Dim FNo As Integer
'*** 初回起動時、ツールバーへのボタン登録を確認する
'tatakau.datの保存先を設定
gstrPath = ThisWorkbook.Path & "\..\tatakau.dat" 'XLSTARTフォルダ用
' gstrPath = ThisWorkbook.Path & "\tatakau.dat" 'XLSTART以外のフォルダ用

'パラメータ用ファイルの存在確認
strRet = Dir(gstrPath)
'*** パラメータ用ファイルが存在していなければ初回起動と見なす
If (strRet = "") Then
'ツールバーへのボタンの登録
strMsg = "標準ツールバーへ「タブ選択ダイアログ起動」ボタンを追加しますか?"
lngRet = MsgBox(strMsg, vbYesNo, "タブ選択ダイアログ")
If (lngRet = vbYes) Then
Set ctlButton = CommandBars("Standard").Controls.Add(Type:=msoControlButton)
ctlButton.Caption = "TabView"
ctlButton.TooltipText = "タブ選択ダイアログ"
ctlButton.OnAction = ThisWorkbook.Name & "!ShowTatakau"
ctlButton.FaceId = 2587
End If
Else
'Form表示座標の取得
FNo = FreeFile
On Error Resume Next
Open gstrPath For Input As #FNo
If (Err) Then
lngX = 0
lngY = 0
Else
Input #FNo, lngX, lngY
Close FNo
End If
On Error GoTo 0
End If
'*** タブ選択ダイアログの表示
frmTatakau.Show
End Sub
続いて、frmTatakau側。
'****************
' UserForm終了時
'****************
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Dim FNo As Integer
'*** Formパラメータの格納
lngX = Me.Left
lngY = Me.Top
FNo = FreeFile
On Error Resume Next
Open gstrPath For Output As #FNo
If Not (Err) Then
Write #FNo, lngX, lngY
Close FNo
End If
On Error GoTo 0
End Sub
よぅし、これで今度こそ今度こそ、おっけーっ!


てことで、ようやくの提供です。

今までソースとかで機能実装の手順をお話ししてきましたが、その結果をダウンロードできるファイルとして用意してみました。

これ→exceliconxp.gif

このファイルを展開すると、ファイルが3つ出てきます。
このうちの2つ、、frmTatakau.frmmodTatakau.basをVisual Basic EditorのプロジェクトエクスプローラのPersonal.xls(または組み込みたいExcelファイル)上にドラッグ&ドロップで組み込んでください。
それから、modTatakauの中にあるSHowTatakauプロシージャを、一度だけ手動で起動してください。
標準ツールバーへ「タブ選択ダイアログ起動」ボタンを追加しますか?というダイアログボックスの質問に[はい]と答えれば、仕込み完了です。

Personal.xlsで配布することも考えたんですが、すでに個人用マクロブックをお使いの方にはかえって編集がめんどくさいことになりそぅでしたし、ExcelXPって変にセキュリティ機能に根性が入っていて、使用者以外の方の作ったマクロには妙に過敏な反応をするんですよ。
ので、モジュール単位で配布して各人に組み込んでいただくのが一番めんどくさくない、といぅ判断をしてみました。



以上、足かけ3年もかけてTabと闘ってみました。
Sheetの並び順の変更機能なんかもアイデアとしてはあったんですが、まぁまずはここまで。
けっこう自分としては使い物になってるんですけど、いかがでしょうか。

2004年02月10日

08 ごめん、だめだこれは

検証環境 SONY VAIO PCG-U1(Crusoe860MHz/240MB)
WinXPHomeSP1/IE6.0SP1/MSExcel2002SP2

さぁて公開、と思っていたら。

ごめん、今日使っていてだめなことに気がついてしまいました。

Form閉じる時の反応が遅いっ。

閉じるたんびに1~2秒待たされる。
たかが1~2秒と侮るなかれ。だばだば操作しまくっているリズムの中では、この待たされ加減は致命的っす。



原因はわかってるんですよ。
おもしろがって表示座標をSheetの中に保存するようにしたもんだから、Form閉じるたんびにWorkBook丸ごとセーブ。ってところにセキュリティソフト(今の職場のマシンには組み込まれているんですよ不本意ながら)がいちいちセキュリティチェックしてくださりやがるもんだから。

てことで、「これは妙手」とばかりに意気揚々とご紹介したSheet内パラメータ保存の手法でしたが、あえなく没(T-T)。

ここは少々ダサ手ではありますが、やはり素直にパラメータ用のファイルを置こうかと。くすん。



そうと決まれば話は簡単。

Sheetの代わりに、ファイルをひとつ作って読み書きすればいいだけのこってす。
ついでに、ファイルの存在を初回起動かどうかの判定に使ってしまえば、完全にSheetで行っていた機能の代替になりますね。

てことで、まずmodTatakauの方は座標格納用のPublic変数を2つ用意して。

Option Explicit
Public lngX As Long 'Form表示X座標
Public lngY As Long 'Form表示Y座標
'**************************
' タブ選択ダイアログの表示
'**************************
Sub ShowTatakau()
Dim strRet As String
Dim lngRet As Long
Dim strMsg As String
Dim ctlButton As CommandBarButton
Dim i As Long
Dim FNo As Integer
'*** 初回起動時、ツールバーへのボタン登録を確認する
'パラメータ用ファイルの存在確認
strRet = Dir(ThisWorkbook.Path & "\tatakau.dat")
'*** パラメータ用ファイルが存在していなければ初回起動と見なす
If (strRet = "") Then

'ツールバーへのボタンの登録
strMsg = "標準ツールバーへ「タブ選択ダイアログ起動」ボタンを追加しますか?"
lngRet = MsgBox(strMsg, vbYesNo, "タブ選択ダイアログ")
If (lngRet = vbYes) Then
Set ctlButton = CommandBars("Standard").Controls.Add(Type:=msoControlButton)
ctlButton.Caption = "TabView"
ctlButton.TooltipText = "タブ選択ダイアログ"
ctlButton.OnAction = ThisWorkbook.Name & "!ShowTatakau"
ctlButton.FaceId = 2587
End If
Else
'Form表示座標の取得
FNo = FreeFile
On Error Resume Next
Open ThisWorkbook.Path & "\tatakau.dat" For Input As #FNo
If (Err) Then
lngX = 0
lngY = 0
Else
Input #FNo, lngX, lngY
Close FNo
End If
On Error GoTo 0

End If
'*** タブ選択ダイアログの表示
frmTatakau.Show
End Sub
で、受けるfrmTatakauの方ではFormの起動/終了時のイベントをちょっと変更して。
'****************
' UserForm起動時
'****************
Private Sub UserForm_Initialize()
'*** Formパラメータの取得
Me.Move lngX, lngY
'*** 現在のBook/Sheet状況を取得→表示
Call sGetAllBooks 'Book情報の取得と表示
Call sGetSheets(ActiveWorkbook) 'Sheet情報の取得と表示
End Sub
'****************
' UserForm終了時
'****************
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Dim FNo As Integer
'*** Formパラメータの格納
lngX = Me.Left
lngY = Me.Top
FNo = FreeFile
On Error Resume Next
Open ThisWorkbook.Path & "\tatakau.dat" For Output As #FNo
If Not (Err) Then
Write #FNo, lngX, lngY
Close FNo
End If
On Error GoTo 0

End Sub
これで、Formを閉じる時の反応も何とか使い物になるレベルに。

→次回、今度こそ公開…かな?(自信なし)

2004年02月09日

07 ツールバーへの登録と公開準備

検証環境 SONY VAIO PCG-U1(Crusoe860MHz/240MB)
WinXPHomeSP1/IE6.0SP1/MSExcel2002SP2

さて、公開する前にもうひとつ。
ツールバーに、この機能を起動するボタンを追加したいんです。

ショートカットキーで起動するようにしてもいいんですけど、それだと[Officeで遊ぶ]-[01 OfficeXPをまさぐる]-[Excelで独自のショートカットキー]とあんまり変わんないことになっちゃいますので、今回は別手法で。



なんのことはない、「標準」メニューバーにひとつボタンを追加して、マクロの起動をひもづけるだけなんですが。

タイミングとしては、前回お話しした「表示座標格納用Sheetの追加」と同じく、初回起動時にセットするようにすればいいでしょう。
ショートカットキーその他の手段で起動したい方もいらっしゃるでしょうから、「追加しますか?」って一度確認も入れた方がいいでしょうね。

てことで、書いたコードはこんな感じ。

'**************************
' タブ選択ダイアログの表示
'**************************
Sub ShowTatakau()
Dim strRet As String
Dim lngRet As Long
Dim strMsg As String
Dim ctlButton As CommandBarButton

Dim i As Long
'*** 初回起動時、ツールバーへのボタン登録を確認する
'パラメータ用Sheetの存在確認
strRet = "forTatakauなし"
For i = 1 To Workbooks("PERSONAL.XLS").Worksheets.Count
If Workbooks("PERSONAL.XLS").Worksheets(i).Name = "forTatakau" Then
strRet = "forTatakauあり"
Exit For
End If
Next
'*** パラメータ用Sheetが存在していなければ初回起動と見なす
If (strRet = "forTatakauなし") Then
'パラメータ用Sheetがなければ生成
Workbooks("PERSONAL.XLS").Worksheets.Add.Name = "forTatakau"
'ツールバーへのボタンの登録
strMsg = "標準ツールバーへ「タブ選択ダイアログ起動」ボタンを追加しますか?"
lngRet = MsgBox(strMsg, vbYesNo, "タブ選択ダイアログ")
If (lngRet = vbYes) Then
Set ctlButton = CommandBars("Standard").Controls.Add(Type:=msoControlButton)
ctlButton.Caption = "TabView"
ctlButton.TooltipText = "タブ選択ダイアログ"
ctlButton.OnAction = "PERSONAL.XLS!ShowTatakau"
ctlButton.FaceId = 2587
End If

End If
'*** タブ選択ダイアログの表示
frmTatakau.Show
End Sub
「標準」メニューバーは、「Standard」という名称で指定します。
前稿でSheetを追加した時には「Add.Name」などという怪しげな省略手法を使ってみましたが、今回追加するボタンにはいろいろプロパティを設定しなければなりませんので、きちんとAddメソッドの返値をCommandBarButtonオブジェクト型の変数で受けることにしました。

ボタンの画像はFaceIdプロパティで設定するんですが、Excelが持つFace画像って、2000種類以上あるんです…しかもそれってヘルプには記述されていません。
自分で作った画像をPasteFaceメソッドで貼り込む方法もあるんですが、これ、クリップボードを媒介にするんですよ。
クリップボードはユーザのための機能であって、プログラム側で都合よく使うべきではないと考える私にとっては、この仕様は何とも腹立たしい。この機能を実行したせいで、ユーザが格納しておいたクリップボードのデータがクリアされてしまうなんて事態はまっぴらごめんです。

で、探してみたら、ありました。ExcelのFace一覧を表示するマクロ。
角田桂一さんが運営されるサイトAddinBoxから[その他の公開ソフト]-[FaceId 一覧表示]-[DL](ダウンロード)または[画像](ソースコードが提示されています)で、500アイテムごとにびっしり表示されます。

一応Tabっぽいってことで2587番を選んでみたんですが…これ、アドレス帳のアイコンだったかなぁ。
別のアイコンに変更したい方は、上記マクロを参考にお好きなFaceIdに差し替えてご使用ください。



さて、これでいよいよ公開…する前にもうひとつ。

よく考えてみると、必ずしもPersonal.xlsに格納して使う方ばっかりだとは限らないんですよね。
でも今んとこ、全編Personal.xls決め打ちで作っちゃってますので、そのへんを修正しまくらないと使えないといぅことになります。
これ、単純にソースが存在しているWorkBookをThisWorkbookというキーワードで参照できるんですから、そーいぅふうに修正してしまいましょう。

修正箇所と内容はこんな感じで。

'**************************
' タブ選択ダイアログの表示
'**************************
Sub ShowTatakau()
Dim strRet As String
Dim lngRet As Long
Dim strMsg As String
Dim ctlButton As CommandBarButton
Dim i As Long
'*** 初回起動時、ツールバーへのボタン登録を確認する
'パラメータ用Sheetの存在確認
strRet = "forTatakauなし"
For i = 1 To ThisWorkbook.Worksheets.Count
If ThisWorkbook.Worksheets(i).Name = "forTatakau" Then
strRet = "forTatakauあり"
Exit For
End If
Next
'*** パラメータ用Sheetが存在していなければ初回起動と見なす
If (strRet = "forTatakauなし") Then
'パラメータ用Sheetがなければ生成
ThisWorkbook.Worksheets.Add.Name = "forTatakau"
'ツールバーへのボタンの登録
strMsg = "標準ツールバーへ「タブ選択ダイアログ起動」ボタンを追加しますか?"
lngRet = MsgBox(strMsg, vbYesNo, "タブ選択ダイアログ")
If (lngRet = vbYes) Then
Set ctlButton = CommandBars("Standard").Controls.Add(Type:=msoControlButton)
ctlButton.Caption = "TabView"
ctlButton.TooltipText = "タブ選択ダイアログ"
ctlButton.OnAction = ThisWorkbook.Name & "!ShowTatakau"
ctlButton.FaceId = 2587
End If
End If
'*** タブ選択ダイアログの表示
frmTatakau.Show
End Sub
'****************
' UserForm起動時
'****************
Private Sub UserForm_Initialize()
Dim lngX As Long
Dim lngY As Long
'*** Formパラメータの取得
lngX = ThisWorkbook.Worksheets("forTatakau").Cells(1, 1).Value
lngY = ThisWorkbook.Worksheets("forTatakau").Cells(1, 2).Value
Me.Move lngX, lngY
'*** 現在のBook/Sheet状況を取得→表示
  Call sGetAllBooks 'Book情報の取得と表示
Call sGetSheets(ActiveWorkbook) 'Sheet情報の取得と表示
End Sub
'****************
' UserForm終了時
'****************
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'*** Formパラメータの格納
ThisWorkbook.Worksheets("forTatakau").Cells(1, 1).Value = Me.Left
ThisWorkbook.Worksheets("forTatakau").Cells(1, 2).Value = Me.Top
ThisWorkbook.Save
End Sub
これでほんとに全部おしまい。さーぁ、よぅやっと公開できます。ふぅ。

→次回、公開。

2004年02月08日

06 キーボードからの終了と表示位置の保存

検証環境 SONY VAIO PCG-U1(Crusoe860MHz/240MB)
WinXPHomeSP1/IE6.0SP1/MSExcel2002SP2

さて。今までの機能とは直接関係ないんですけど。

実際にこのFormでWorkBookやSheetをだばだば切り替えながら作業していると、ちょっとしたところでめんどくさいんですね。



まず、Formのクローズ。

Form右上の[×]ボタンを押せばいいだけなんですけど、けっこうめんどくさいのこれ。
せっかくですから、[ESC]キーでもクローズできるようにしましょう。

話は簡単。
Formに[ESC]ボタンを追加して、CancelプロパティをTrueにするだけです。
コードの中身は、単純なUnloadで。

040208-01.gif
'******************
' UserFormのUnload
'******************
Private Sub cmdESC_Click()
Unload Me
End Sub

次。表示位置の保存と復元。

この機能を使っての作業の眼目は、Excelのシートを渡り歩いて参照とかをしたい、ってとこにあったわけです。
ので、Excelのど真ん中()に表示されたり、デスクトップ左上()に表示されるのはいかにも具合が悪いんですね。
どちらの領域も、データが書き込まれている可能性の高いところなんですよ。できれば右下あたりに表示されたいもんです。
ってのは私の好みでして、他の方は別の位置に表示させたかったりするかもしれません。

やっぱここはひとつ、表示位置を保存→次回起動時に表示位置を復元、って機能をつけておきたいですね。

まぁそれ自体は簡単なんですけど、気にしたいのは、取得した表示座標の保存先。
VBだとINIファイルやらレジストリやらに記録しておくところなんですけど、せっかくExcelなんですから、Excelの中で完結させられないかなーと。

で、ぼーっとExcel VB Editerを眺めていたら。
Personal.xlsの中にも非表示ながらSheetがあるじゃあないですか。

040208-02.gif

ここに格納できれば、Excelの中だけで完結するなぁ。
どうせなら、Sheet1じゃなくて、この機能専用にひとつSheetがあれば、他の機能があってもぶつからないよなぁ。
でもって、これを手動で作るのは操作がめんどくさいから、初回起動時に自動で作れればいいなぁ。

てことで、作ってみました。

まず、表示座標を記録する専用のSheetを追加するコードから。

どっちみちこのForm、マクロからShowしなきゃいけないわけですので、それ用のマクロをひとつ作りましょう。
専用のモジュールmodTatakauを用意して、そこに関数を記入。

'**************************
' タブ選択ダイアログの表示
'**************************
Sub ShowTatakau()
Dim strRet As String
Dim i As Long
'*** 初回起動時、ツールバーへのボタン登録を確認する
'パラメータ用Sheetの存在確認
strRet = "forTatakauなし"
For i = 1 To Workbooks("PERSONAL.XLS").Worksheets.Count
If Workbooks("PERSONAL.XLS").Worksheets(i).Name = "forTatakau" Then
strRet = "forTatakauあり"
Exit For
End If
Next
'*** パラメータ用Sheetが存在していなければ初回起動と見なす
If (strRet = "forTatakauなし") Then
'パラメータ用Sheetがなければ生成
Workbooks("PERSONAL.XLS").Worksheets.Add.Name = "forTatakau"
End If
'*** タブ選択ダイアログの表示
frmTatakau.Show
End Sub
ちょっと悩んだのが、「Workbooks("PERSONAL.XLS").Worksheets.Add.Name」の部分。

「Add」って、メソッドなんですよ。なのに、さらに「Name」プロパティを書き足してるんですね。
な、納得いかん。

でも、ヘルプを読むと、「Add」メソッドにはBefore、After、Count、Typeの4つの引数しかないことになっていますし。の割には、あちこちのExcel VBAサイトではさらりと「Add.Name」の例とかさらりと記述されてたりするんですよ。

Microsoftからの公式資料(Excelのヘルプとかmsdnとか)だけではわからない、書籍を買ったり講習を受けたりしなければわからないような事柄なんでしょうか。
なんかおもしろくないなぁ。

などと思っていたら、わかりました。Excel2000のヘルプには書いてあったんです。

Add メソッド (Worksheets コレクション)

オブジェクトを返すメソッドです。新しいワークシートを作成します。新しいワークシートがアクティブ シートになります。ワークシート (Worksheet オブジェクト) を返します。

ちくしょうAddメソッドには返値があるのか。しかも値じゃなくて、Worksheetオブジェクトを返すのか。
確かにWorksheetオブジェクトにはNameプロパティがあるけど、まさかAddメソッドをそのままWorksheetオブジェクトとしてNameプロパティへの値の代入まで一気にできるとは思いつくもんじゃないぞっ。

てことで、これは本来こう書くべきなんでしょう。

Dim wstWk   As Worksheet
Set wstWk = Workbooks("PERSONAL.XLS").Worksheets.Add
wstWk.Name = "forTatakau"
まぁこれを本来書くべきコードとして、「Add.Name」はその省略形として考えるんであれば納得はいきます。
新しく生成したシートに複数のプロパティをセットした場合には、本来コードで書くしかないわけですしね。

となると、なぜExcelXPのヘルプにはこの記述がないのか。

実は、ExcelXPのヘルプではいろんなオブジェクトのAddメソッドの説明を1ヶ所にまとめてあるんです。
どうもOfficeXPヘルプの特長のひとつに、ページ内で説明を折りたたむ(クリックすると一部が開く)といぅワザを多用するってのがあるみたいで。
この折りたたみ機能を採用するのに、Addメソッドの説明と使用例をまとめちゃったんですが、その際に「Addメソッドはオブジェクトを返す」って一文を削除しちゃったみたいなんですね。

おかげで、ExcelXPの中だけで一所懸命考えてても、Addメソッドの一般的なしくみがわからないような状態になってしまった、と。

Microsoft Officeのヘルプは、実は2000の頃からおかしくなってきてまして。
どうもヘルプを機能ごとにいくつかのファイルに分けているみたいで、F1でヘルプを表示する際にどんな単語の上にカーソルが置かれているかでロードされるファイルの組み合わせが違ってくるんですよね。
おかげでヘルプを丸ごと読んで全体像を把握する、って学習法がとれないんです。

しかも「検索」機能がなくなってしまって。
文章で質問する、って変な機能が代わりについたんですけど、全然知りたいものはヒットしませんし。
キーワードも、基本的な単語さえヒットしない有様。

なんだか実にツカえない代物になってしまっています。…頭にくるなぁ。



すいません、話を戻して。

これで表示座標の格納先は確保できたわけですから、後は、UserFormのUnload時に表示座標を格納し、Load時に取得してその座標位置にUserFormを移動させるコードを書けばいいわけです。

VBを使い慣れてるとちょっととまどいますが、UserFormのLoad時に走るイベントはInitialize(今までにもう使っていますが)、Unload直前に走るイベントはQueryCloseです。
VBAに詳しい方には当たり前のことかもしれませんが、VBから始めた私にはちょっとびっくりな出来事でした。

'****************
' UserForm起動時
'****************
Private Sub UserForm_Initialize()
Dim lngX As Long
Dim lngY As Long
'*** Formパラメータの取得
lngX = Workbooks("PERSONAL.XLS").Worksheets("forTatakau").Cells(1, 1).Value
lngY = Workbooks("PERSONAL.XLS").Worksheets("forTatakau").Cells(1, 2).Value
Me.Move lngX, lngY
'*** 現在のBook/Sheet状況を取得→表示
Call sGetAllBooks 'Book情報の取得と表示
Call sGetSheets(ActiveWorkbook) 'Sheet情報の取得と表示
End Sub
'****************
' UserForm終了時
'****************
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'*** Formパラメータの格納
Workbooks("PERSONAL.XLS").Worksheets("forTatakau").Cells(1, 1).Value = Me.Left
Workbooks("PERSONAL.XLS").Worksheets("forTatakau").Cells(1, 2).Value = Me.Top
Workbooks("PERSONAL.XLS").Save
End Sub
UserForm_QueryCloseイベントの最後に「Save」を入れているのは、座標を格納したPersonal.xlsをディスクに書き出しておきたいからです。
これをやっておかないと、Excelの終了時に「個人用マクロブックを保存しますか?」って聞いてきちゃうので。


さて、これでそこそこ使いやすくなったよぅな気が。
ここまでできると、この機能を公開して、皆さんにも使っていただきたいよぅな気が。

ので、次回は公開用にもぅ少し手を加えてみることにします。

2004年02月07日

05 ブックとシートをシンクロさせる(2)

検証環境 SONY VAIO PCG-U1(Crusoe860MHz/240MB)
WinXPHomeSP1/IE6.0SP1/MSExcel2002SP2

なんだかいろいろぼーとかしているうちに、前稿からすでに2年近く経ってしまいました。
いゃ決してTabと戦うのをあきらめたわけじゃなかったんですよ。えぇえぇいませんでしたとも。ほんとですって。
たゆまぬ努力で改良し続けていましたってば。けっして2年ぶりにふっと気が向いたんじゃありませんって(^^;)。



とはいぅものの、自分でもちょっと前回までの話を忘れてるよぅな気がしますので、まずはおさらい。

まず、UserFormをひとつ作成し、frmTatakauと名前を付けました。
で、CommanButtonを1個、ListBoxを2個貼り付けました。

040207-01.gif

で、このfrmTatakauに書き込んだコードはだいたいこんな感じ。
前回までにお見せしたものから、コメント回りをちょっといじってありますが、コードそのものは変更していません。

Option Explicit
'****************
' UserForm起動時
'****************
Private Sub UserForm_Initialize()
Call sGetAllBooks 'Book情報の取得と表示
Call sGetSheets(ActiveWorkbook) 'Sheet情報の取得と表示
End Sub
'**************
' 再取得ボタン
'**************
Private Sub cmdGetSheets_Click()
Call sGetAllBooks 'Book情報の取得と表示
Call sGetSheets(ActiveWorkbook) 'Sheet情報の取得と表示
End Sub
'****************************************
' Book再選択によるシート情報の取得と表示
'****************************************
Private Sub lstWorkbooks_Click()
Workbooks(lstWorkbooks.List(lstWorkbooks.ListIndex)).Activate
Call sGetSheets(ActiveWorkbook)
End Sub
'**********************************************
' Excelにロードされている全Book情報の取得と表示
'**********************************************
Private Sub sGetAllBooks()
Dim i As Integer
'*** ExcelにロードされているBookの名前をListBoxに表示する
'ListBoxのClear
lstWorkbooks.Clear
'Book名→ListBox
For i = 1 To Workbooks.Count
If (LCase(Workbooks(i).Name) <> "personal.xls") Then
lstWorkbooks.AddItem Workbooks(i).Name
End If
Next
'*** 現在ExcelでカレントになっているいるBookの行を選択状態にする
For i = 0 To Workbooks.Count - 1
If (lstWorkbooks.List(i, 0) = ActiveWorkbook.Name) Then
lstWorkbooks.Selected(i) = True
Exit For
End If
Next
End Sub
'****************************************
' 指定されたBookの全Sheet情報の取得と表示
'****************************************
Private Sub sGetSheets(wbSlct As Workbook)
Dim i As Integer
'*** 指定されたBook中のSheetの名前をListBoxに表示する
'ListBoxのClear
lstSheets.Clear
'Sheet名→ListBox
For i = 1 To wbSlct.Sheets.Count
lstSheets.AddItem wbSlct.Sheets(i).Name
Next
'*** 現在ExcelでカレントになっているSheetの行を選択状態にする
For i = 0 To wbSlct.Sheets.Count - 1
If (lstSheets.List(i, 0) = wbSlct.ActiveSheet.Name) Then
lstSheets.Selected(i) = True
Exit For
End If
Next
End Sub
ちょっと長いですが、勘弁してください。
これからもっと長くなりますので、覚悟してください。

で、先に進む前に。

なんで思わせぶりなヒキにしたのか今となっては自分でもわからないんですが。
Book選択時にExcel側のカレントBookを変更シンクロさせる機能は説明しといて、Sheet選択時にExcel側のカレントSheetをシンクロさせるコードを説明していなかったんですね私。

こんなもん何ほどのもんでもないので、さくっとこんなコードを足しておきましょう。

'********************************
' Sheet一覧と表示Sheetのシンクロ
'********************************
Private Sub lstSheets_Click()
ActiveWorkbook.Worksheets(lstSheets.List(lstSheets.ListIndex)).Activate
End Sub
これで準備完了。先へ進みます。


さてこれでイケるかなだめだ

1つのWorkbookで複数ウィンドウを開いていると表示が合わなくなる。

040207-02.gif

考えてみれば当たり前ですね。
Workbook単位で考えてると、1つのWorkbookで複数のウィンドウを開いていると対応できません。

てことは、Workbook単位ではなく、表示されているウィンドウ単位で考えていかないばなんない、ってことですね。

えーと、WorkbookオブジェクトはWindowsコレクションを持ってるんですね。ので、こいつのWindowNumberを基準にウィンドウを指定してやればいいんです。

てことで、表示をWorkbook名+indexに変えてクリック時にアクティブにするのもWorkbook指定ではなくWindow単位に変更。
あ、でも、Winodwを1つしか持たないWorkbookの場合はWindowNumberを表示しない方がいいですね。Excelのウィンドウキャプションがそんな感じですから、合わせた方が操作時に違和感がないっぽいので。

'**********************************************
' Excelにロードされている全Book情報の取得と表示
'**********************************************
Private Sub sGetAllBooks()
Dim i As Long
Dim j As Long
Dim strWinName As String
Dim lngListIndex As Long

'*** ExcelにロードされているBookの名前をListBoxに表示する
'ListBoxのClear
lstWorkBooks.Clear
'Book名→ListBox
For i = 1 To Workbooks.Count
If (LCase(Workbooks(i).Name) <> "personal.xls") Then
If (Workbooks(i).Windows.Count <= 1) Then
strWinName = Workbooks(i).Name
lstWorkBooks.AddItem Workbooks(i).Name
If (strWinName = ActiveWorkbook.Name) Then
lngListIndex = lstWorkBooks.ListCount - 1
End If
Else
For j = 1 To Workbooks(i).Windows.Count
strWinName = Workbooks(i).Name & ":" _
& Workbooks(i).Windows(j).WindowNumber
lstWorkBooks.AddItem strWinName
If (strWinName = ActiveWorkbook.Name & ":" _
& CStr(ActiveWindow.WindowNumber)) Then
lngListIndex = lstWorkBooks.ListCount - 1
End If
Next
End If

End If
Next
'*** 現在Excelで表示されているBookの行を選択状態にする
lstWorkBooks.Selected(lngListIndex) = True
End If
えーと。

まず、ロードされているWorkBook総当たりってループはそのままで。
ループ内部では、まずそのWorkBookがWindowをいくつ持っているかを判定しています。
1つ以下だったらファイル名のみ。2つ以上であればWindowの数だけ、ファイル名+WindowNumberを表示させます。
取得したWindow一覧の中からアクティブウィンドウを探すのは、後からではもう一度同じようなループを書かなければならなくなりますので、このループの中で同時に判定、ListBoxのIndexを覚えておいて、ループ終了後に選択状態にさせるようにしています。

で、表示をWindow単位に変更してしまったわけですから、クリックした時に選択されるのもWindow単位にしなければなりませんね。

'****************************************
' Book再選択によるシート情報の取得と表示
'****************************************
Private Sub lstWorkBooks_Click()
Dim strBookName As String
Dim lngWindowCnt As Long
Dim i As Long
strBookName = lstWorkbooks.List(lstWorkbooks.ListIndex)
If (InStr(strBookName, ":") > 0) Then
lngWindowCnt = CLng(Mid$(strBookName, InStr(strBookName, ":") + 1))
strBookName = Left$(strBookName, InStr(strBookName, ":") - 1)
For i = 1 To Workbooks(strBookName).Windows.Count
If (Workbooks(strBookName).Windows(i).WindowNumber = lngWindowCnt) Then
Workbooks(strBookName).Windows(i).Activate
Exit For
End If
Next
Else
Workbooks(strBookName).Activate
End If

Call sGetSheets(ActiveWorkbook)
End Sub
WindowNumberって取得しかできないプロパティですので、これを指定して一発ポンでアクティブにするウィンドウを指定することができません。
ので冗長ですが、当該WorkBookに含まれるWindowをindex基準でブン回して、おめあてのWindowNumberを持つウィンドウを探し出してやらなければなりません。

で、結果はこんな感じで。

040207-03.gif

これでだいたい、欲しかった機能を用意することができました。 では次回は、もうちょっとだけ使いやすく。
→続く。

2002年03月30日

04 ブックとシートをシンクロさせる

さて、前回までの作り込みで、表示のための基本機能はおっけーになったわけです。

ので、ここらでちょいと一休み。つか、機能の追加ではなく、使いやすいようなユーザインターフェイス(UI)の部分をちょっと作り込んでおこうかと。



まず、[再取得]ボタンを押した時だけではなく、Formを起動した瞬間に一発ブック/シートを取得表示できるよぅにしておきましょう。
[再取得]ボタンのクリックイベントに書いたのと同じロジックを、Form起動時に発生するイベントプロシージャに書き込んでやればいいだけですね。

てなわけでこんな感じ。

'*** UserForm起動時
Private Sub UserForm_Initialize()
Call sGetAllBooks
Call sGetSheets(ActiveWorkbook)
End Sub



次。

実は前回までに提示したのブック取得のロジックだと、見えてほしくないブックまでをばか正直に取得表示します。たとえば、PERSONAL.XLSとか。てゅうかPERSONAL.XLS。これ、別にシートが表示されるわけではありませんので、今回のシートの一覧表示って主目的から考えるとまったく無意味かつとても邪魔。

なので、これは決め打ちで排除します。

'**********************************************
' Excelにロードされている全Book情報の取得と表示
'**********************************************
Private Sub sGetAllBooks()
Dim i As Integer
'*** ExcelにロードされているBookの名前をListBoxに表示する
'ListBoxのClear
lstWorkBooks.Clear
'Book名→ListBox
For i = 1 To Workbooks.Count
If (LCase(Workbooks(i).Name) <> "personal.xls") Then
lstWorkBooks.AddItem Workbooks(i).Name
End If
Next
'*** 現在Excelで表示されているBookの行を選択状態にする
For i = 0 To Workbooks.Count - 1
If (lstWorkBooks.List(i, 0) = ActiveWorkbook.Name) Then
lstWorkBooks.Selected(i) = True
Exit For
End If
Next
End Sub
いろんなバージョンのExcelで試してみると、PERSONAL.XLSが大文字だったり小文字だったりすることがあるみたいなんですよね…いーんですけど別に。でも文字列比較するときは大文字小文字を明確に区別するので、小文字変換かけてから比較しましょうと。いゃ大文字に合わせてもいぃんですけど、そこんとこは好みだってことでひとつ。


さらに次。

表示されているどのブックの選択行を変えたら、その下に表示されるシートの一覧をシンクロして表示し変えるようにしたいと思います。

シート一覧を見たいブックを選択するたびに[再取得]ボタンを押すのはめんどいので。

さて、ここは注意、ってほどではありませんがわかっておきたいところが。

ブック一覧から表示されているブックを選択するには、ブック用ListBoxにフォーカスがある場合に[↑][↓]キー([RollUp][RollDown]キーも含まれますね)を押下する方法と、マウスで直接選択したいブックの行をクリックする方法があります。

ちょっと違和感がありますが、Clickイベントはキーボードから選択行を変更したときにも発生します。これはVBでも同じ。
名と実が違ぅといぅか看板に偽りありといぅかな気もしますが、まぁ世の中なんてそんなもんだといっそ割り切っていただくのも大人の分別といいますか。少年少女であればこの際このへんから大人の階段を上っていただくといぅ手も。

話を戻して。これを使ってしまえばどっちにでも対応できます。まちがってもMouseUp/DownイベントとKeyUpイベント(さらにKeyDownイベントなんか使われた日にゃ論外)の両方に同じロジックを埋め込んだりしようとしないこと。

ちょっとVB/VBAを使える方なら「まさかっ」ってリアクションになりそぅですが、いるんですよ。あてずっぽで不適切なイベントを使っちゃうのが。イベントの無限連鎖コンボになりますって。だめですって。て言ってるのにやるなこら新人のP君そんな人いません。

てことで、ブック用ListBoxのClickにシート一覧取得/表示のプロシージャを呼び出すコードを書いちゃえばいいんですけど。

'*** Book再選択によるシート情報の取得と表示
Private Sub lstWorkBooks_Click()
Call sGetSheets(lstWorkBooks.List(lstWorkBooks.ListIndex))
End Sub
…だめだ。確かに選択したブックのシート一覧は表示されますが、肝心のExcelに表示されているブックはそのまんま。ので一覧と実際の表示の関係がくずれて、操作しているうちに自分が何をやっているのかわからなくなってしまいそぅです。。

ので、ブックを選び変えた時にExcel側のブックも連動して表示し変えるよぅにしちゃいましょぅ。

どのブックを最前面に持ってくるかは、Activateメソッドで指定します。

てことでこんな感じで修正してみました。

'*** Book再選択によるシート情報の取得と表示
Private Sub lstWorkBooks_Click()
Workbooks(lstWorkBooks.List(lstWorkBooks.ListIndex)).Activate
Call sGetSheets(ActiveWorkbook)

End Sub
じゃぁシートの方もそぅやっちゃえ。

→と思っていいかどぅか。続く。

2002年03月28日

03 シートの取得と表示

まずお詫びと訂正。

説明と画像が別のものになっておりました。

020328-01.png

前回の説明とソースであれば、上のような結果となります。カレントブックの行が選択反転されることはありません。まだそんなコード書いてないもの。



ならば書きましょう。
現在表示されているブックはActiveWorkbookオブジェクトとして提供されていますので、ブック用ListBoxに格納されている各ブック名とActiveWorkbookオブジェクトのNameプロパティを突き合わせれば、どのブック名を反転選択させればいいかがわかります。

といぅコードが、以下な感じ。

For i = 0 To Workbooks.Count - 1
If (lstWorkBooks.List(i, 0) = ActiveWorkbook.Name) Then
lstWorkBooks.Selected(i) = True
Exit For
End If
Next
ブック取得の機能もおんなじようなループを持っていますので、ひとつにまとめてもいいんですけど。
いろんな機能を同時進行でまぜこぜにしてしまうと、意図外の干渉を起こしてバグったりデバッグの際にややこしかったりとあまりろくなことがないので、私は単機能縦書き派

てゅうかこの方が説明しやすいから、ってのもあるんですけどね。

ここまで書いてから実行すると、前回の最後の画像通りにカレントブックが選択された状態になります。同じ画像を2回提示してもしょーないので割愛しますが。
プロシージャとしてはこんな感じでまとめてみました。

'**********************************************
' Excelにロードされている全Book情報の取得と表示
'**********************************************
Private Sub sGetAllBooks()
Dim i As Integer
'*** ExcelにロードされているBookの名前をListBoxに表示する
'ListBoxのClear
lstWorkBooks.Clear
'Book名→ListBox
For i = 1 To Workbooks.Count
lstWorkBooks.AddItem Workbooks(i).Name
Next
'*** 現在Excelで表示されているBookの行を選択状態にする
For i = 0 To Workbooks.Count - 1
If (lstWorkBooks.List(i, 0) = ActiveWorkbook.Name) Then
lstWorkBooks.Selected(i) = True
Exit For
End If
Next
End Sub



さて、今回のお題はシートの取得と表示なんですけれども。

実はあんまり説明することがないんです。
だってブックの取得→表示とほぼ同じロジックなんだもの。

ポイントは、ブック/カレントブックのオブジェクトを、上手にシート/カレントシートのオブジェクトに差し替えるだけだったりします。

ですので、これもさっくりコードの提示で済ませてしまいます。

'****************************************
' 指定されたBookの全Sheet情報の取得と表示
'****************************************
Private Sub sGetSheets(wbSlct As Workbook)
Dim i As Integer
'*** 指定されたBook中のSheetの名前をListBoxに表示する

'ListBoxのClear
lstSheets.Clear
'Sheet名→ListBox
For i = 1 To wbSlct.Sheets.Count
lstSheets.AddItem wbSlct.Sheets(i).Name
Next
'*** 現在Excelで表示されているSheetの行を選択状態にする

For i = 0 To wbSlct.Sheets.Count - 1
If (lstSheets.List(i, 0) = wbSlct.ActiveSheet.Name) Then
lstSheets.Selected(i) = True
Exit For
End If
Next
End Sub
これを連続した動作にしてしまえば、[再取得]ボタンの押下ひとつで一気にシートの一覧表示まで持ち込めます。のでClickイベントにシート用の関数も追加。
'*** 再取得ボタン
Private Sub cmdGetSheets_Click()
Call sGetAllBooks
Call sGetSheets(ActiveWorkbook)
End Sub
で、実行結果はこちら。

020328-02.png

正直言ってだから何っ?って機能なんですけどね。

でもまぁこれからこれから。

よぅやくブックとシートの一覧が表示できるよぅになりましたので、次回からはこのフォームを使ってブック/シートをいじくることを考えてみましょう。

→続く。

2002年03月23日

02 ブックの取得と表示

さて前回闘うなどと述べてしまったわけですが。

とりあえずどぅ戦うかをちょっと考えてみましょう。

まず、Excelは複数のブック(ファイル)を同時に読み込むことができるわけです。で、そのブックのそれぞれにいくつかのシートを持っているわけです。

ですから、シートを自由にどぅこぅしよぅと思ったら、読み込んである全部のブックもどぅこぅすることを考えた方がいいわけですね。

ので、基本的な考えとしては。全部のブックと全部のシートを管理しとこうと。きっちり取得さえできれば、後はどぅにでもなるのではないかと。

かといって、あまりExcel本体のイベントに頼りたくはありません。前回のVolatile で懲りました。めんどくさくない程度に手動でどぅこぅしよぅかと。

てことで、まずはブックとシートの取得から。



めんどくさいので、VBAの細かい使い方は割愛します。興味のある方は、自分であれこれイジってみてください。

まず、こんな感じでUserFormをひとつ用意してみます。

020323-01.png

それぞれの名前はこんな感じで。

フォームfrmTatakau 
[再取得]ボタンcmdGetSheetsブック/シートを取得します。
上のListBoxlstWorkBooks取得したブックを表示します。
下のListBoxlstSheets取得したシートを表示します。

全ブック名の取得

ブック名の一覧表示

ブックをひとつ選択

選択したブックの全シートの取得

シート名の一覧表示

といぅ流れを実装したいわけですから、最初はやっぱりブックの取得でしょう。

どのタイミングで動作させるかなんて演出は後回しにしますので、まずは[再取得]ボタンを押せば実行できるようにしましょうか。

ブック構造は、WorkBooksコレクションが持っていますので、この中のそれぞれのWorkBookオブジェクトからNameを取得してやればいいことになります。

ヘルプについてるサンプルコードを調べると、

Workbooks("BOOK1.XLS").Activate
のようにブック名を引数としてブックを指定するのがふつぅのようなんですが、今回はそのブック名を知りたいわけですからパス。
For Each w In Workbooks
If w.Name <> ThisWorkbook.Name Then
w.Close savechanges:=True
End If
Next w

のように総当たりする手法もありますが、今回は厳密にオブジェクトの順番に取得したいので、惜しいけれどもこれもパス。
えと、これ簡単に言うと、要はメニューの[ウィンドウ(W)]を開いた時に表示されるファイル一覧の逆順に取得したいわけです。

てゅうわけで、

For i = 1 To Workbooks.Count
lstWorkBooks.AddItem Workbooks(i).Name
Next
って手法を採用。おっと、ListBoxへの格納手法まで公開しちまったぃ。てほどのことでもありませんが。

ここまで決めたら、いっぺんコードを組んでみます。

で、こんな感じ。

'*** 再取得ボタン
Private Sub cmdGetSheets_Click()
'*** ExcelにロードされているWorkBookの名前をListBoxに表示する
'ListBoxのClear
lstWorkBooks.Clear
'workBook名→ListBox
For i = 1 To Workbooks.Count
lstWorkBooks.AddItem Workbooks(i).Name
Next
End Sub
もちろんこれからこのコードはなんべんも動作させることになりますので、最初にListBoxをクリアしておくのはもぅデフォルト。

あ。WorkBooksコレクションの配列添字は1~ブック数です。このへん、ポイント。
ListBoxの添字は0~(行数-1)ですので、きっちり覚えておかないと後でだんだんぐちゃぐちゃになってきますよ。

→続く。次回はシートの取得と関数化。かな?

2002年03月20日

01 予告編

みなさんは、Excelの下の方が嫌いではないでしょうか。私は嫌いです。

あのタブ。

Sheet1/\Sheet2/\Sheet3/\Sheet4/\   ←こんなの。

Excelで書類書いてると、あっといぅ間にタブが20やら30やらに増殖するんです。しかも各タブに意味の通るタイトルをつけたりするもんですから、ひとつひとつのタブが妙に長くなったりもします。

これ、いったんはみ出すとスクロールがいらいらするインターフェイス。ひとタブずつの左右スクロールと最右・最左にしか操作できません。

右下のスクロールバーを縮めて少しでもタブ表示領域を広げたり、Ctrl+RollUp/Downのキーボード操作で操作の高速化を図ったりもしてみましたがしょせん焼け石に水。

くそぅ。闘ってやるっ。

むしろタブを増やしたくてしかたがなくなるくらいに操作性に優れたタブインターフェイスを。作り込みまくってやる。タブマスターとかタブウィザードとかタブハッカーとか呼ばれるほどに。< 呼ばれません。