各テーブルの列名を一覧で取得する関数

すごく面倒だったのでググった内容を基に関数を作成。

事前準備

  • テーブル「W_TABLE_LIST」の作成
    • table_name:テキスト型、テーブル名を格納
    • col_name:テキスト型、列名を格納
    • col_type:テキスト型、列の型名を格納
    • col_size:テキスト型、列のサイズを格納

ソース

'各クエリのSQL文をテーブルに格納する関数
Public Sub GetField()
On Error GoTo Err_GetField

    Dim DB As DAO.Database
    Dim Tableloop As DAO.TableDef
    Dim Fld As DAO.Field
    Dim strTablename As String
    Dim Tdf As DAO.TableDef

    Dim strSQL As String    'SQL文
    Dim strType As String   '型名

'''''''''''''''''''''''''''''''''''''''''''''''''''
''typeの置換は定数でselect case
'    '1:    dbBoolean
'    '2:    dbByte
'    '3:    dbInteger
'    '4:    dbLong
'    '5:    dbCurrency
'    '6:    dbSingle
'    '7:    dbDouble
'    '8:    dbDate
'    '10:   dbText
'    '11:   dbLongBinary
'    '12:   dbMemo
'    '15:   dbGUID
'    '18:   dbChar
'    '20:   dbDecimal
'    '21:   dbFloat
'
''確認用
'    Debug.Print dbBoolean & vbTab & ": dbBoolean"
'    Debug.Print dbByte & vbTab & ": dbByte"
'    Debug.Print dbInteger & vbTab & ": dbInteger"
'    Debug.Print dbLong & vbTab & ": dbLong"
'    Debug.Print dbCurrency & vbTab & ": dbCurrency"
'    Debug.Print dbSingle & vbTab & ": dbSingle"
'    Debug.Print dbDouble & vbTab & ": dbDouble"
'    Debug.Print dbDate & vbTab & ": dbDate"
'    Debug.Print dbText & vbTab & ": dbText"
'    Debug.Print dbLongBinary & vbTab & ": dbLongBinary"
'    Debug.Print dbMemo & vbTab & ": dbMemo"
'    Debug.Print dbGUID & vbTab & ": dbGUID"
'    Debug.Print dbChar & vbTab & ": dbChar"
'    Debug.Print dbDecimal & vbTab & ": dbDecimal"
'    Debug.Print dbFloat & vbTab & ": dbFloat"
'
'''''''''''''''''''''''''''''''''''''''''''''''''''
'レコード削除・追加時の警告メッセージOFF
    DoCmd.SetWarnings False

'テーブルのリストを初期化
    DoCmd.RunSQL "DELETE * FROM W_table_list"

'DBの各テーブル名を見て、システムテーブルで無いものを判別して処理
    Set DB = CurrentDb
    For Each Tableloop In DB.TableDefs

        strTablename = Tableloop.Name

        If Left(strTablename, 2) <> "MS" Then

            Set Tdf = DB.TableDefs(strTablename)

            For Each Fld In Tdf.Fields

                'typeの置換
                Select Case Fld.Type
                    Case 1
                        'dbBoolean
                        strType = "Boolean"

                    Case 2
                        'dbByte
                        strType = "Byte"

                    Case 3
                        'dbInteger
                        strType = "Integer"

                    Case 4
                        'dbLong
                        strType = "Long"

                    Case 5
                        'dbCurrency
                        strType = "Currency"

                    Case 6
                        'dbSingle
                        strType = "Single"

                    Case 7
                        'dbDouble
                        strType = "Double"

                    Case 8
                        'dbDate
                        strType = "Date"

                    Case 10
                        'dbText
                        strType = "Text"

                    Case 11
                        'dbLongBinary
                        strType = "OLEオブジェクト"
                    
                    Case 12
                        'dbMemo
                        strType = "Memo"

                    Case 15
                        'dbGUID
                        strType = "オートナンバー"

                    Case 18
                        'dbChar
                        strType = "Char"

                    Case 20
                        'dbDecimal
                        strType = "Decimal"

                    Case 21
                        'dbFloat
                        strType = "Float"

                    Case Else
                        'ERROR?
                        strType = "ERROR?(" & Fld.Type & ")"

                End Select

                'テーブルに格納
                strSQL = "INSERT INTO W_table_list (table_name, col_name, col_type, col_size) values (" & _
                            """" & strTablename & """, """ & Fld.Name & """, """ & strType & """, """ & Fld.Size & """)"

                DoCmd.RunSQL strSQL
            Next Fld

        End If

    Next Tableloop

'結果見たいからテーブル初期化しない

Exit_GetField:
'DBクローズ、レコード削除・追加時の警告メッセージON、処理完了
    DB.Close
    Set DB = Nothing

    MsgBox "完了しました。"
    Exit Sub

Err_GetField:
    MsgBox Err.Description
    Resume Exit_GetField

End Sub

InputBoxのIMEモードの指定方法

AccessのInputBoxで、入力時のIME操作を指定する方法をググってみたのでメモ。
InputBoxを表示する直前にIME入力モードを設定したテキストボックスに一旦移動させることで、IMEを指定したモードに変更できるらしい。

