講師の教務可能科目の検索システムを運用開始前にテストをしつつマニュアルを作成しているところです。
テストをしていたら不具合と修正したほうが良い箇所を見つけたのでそのメモです。
1. リストボックスのスクロールバーが動かない
リストボックスのスクロールバーはマウスホイールで動かないことは仕様です。しかし、今回の不具合はそもそもスクロールバー自体に触れられませんでした。
解決方法は、該当のリストボックスのプロパティの一つであるEnableをTrue、LockedをFalseにすることです。どちらも既定値であるので、変に弄ってなければそのままだと思います。
2. ListBosの表示を昇順にしたい
ListBoxは二次元配列を表示していますが、二次元配列をソートするのは面倒くさい。しかし、テーブルの上から順に配列に格納していく実装をしているので、テーブルをソートしてしまえばListBoxの表示もソートされた状態にできます。
現在テーブルのコピー、結合は次のような実装をしています。
sarchableというシート内のセルを全てクリアし、別シートからテーブルをコピーするというのが大雑把な流れです。
2-1. テーブルを昇順にソートする
With Worksheets("sarchable")
.Range("mergedTable").Sort Key1:=.Range("mergedTable[講師番号]"), Order1:=xlAscending, Header:=xlYes
End With
テーブル名がmergedTableであり、その講師番号の列の値をkeyとして昇順にソートしています。テーブルのソートはkeyを参照して行の順番を入れ替えることができます。
Range.Sortメソッドの構文は次のとおりです。
式.Sort (Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase , Orientation , SortMethod, DataOption1, DataOption2 , DataOption3)
Orderは昇順、降順があり、それぞれ次のように指定します。
- 昇順: xlAscending
- 降順: xlDescending
(XlSortOder列挙より)
2-2. テーブルに名前をつける
先程はテーブル名を記述することでテーブルを指定していました。しかし、もともとの実装が一度シート内のセルを全てクリアしてからコピーするというものなので、コピーする度にテーブルの名前が変わります。
テーブルに名前をつけない場合はExcelが自動的に名前をつけてくれます。末尾に数字をつけるようですが、いちいち計算してその名前を当てるのも面倒くさいので、テーブルをコピーしたらテーブルに名前をつけることにしました。
Dim myTable As ListObject
With Worksheets("sarchable")
Set myTable = .ListObjects.Item(1)
myTable.Name = "mergedTable"
End With
ListObject.NameプロパティはListObjectの名前を表す文字列型の値を取得または設定します。リファレンスの例では取得のやり方だけ書かれていますが、上のようにすると名前を設定できます。
3. おわりに
今の所Googleスプレッドシート上のスクリプトもちゃんと動作しています。
問題はVBAでクエリの更新ができないことですが、どうしたらいいんだろう。マクロの記録を使って作ったマクロすら動かないってどういうこと?