2015年3月30日月曜日

[Excel] 時刻を使うグラフ軸でメモリ間隔の調整

Excelで時間/時刻をグラフに軸に使用する場合は、目盛間隔のデフォルトはExcelが自動的に調整するので、概ねキリの良い目盛間隔にならない。

また1日(24H)を1とする数値で表現しているので、目盛間隔を分かりやすく調整するには時刻の少数値を指定する必要がある。これはグラフの「軸のオプション」から以下の目盛間隔を指定すれば良い。

(表)Excelの目盛間隔のサンプル一覧
目盛間隔算出式指定する値
24時間11
12時間1/20.5
6時間1/40.25
3時間1/80.125
1時間1/240.041666667
30分1/24/20.020833333
15分1/24/40.010416667
10分1/24/60.006944444
5分1/24/120.003472222
1分1/24/600.000694444
30秒1/24/60/20.000347222
15秒1/24/60/40.000173611
10秒1/24/60/60.000115741
5秒1/24/60/125.78703703703704E-5
1秒1/24/60/601.15740740740741E-5

5秒以下の指数表記は、そのまま使用できる。なお Excel2010 ならば計算式でも入力が可能であったが、Excel2013 では少数しか受け付けてくれないようです。

■ 参考資料

グラフの縦 (数値) 軸の目盛を変更する(Microsoft)
https://support.office.com/

2015年3月14日土曜日

[MSAccess] ナビゲーション ウィンドウの表示を更新する

VBAでテーブル等を作成した後は、未だナビゲーション ウィンドウに表示されていない。この場合にナビゲーション ウィンドウの表示を更新する方法です。

特定のテーブルを表示する方法
Call DoCmd.SelectObject(ObjectType:=AcObjectType.acTable, ObjectName:="テーブル名", InDatabaseWindow:=True)

ナビゲーション ウィンドウをリフレッシュして、最新の状態を表示する方法
Application.RefreshDatabaseWindow

[MSAccess] 開いているフォームを全て閉じる

Microsoft Access で開いているフォームを全て閉じる方法です。

Form を全て閉じるサンプル
Dim AccObj As AccessObject
For Each AccObj In CurrentProject.AllForms
  If AccObj.IsLoaded Then
    DoCmd.Close AcObjectType.acForm, AccObj.Name, AcCloseSave.acSaveNo
  End If
Next

■ 参考資料

CurrentProject.AllForms プロパティ
https://msdn.microsoft.com/ja-jp/library/office/ff193455.aspx

Is it possible to use VBA code to close all open objects (forms, tables etc.)?
http://bytes.com/topic/access/answers/614454-possible-use-vba-code-close-all-open-objects-forms-tables-etc

[MSAccess] 開いているテーブルを全て閉じる

Microsoft Access データシート ビューで開いているテーブル、クエリを閉じる方法です。以下は開いているテーブルを全て閉じるサンプルです。特定のテーブルだけ閉じるには、DoCmd.Close メソッドでテーブル名を引数で指定すればよい。

Table を閉じる場合
Dim AccObj As AccessObject
For Each AccObj In CurrentData.AllTables
  If AccObj.IsLoaded Then
    DoCmd.Close AcObjectType.acTable, AccObj.Name, AcCloseSave.acSaveNo
  End If
Next


Query を閉じる場合
For Each AccObj In CurrentData.AllQueries
  If AccObj.IsLoaded Then
    DoCmd.Close AcObjectType.acQuery, AccObj.Name, AcCloseSave.acSaveNo
  End If
Next


■ 参考資料

AllTables オブジェクト (Access)
https://msdn.microsoft.com/ja-jp/library/office/ff193974.aspx
データベースの開いているテーブルをすべて表示するには、AllTables コレクションの各 AccessObject オブジェクトの IsLoaded プロパティを使用します。

2015年2月13日金曜日

[MSAccess] クエリの入力には、1つ以上のテーブルまたはクエリが必要です

SELECT 句にサブクエリが含まれると、エラーとなる場合がある。

(エラーとなるサンプル)
SELECT
  Now As 日付,
  (SELECT Price FROM テーブル1 WHERE code='0001') As 時価

エラーメッセージ:[3067] クエリの入力には、1つ以上のテーブルまたはクエリが必要です。

Access SQL では、こういう場合に無用なダミーテーブルを準備する必要はない。ただし迂回策として、サブクエリの代わりに DLookup 関数を使う方法がある。

(修正したSQL)
SELECT
  Now As 日付,
  DLookup("Price", "テーブル1", "code='0001'") As 時価


■ 参考資料

[ACC2003] DLookup() の使い方、例、トラブルシューティング
http://support.microsoft.com/kb/285866/ja

2015年2月12日木曜日

[MSAccess] オブジェクトが正しくないか、現在設定されていません

CurrentDb メソッドを使って DAO オブジェクトの参照を取得した場合に、エラーが発生することが多い。

(エラーとなるサンプル)
Dim Table As DAO.TableDef
Set Table = CurrentDb.TableDefs("テーブル1")
Debug.Print Table.Name

エラーメッセージ:[3420] オブジェクトが正しくないか、現在設定されていません。

マイクロソフト サポート情報によると、これは CurrentDb メソッドの参照を明示的に変数に代入してから使用する必要がある、とのこと。

(改善例)
Dim DB As DAO.Database
Set DB = CurrentDb()
Dim Table As DAO.TableDef
Set Table = DB.TableDefs("テーブル1")
Debug.Print Table.Name


これだとバグとしか思えないんですが、言語仕様なんでしょうか・・

■ 参考資料

ACC: "Object Invalid or No Longer Set" Error Using CurrentDb
http://support.microsoft.com/kb/167173/ja

2015年2月9日月曜日

[MSAccess] 数値の出力フォーマット

SELECT 句などで数値の出力フォーマットを指定したい場合は、FormatNumber 関数が利用できます。

(例)
SELECT FormatNumber(12345, 2, True, False, True) As Value1
パラメータの意味は順に、出力する値/少数は2桁/小数点の左側の 0 を表示/負の値をかっこで囲まない/桁区切り記号を使用する

(出力結果)
Value1
---------
12,345.00


値がNullの場合は空欄で出力されます。

■ 参考資料

FormatNumber 関数 (Visual Basic)
https://msdn.microsoft.com/ja-jp/library/xfta99yt.aspx