前提

  • フォームにテキストボックス「txt_IME」を配置。
    • プロパティで「IME入力モード」を任意のIMEモードに指定。
      • ただし半角英数は「オフ」じゃないと変換が必要な状態になるので注意。

ソース

Dim strUNIT As String

'InputBox表示前にIME入力モードを設定したテキストボックスに一旦移動させることでIMEを切る。
Me.txt_IME.SetFocus
strUNIT = InputBox("入力してください。", "入力")

windows7のAllUserのデスクトップフォルダ

前にこんなことを書いたんですけど、今度はAllUserのデスクトップが分からなくなったのでメモ。

  • ユーザー別
    • C:\Users\<ログインユーザー名>\Desktop
  • All Users
    • C:\Users\Public\Desktop
      • C:\Users\All Users\Desktop はショートカットがあるけどアクセス拒否される?

クエリのSQLを確認する方法

すごく面倒だったのでググったらあったのでメモ。
ついでにファイルじゃなくてテーブルに置きました。

事前準備

  • テーブル「W_TABLE_LIST」の作成
    • TABLE_NAME:文字列型
    • QuerySQL:メモ型
  • クエリのタイトルを全部「Q_〜」にしておく。
    • わかるように統一してあればいいです。

ソース

'各クエリのSQL文をテーブルに格納する関数
Public Sub QueryToSQL()
On Error GoTo Err_QueryToSQL
    Dim strSQL As String

    Dim cnn As New ADODB.Connection
    Dim rst As New ADODB.Recordset

    Dim Dbs As DAO.Database
    Dim Qdf As DAO.QueryDef

'レコード削除・追加時の警告メッセージOFF
    DoCmd.SetWarnings False

'テーブルのリストを初期化
    strSQL = "DELETE * FROM W_TABLE_LIST"
    DoCmd.RunSQL strSQL

'データベースセット
    Set Dbs = CurrentDb  '実行中テーブルを参照する場合
    'Set Dbs = DAO.OpenDatabase("c:\test.mdb")  '別テーブルを参照する場合はこっちでフルパス指定

'クエリ名を取ってくる、「MsysObjects.Type = 5」でクエリ指定、
'さらに「MsysObjects.Name like "Q_*"」でクエリを絞込み(フォームのレコードソースなどを参照しないようにするため)
    strSQL = "SELECT " & _
                    "MsysObjects.Name " & _
                "FROM " & _
                    "MsysObjects " & _
                "WHERE " & _
                    "MsysObjects.Type = 5 " & _
                    "AND MsysObjects.Name like ""Q_*"""

'レコードセットを回してクエリとSQLを抽出
    Set cnn = CurrentProject.Connection
    rst.Open strSQL, cnn, adOpenStatic, adLockReadOnly

    While rst.EOF = False
        'クエリ名&SQLステートメントをそれぞれ格納するSQLを実行
        '(SQLに「"」が含まれている時は「""」に、改行は半角スペースに置き換え)
        strSQL = "INSERT INTO W_TABLE_LIST(TABLE_NAME, QuerySQL) " & _
                    "VALUES(""" & CStr(Dbs.QueryDefs(CStr(rst("Name").Value)).Name) & """" & _
                            ", """ & Replace( _
                            Replace( _
                                        CStr(Dbs.QueryDefs(CStr(rst("Name").Value)).SQL) _
                                        , """" _
                                        , """""" _
                                    ) _
                                    , vbNewLine _
                                    , " " _
                            ) & """" & _
                            ")"
        DoCmd.RunSQL strSQL
        rst.MoveNext
    Wend

'結果見たいからテーブル初期化しない

Exit_QueryToSQL:
'レコードセットの終了、DBのリセット、レコード削除・追加時の警告メッセージON、処理完了
    rst.Close
	cnn.Close
    Set rst = Nothing
    Set Dbs = Nothing
    DoCmd.SetWarnings True
    Exit Sub

Err_QueryToSQL:
    MsgBox Err.Description
    Resume Exit_QueryToSQL

End Sub

サクラエディタでdiff確認する方法

ファイル内容の差分確認のやり方をググったら、ここに書いてあったのでメモ。

GNU diffutils 2.7.2 (Win32 版)」を入れる

ここの「diff272w.zip」をダウンロードして解凍。
中に入ってる「diff.exe」をサクラエディタのexeファイル(sakuraW.exe)と同フォルダに置くことで使用可能になる。
使用方法はこんな感じ。

あとヘルプ開いたらここにつながった。
でも「diff.exe はパッケージに含まれません。別途ソフトウェア配布サイト等からダウンロードしてください。」
とあって、その入手先のリンクがリンク切れてたのでした。

サブフォームの列の幅や順番を変更して保存しても反映されないときは

Accessのフォームの話だけど。

windows7のスタートアップ・ディレクトリの開き方

  • ユーザー別
    • C:\Users\<ログインユーザー名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
    • [スタート]メニューの[すべてのプログラム]->[スタートアップ]を右クリックして[開く]か[エクスプローラ]
  • All Users
    • C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
    • [スタート]メニューの[すべてのプログラム]->[スタートアップ]を右クリックして[開く - All Users]か[エクスプローラ - All Users]


[開く]と[エクスプローラ]って何が違うんだろ。