2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

発掘:みんなのAccess備忘録 Logの中にある分

Last updated at Posted at 2019-02-26

\http ://www .accessclub.jp/php/history/history.php?mode=main
Microsoft Access Club からのお知らせ
■ 投稿キーの採用について
Date: 2007年07月15日(日)

相次ぐスパ投稿対策として「投稿キー」を採用することにさせていただきました。
BBSに投稿していただく際に、表示されている四桁の数字を入力して下さい。
次に、タイトル及びコメント記事に日本語が含まれていない場合は投稿を拒否する仕様とさせていただきます。
また、URLを多数書き込むスパム投稿もあることから、最大3つのURLまで書き込み可能な仕様とさせていただきます。
順次、対応済みのBBSを送り出しますので、全て切り替わるまで暫くお時間をいただきます。

  皆さんからのご協力、よろしくお願いします。
■ 添付ファイルBBSの廃止について
Date: 2007年06月25日(月)
昨今、「添付ファイルBBS」へ不埒な投稿が相次いでいますので、これを機に廃止させていただきました。
突然ですが、ご了承下さい。
■ 「ユーザーが作るAccess備忘録」の閉鎖について
Date: 2006年12月29日(金)
昨今、「ユーザーが作るAccess備忘録」に不要な書込みが多数寄せられ正常な運営ができない状況になっておりますので、本意でありませんが「ユーザーが作るAccess備忘録」を閉鎖させていただきます。
今までのご利用、ご支援、ありがとうございました。
■ Access系サイトのリンク集追加
Date: 2006年12月19日(火)

以下のサイトを「アクセスリンク集」に追加させていただきました。

・パソコンの王様~苦手なパソコンが得意になる!
http: // 1pcking. com/
・マイクロソフトアクセスを実践攻略!マイクロソフト認定スクール
http:/ /pc-dr. jp/
■ WebForumへの投稿内容について
Date: 2006年04月08日(土)

管理者のAkiraです。

昨今、MS Accessに関係のない私的な投稿が相次いでおります。
日本国内にはいろいろなご意見をお待ちの方々がいらっしゃり、これが意見について当サイトで激論を交わしていただくのは当サイト設立の趣旨を大きく外れるものです。
今後はこの種の投稿を慎んでいただくようお願いします。

現在、運営中のWebForumに関して、以下のような仕様の見直しを進めております。

1.管理者のみが、特定のスレッドに対して以降の新規レス回答を禁止する機能付加。
2.管理者のみが、投稿済みの親スレッド及び回答レスの修正、削除を禁止する機能付加。

改造が終了次第、WebForumを入れ替え既存スレッドを整理しますので、ご承知下さい。
■ テキストボックスを用いて あいまい検索 を行う方法 : SampleFile249のプロシージャ一部修正
Date: 2006年03月01日(水)

「参考ファイル」のNo249でご紹介しているプロシージャに一部不具合が見つかりました。 以下のとおり修正しましたのでご連絡します。
Function TakeOut(strName As String, str区切り As String, _
strFieldName As String, g As Integer)

(省略)

TakeOut = Vartemp

TakeOut = "(" & Vartemp & ")"
■ フォーラム系への半角文字タイトルの投稿制限について
Date: 2006年02月18日(土)
管理者のAkiraです。
昨今、海外系からと思われる迷惑な投稿が相次いでいます。
これを防止する手段として、「半角のみのタイトル」を受け付けないよう措置を講じました。
ご協力よろしくお願いします。

なお、このプログラミングは、[まさ7251]さんから提供をいただきました。
ありがとうございます。
■ Accessリンク集へサイトを追加(1サイト)
Date: 2006年01月20日(金)
サイト名 : Accessむかむか
サイトURL: http :// www. sanryu. net/acc/
AccessTipsを解説と画像を織り交ぜて紹介されているサイトです。
BASP21.DLLを用いたメール送信がユニーク・・。
■ 参考ファイル他更新済み
Date: 2005年10月30日(日)
・SampleFile254 表形式のフォームに行を追加する方法
http://www.accessclub.jp/samplefile/samplefile_254.html
・SampleFile255 連結サブフォームに行を追加する方法
http://www.accessclub.jp/samplefile/samplefile_255.html
・VBATips59 Parentプロパティを用いて簡潔にコードを記述する方法
http://www.accessclub.jp/vbakaisetu/58.html
・VBATips58 CurrentDataプロパティを用いて全クエリ名を取得する方法
http://www.accessclub.jp/vbakaisetu/59.html
・Access有料製作を開始して:AccessClub Essay集15
http://www.accessclub.jp/essay/15.html
・CurrentDataオブジェクトを用いてクエリ名をコンボボックスに表示する : AccessTips136
http://www.accessclub.jp/actips/tips_136.htm

■ VBAのTips解説の掲載終了
Date: 2005年10月13日(木)
VBAのTips解説をNo57を以って一旦終了とさせていただきます。
http://www.accessclub.jp/vbakaisetu/ WebArchive
■ Access裏技シリーズ
Date: 2005年09月03日(土)
1ページ程にまとめた「裏技」シリーズは、
取り敢えず90ページで一旦終了させていただきます。
http://www.accessclub.jp/urawaza/index.html WebArchive
みんなのAccess備忘録 Log
無茶苦茶なスパム投稿で閉鎖されてしまったAccessClub「みんなのAccess備忘録」ですが、
一部アクセスできるものが残っています。
Access一日一見 : 超々ビギナー対象WebArchive
AC97でInStrRev関数と同等の関数を自作X
これは削除されてみあたらないのだが、
ばらさんの「林道の鬼」にあるという情報を得た
http://makoto-watanabe.main.jp/vba_character.html
https://web.archive.org/web/20190330091827/http://www.geocities.co.jp/SilkRoad/4511/vb/instrrev.htm

Option Explicit

'----- InStrRev 関数 Ver 1.02 -----
'
'ある文字列 (strTarget) の中から指定された文字列 (strFind) を
'最後の文字位置から検索を開始し、最初に見つかった文字位置
'(先頭からその位置までの文字数) を返す文字列処理関数です。
'なお、いいかげんに作ったので処理速度は保障しません(^^;
'
'引数 strTarget
'   必ず指定します。検索先の文字列式を指定します。
'
'引数 strFind
'   必ず指定します。検索する文字列式を指定します。
'
'引数 lngStart
'   省略可能です。各検索の開始位置を設定する数式を指定します。
'   引数 lngStart を省略すると -1 が使用され、最後の文字位置から
'   検索を開始します。
'
'引数 lngCompare
'   省略可能です。文字列式を評価するときに使用する文字列比較の
'   モードを表す数値を指定します。
'
'   vbBinaryCompare - バイナリ モードで比較を行います。 (0)
'   vbTextCompare   - テキスト モードで比較を行います。 (1)
'
'   引数 lngCompare を省略すると、バイナリ モードで比較が行われます。
'
'戻り値
'   見つかった文字列の先頭位置を返します。
'   見つからなかった場合や引数に不正な値が指定された場合、0 を返します。
'
'
'Ver 1.02 より、VB6 等の InStrRev 関数に極めて近い仕様に変更しましたので、
'前バージョン以前から使用されている方はご注意下さい。
'といっても lngStart に渡された値による条件分岐が変更になった程度です。
'(lngStart に 0 などの不正な値を渡すと関数を抜けるように変更)
'
Public Function InStrRev _
    (ByRef strTarget As String, _
     ByRef strFind As String, _
     Optional ByVal lngStart As Long = -1, _
     Optional ByVal lngCompare As Long = vbBinaryCompare) As Long

    Dim lngTargetSize As Long                                               '検索対象文字列 (strTarget) のサイズを格納する変数
    Dim lngFindSize As Long                                                 '検索文字列 (strFind) のサイズを格納する変数
    Dim i As Long                                                           'ループカウンタ
    Dim strRight As String                                                  'strFind の最後の 1 文字を格納する変数
 
    lngTargetSize = Len(strTarget)                                          '検索先の文字列のサイズを取得
    If lngTargetSize = 0 Then Exit Function                                 '検索先文字列が 0 文字の場合、関数を抜ける
    lngFindSize = Len(strFind)                                              '検索文字列のサイズを取得
    If lngFindSize = 0 Then Exit Function                                   '検索文字列が 0 文字の場合、関数を抜ける
    
    If lngStart = -1 Then                                                   '検索開始位置に -1(デフォルト) が指定されている場合
        lngStart = lngTargetSize                                            '検索開始位置を検索先文字列の末尾に設定
    ElseIf lngStart < -1 Or lngStart = 0 Or lngStart > lngTargetSize Then   '検索開始位置の値が不正な場合
        Exit Function                                                       '関数を抜ける
    End If
    
    strRight = Right$(strFind, 1)                                           '検索文字列の後ろ 1 文字を抜く

    For i = lngStart To lngFindSize Step -1                                 'lngStart から文字列の最初の方向へループ
        If StrComp(Mid$(strTarget, i, 1), strRight, lngCompare) = 0 Then    '検索文字列の後ろ 1 文字と i 番目の 1 文字が一致した場合
            If lngFindSize = 1 Then                                         '検索文字列が 1 文字の場合
                InStrRev = i                                                'そのまま見つかった位置を返す
                Exit For                                                    'ループを抜ける
            '検索文字列と同じ文字数だけ抜き出し、検索文字列と抜き出した文字列が一致した場合
            ElseIf StrComp(Mid$(strTarget, i - lngFindSize + 1, lngFindSize), strFind, lngCompare) = 0 Then
                InStrRev = i - lngFindSize + 1                              'その文字列の先頭位置を返す
                Exit For                                                    'ループを抜ける
            End If
        End If
    Next i

End Function

AccessでExcelのROUNDUP・ROUNDDOWN関数に相当するものを作る方法 - というかこれは絶対作る
Accessでの切上げ・四捨五入・切捨て関数
Access全バージョン制覇?
Format関数の書式
Switch関数のその他
Visual Basic の名前付け規則
Write と Print
サブフォームのコントロールを取得する
スタートアップ プロパティの使用例
データシートの表示
データベースを共有モードで開く
データベースを共有モードの読み取りで開く
データベースを排他モードで開くプロシージャ
リストのn行目の項目を既定値に表示させる
固定長エクスポートでの桁ずれ(2000以降)
誤って削除してしまったテーブルを復活させる
参照設定の確認
条件付書式を 97でやる方法
日付型の条件の yy/mm/dd 指定方法について
文字列内でのクォーテーション

Visual Basic の名前付け規則 -- みんなのAccess備忘録

分類

VBA

解説

 

  • Visual Basic のモジュールで、プロシージャ、定数、変数、および引数に名前を付ける場合、次の規則に従います。

    • 名前の先頭は文字でなければなりません。
    • 名前にはスペース、ピリオド (.)、感嘆符 (!)、および @、&、$、# などの文字を使うことはできません。
      名前は 255 文字 (半角の場合) 以内でなければなりません。

通常、Visual Basic の関数、ステートメント、 およびメソッドと同じ名前を使うことはできません。Visual Basic で使用している同じ名前のキーワードの機能が使えなくなります。 割り当てた名前と競合する組み込み関数、ステートメント、またはメソッドを使用する場合、明示的に識別する必要があります。組み込み関数、 ステートメント、またはメソッドの前に、関連するタイプ ライブラリの名前を指定してください。たとえば、Left と呼ばれる変数がある場合、 VBA.Left を使って Left 関数だけを呼び出すことができます。

同じレベルの適用範囲内で、同じ名前を使用することはできません。 たとえば同じプロシージャ内で、age という名前の 2 つの変数を宣言することはできません。 ただし、age という名前のプライベート変数と age という名前のプロシージャ レベルの変数は、同じモジュールで宣言できます。
メモ Visual Basic では、大文字と小文字は区別されませんが、名前を宣言するステートメントの大文字は保持されます。

名前に関する関連資料(マイクロソフトHP)
[ACC2002]日本語名のプロシージャが実行できない
最終更新日: 2001/09/13
文書番号: JP414234

[AC95] プロシージャ名に特定の全角文字を含むと変換中にエラー
最終更新日: 1997/11/09
文書番号: JP404986
[ACC2002]クエリの抽出条件に2バイト」の関数名を指定するとエラー
文書番号:JP418090
[ACC2002]コントロールソースに特定のユーザー定義関数名を設定するとエラー
文書番号:JP417786(駒澤)
 

私的意見

ユーザー定義関数を「漢字(多分2バイトコードの名前すべてがだめかも)」で名前を付け、クエリ等で使用するとそのときはうまく動くのですが、式ビルダーを行うと「未定義関数」と表示され、いったん終了させてからでないと、ユーザー定義関数が使えません。おそらくAccessの問題だと思いますが、たとえば「請求」という関数を作った場合、いろいろな問題が出るようです。「seikyu」とした場合には、正常に動くようです。もちろんPublic Functionで作成しております。
日本語が使えるのは便利ですが、「ハマル」ような状況が起きて苦労します。(駒澤)

関連リンク

書き込みはまだありません。

サブフォームのコントロールを取得する -- みんなのAccess備忘録

解説

AccessVBAを独学し始めた頃、一番戸惑ったところです。

【書式】Forms![メインフォーム名]![サブフォーム名].Form![サブフォームのコントロール名]

[ここがポイント!]

この書式の中で使う"サブフォーム名"はメインフォームをデザインビューで見たときのサブフォームのプロパティに出てくる「名前」です。(Piko)

[推定]AC97でInStrRev関数と同等の関数を自作

これは完全に失われているが~~、strReverceを使う~~strReverceを使うと検索文字の字数だけ位置がずれてしまう。このため正規表現で再現してみた。完全ではないだろう。

Function InstrRev1997(StrTest, strSearch, startcnt As Long, comparetextbinary)
'comparetextbinary vbBinaryCompare =0 vbTextCompare=1
' format
' InstrRev1997("ABCDEF","DEF",-1,vbBinaryCompare)
' strtest Strings
' startcnt: Start Search position from head 1 , 0, or -1 same means. They mean Head position
' ABCDEF and DEF return 4. Because D poition from head is 4.
  Dim Testlong As Long
  Dim FindLong As Long
  Dim Str As String, buf As String
  Dim StartCharCnt As Long
  Dim Reg 'As RegExp: Set Reg = New RegExp
  Dim Ms 'As MatchCollection
  Dim i As Long, m 'As Match
  Dim strReg As String
  Dim tempStr As String
  Dim IndexCnt As Long
  Set Reg = CreateObject("VBScript.RegExp")
On Error Resume Next
   If IsNull(StrTest) = True Or IsNull(strSearch) = True Then InstrRev1997 = vbNull: Exit Function 'いずれかがNullならNullを返す
  Testlong = Len(CStr(StrTest)) '検索する対象の文字列の字数をカウント
  If Testlong = 0 Then InstrRev1997 = startcnt: Exit Function
  FindLong = Len(CStr(strSearch)) '検索する文字列の字数をカウント
  '通常のInstrRevはInStrと違い-1が使えないが、ここで変換することにより使える。
  If startcnt = -1 Or startcnt = 0 Then StartCharCnt = Testlong Else StartCharCnt = startcnt
  If FindLong = 0 Then InstrRev1997 = StartCharCnt: Exit Function '検索対象文字列が空文字列ならStartCharCntを返す。これで-1を使ってもエラーにならずInstrRevと同様の動作になる
  If Testlong < FindLong Then InstrRev1997 = 0: Debug.Print "Testlong < FindLong": Exit Function '検索したい文字列が、検索対象の文字列より長いことはないので、0を返して終了
  tempStr = strSearch
  Reg.Global = True
  If comparetextbinary = vbBinaryCompare Then Reg.IgnoreCase = False Else Reg.IgnoreCase = True
  Reg.MultiLine = True
  Reg.Pattern = VbLike(strSearch)
  Str = Mid(StrTest, 1, StartCharCnt)
  Set Ms = Reg.Execute(Str)
Set m = Ms.Item(Ms.Count - 1)
IndexCnt = m.FirstIndex + 1
strSearch = tempStr '検索文字列をもとに戻す
InstrRev1997 = IndexCnt
Set Reg = Nothing
Exit Function

'Error Handle
If Err.Number = 0 Then
Exit Function
Else
Debug.Print "InstrRev1997", Err.Number, Err.Description
InstrRev1997 = 0: Exit Function
End If
End Function
Function VbLike(sPattern)
'検索文字列を正規表現に置き換える関数
Dim objRE, sAdd1, sAdd_1, xAdd, UAdd, AAdd
Set objRE = CreateObject("VBScript.RegExp")
'escape character add
sPattern = Replace(sPattern, "\", "\\", 1, -1)
sPattern = Replace(sPattern, "*", "\*", 1, -1) 'wildcard escape
sPattern = Replace(sPattern, "?", "\?", 1, -1) 'wildcard escape
sPattern = Replace(sPattern, ".", "\.", 1, -1) 'wildcard escape
sPattern = Replace(sPattern, "+", "\+", 1, -1)
sPattern = Replace(sPattern, "|", "\|", 1, -1)
sPattern = Replace(sPattern, ")", "\)", 1, -1)
sPattern = Replace(sPattern, "(", "\(", 1, -1)
sPattern = Replace(sPattern, "[", "\[", 1, -1)
sPattern = Replace(sPattern, "]", "\]", 1, -1)
sPattern = Replace(sPattern, Chr(13), "\r", 1, -1)
sPattern = Replace(sPattern, Chr(10), "\n", 1, -1)
sPattern = Replace(sPattern, vbTab, "\t", 1, -1)
sPattern = Replace(sPattern, " ", "\s", 1, -1)
sPattern = Replace(sPattern, " ", "\s", 1, -1)
VbLike = sPattern
End Function
Sub FunctionTestInstrRev1997()
'前から 1 文字目で見つかったときは 1 を返します。
'検索ワードが見つからなかったときは 0 を返します。
'開始位置を省略するか -1 を指定すると最後の文字から検索します。
'開始位置は前からの文字数です。開始位置が 5 なら、前から 5 文字目から前方に検索します。
'比較モードを指定するときは必ず「開始位置」も指定します。
Dim StrTest: StrTest = "sample.txt.txt": Rem: strtest = "ABCDEF"
Dim strSearch: strSearch = "txt.": Rem: strSearch = "DEF"
Dim RestorebBuf: RestorebBuf = strSearch
Dim cnt As Long: cnt = -1
Debug.Print "InstrRev1997", InstrRev1997(StrTest, strSearch, cnt, vbTextCompare): Rem strSearch = RestorebBuf
Debug.Print "InstrRev", InStrRev(StrTest, strSearch, cnt, vbTextCompare)

Debug.Print "InStr", InStr(Abs(cnt), StrTest, strSearch, vbTextCompare)
Debug.Print "InStr2", InStr(Abs(cnt), StrReverse(StrTest), StrReverse(strSearch), vbTextCompare)
Debug.Print "InStr3", 1 + Len(StrTest) - InStr(Abs(cnt), StrReverse(StrTest), StrReverse(strSearch), vbTextCompare)
  Dim strString
  Dim strFile
  Dim i As Long
  Debug.Print InStrRev("ABCDEFGHIJK", "EFG", -1, vbTextCompare) & "," & InstrRev1997("ABCDEFGHIJK", "EF", -1, vbTextCompare)
': strSearch = RestorebBuf

  strFile = "sample.txt.txt"    'ドットが2つ以上ある場合もある Len =14
  strString = Mid(strFile, InStrRev(strFile, strSearch) + 1)
  Debug.Print strString
  i = InstrRev1997(strFile, strSearch, -1, vbTextCompare): Rem: strSearch = RestorebBuf
  strString = Mid(strFile, i + 1)

  Debug.Print strString
End Sub

Accessでの切上げ・四捨五入・切捨て関数 -- みんなのAccess備忘録

分類

VBA

解説

元ネタは、関連リンクにある、MSのページです。


'----------------------------------------------------------------------
'切り上げ
Public Function usRoundUp(X As Currency, S As Integer) As Currency
      Dim W As Currency
      W = 10 ^ Abs(S)
      If S > 0 Then
    usRoundUp = Int(X * W + 0.999) / W
      Else
     usRoundUp = Int(X / W + 0.999) * W
   End If
End Function

'四捨五入
Public Function usRound(X As Currency, S As Integer) As Currency
  Dim W As Currency
   W = 10 ^ Abs(S)
  If S > 0 Then
   usRound = Int(X * W + 0.5) / W
  Else
  usRound = Int(X / W + 0.5) * W
End If
End Function
'切り捨て
Public Function usRoundDown(X As Currency, S As Integer) As Currency
Dim W As Currency
W = 10 ^ Abs(S)
If S > 0 Then
  usRoundDown = Int(X * W) / W
Else
  usRoundDown = Int(X / W) * W
End If
End Function

【使い方】
1 モジュールを新規作成し、上記のコードをコピペする。
2 モジュールをコンパイルして保存する。
3 クエリで使う場合、新規フィールド欄に、
  切捨て:usRoundDown([フィールド名],0)
  のようにすれば使えます。
(イケガミ)

私的意見

書き込みはまだありません。

関連リンク

[ACC97]四捨五入の計算方法-----本家、MSのページです。(イケガミ)
http://support.microsoft.com/default.aspx?scid=kb;ja;JP416839

AccessでExcelのROUNDUP・ROUNDDOWN関数に相当するものを作る方法

分類

VBA

解説

モジュールを新規作成して、以下のコードを入力して保存します。


Option Compare Database

Public Function RoundUp(x As Currency, s As Integer) As Currency

Dim w As Currency
t = 10 ^ Abs(s)

If x > 0 Then
If s > 0 Then
RoundUp = -Int(-x * t) / t
Else
RoundUp = -Int(-x / t) * t
End If
Else
If s > 0 Then
RoundUp = Int(x * t) / t
Else
RoundUp = Int(x / t) * t
End If
End If

End Function

Public Function RoundDown(x As Currency, s As Integer) As Currency

Dim t As Currency
t = 10 ^ Abs(s)

If x > 0 Then
If s > 0 Then
RoundDown = Int(x * t) / t
Else
RoundDown = Int(x / t) * t
End If
Else
If s > 0 Then
RoundDown = -Int(-x * t) / t
Else
RoundDown = -Int(-x / t) * t
End If
End If

End Function

これで、
RoundUp([数値],[桁数])
RoundDown([数値],[桁数])
が使えるはずです。試してみて下さい。
(Netwanderer)

私的意見

イケガミさんが「みんなのAccess備忘録」に書き込まれた、「Accessでの切上げ・四捨五入・切捨て関数」を参考にさせていただきました。
ありがとうございました。>イケガミさん

私はより精度をあげてみたのですが、いかがでしょうか?もし、不具合などあれば教えて下さい。

それにしても、何でAccessにはこんな関数が用意されていないのか?(Netwanderer)
このような独自関数を公開していただけるのは、有り難いです。(ぱんち)
偉いと思う。小生は算数ができないので、びっくりした。アクセスには大事な機能が無くて、不要な機能がやたら多い。つまり、使いにくい。(かぼ)
同感です。
何故、この機能が最初からないのか??不思議です。(Akira)

関連リンク

書き込みはまだありません。

Access全バージョン制覇?

分類

その他

解説

別に全バージョンでなくてもいいのですが
業務の関係で同一PC(共有でも可)にいろんなバージョンのAccessが必要な方へ・・
Access95、Office97/Access97、Office2000/Access2000
対象OS:Win95,Win98,WinNT4.0,WinMe (Win2000以降Access95動作不可)

1.インストールするPC(またはファイルサーバー)にAccessまたはOffice専用共有を作成する
\SERVER\MSOFFICE
  \#自PCの共有を見ることできますので・・・
 2.Access95のインストール
  setup.exe /a として起動
  インストール先は、\SERVER\MSOFFICE\ACCESS95 等と
  共有ファイルは、\SERVER\MSOFFICE\MSAPPS95 と指定
  その後、\SERVER\MSOFFICE\ACCESS97\SETUP.EXE を起動
 3.Access97(またはOffice97)のインストール
  setup.exe /a として起動
  インストール先は、\SERVER\MSOFFICE\ACCESS97 等と
  共有ファイルは、\SERVER\MSOFFICE\MSAPPS97 と指定
  その後、\SERVER\MSOFFICE\ACCESS97\SETUP.EXE を起動
 4.Access2000(またはOffice2000)のインストール
  普通にインストール可能です。
  ローカルに入れても可、ネットワーク先でも可
Access97/Office97、Office2000/Access2000以降すべて
 対象OS:Win98以降、Win2000以降
 Access97(Office97)は上記手順1,3と同様
 Access2000以降は、MSで共存がサポートされています。
参考までに
Access95、97、2000を共存しようとして普通にインストールすると
絶対壊れます
(OS再インストール必須)
補足ですが・・・
アップグレード版ではこのようなことはできませんので、正規版を使用して下さい。

Format関数の書式 -- みんなのAccess備忘録

分類

VBA

解説

Format関数の構文
Format([値],"[書式設定]")

以下書式設定に入れる文字列です

行いたい事 : [書式設定]に入れるもの: 例
カンマ区切り : #,##0 : 1,234
¥マーク入り : \#,##0 : \1,234
単位付き : #,##0\円 : 1,234円
小数点桁数の指定 : #,##0,0000 : 1,234.5670
小数点桁数の指定2 : #,##0,0### : 1,234.567
日付の書式 : YYYY/MM/DD HH:NN:SS : 2002/11/28 10:18:30
YYYYMMDDをYYYY/MM/DD : @@@@/@@/@@ : 20021128->2002/11/28
西暦を和暦 : GGGEE\年MM\月DD\日 : 2002/11/28->平成14年11月28日
和暦を西暦 : YYYY\年MM\月DD\日 : 平成14年11月28日->2002年11月28日
数値を曜日 : AAAA : 1->日曜日
四半期を返す : Q : 2002/01->1
郵便番号 : @@@-@@@@ : 2510871->251-0871
左に0を充填 : 00000 : 123->00123
左に半角スペースを充填 : @@@@@ : 123-> 123
全部大文字 : > : abc->ABC
全部小文字 : < : ABC->abc
曜日:aaa:2003/01/30 -> 木
カンマ区切りで0なら表示しない : #,### : 1234->1,234 0->(表示しない)

私的意見

今わかっているもののみですが。。。
この関数は、VBA必須関数です。応用範囲も広いし、Goodですね。(ぱんち)

関連リンク 書き込みはまだありません

Switch関数のその他 -- みんなのAccess備忘録

分類

全般

解説

Switch関数で、どの条件にもあてはまらなかった場合(その他)の
戻り値を設定する方法
###方法
条件の最後に、「TRUE」を設定します。
###例
Swith([条件]="A","最高",[条件]="B","普通",TRUE,"最悪")
###注意
Switch関数は、条件判断を左から行うので、左(最初)にTRUEを
設定すると、全てTRUEの戻り値(例題では"最悪")を返してしまいます。
必ず、一番最後に設定すること。
(谷牙)

私的意見

Switch関数は、発生し得る全ての条件を設定するのが面倒なので、
この方法を知っていると結構便利かも。。。(谷牙)

関連リンク

書き込みはまだありません。

スタートアップ プロパティの使用例 -- みんなのAccess備忘録

分類

VBA

解説

■スタートアップ プロパティの使用例■
http://www.accessclub.jp/bibouroku/005.html
次の SetStartupProperties プロシージャは、設定するスタートアップ プロパティの名前、データ型、および設定値を ChangeProperty プロシージャに渡します。 ChangeProperty プロシージャは、スタートアップ プロパティを設定します。プロパティが見つからない場合、CreateProperty メソッドを使用して、 プロパティを Properties コレクションに追加します。スタートアップ プロパティは、設定されるまで、 または少なくとも 1 回変更されるまで、Properties コレクションに存在しないので、プロパティを追加する処理が必要です。

Sub SetStartupProperties()
Const DB_Text As Long = 10
Const DB_Boolean As Long = 1
ChangeProperty "StartupForm", DB_Text, "得意先"
ChangeProperty "StartupShowDBWindow", DB_Boolean, False
ChangeProperty "StartupShowStatusBar", DB_Boolean, False
ChangeProperty "AllowBuiltinToolbars", DB_Boolean, False
ChangeProperty "AllowFullMenus", DB_Boolean, True
ChangeProperty "AllowBreakIntoCode", DB_Boolean, False
ChangeProperty "AllowSpecialKeys", DB_Boolean, True
ChangeProperty "AllowBypassKey", DB_Boolean, True
End Sub

Function ChangeProperty(strPropName As String, varPropType As Variant, varPropValue As Variant) As Integer
Dim dbs As Object, prp As Variant
Const conPropNotFoundError = 3270

Set dbs = CurrentDb
On Error GoTo Change_Err
dbs.Properties(strPropName) = varPropValue
ChangeProperty = True

Change_Bye:
Exit Function

Change_Err:
If Err = conPropNotFoundError Then ' プロパティが見つかりません。
Set prp = dbs.CreateProperty(strPropName, _
varPropType, varPropValue)
dbs.Properties.Append prp
Resume Next
Else
' 認識できないエラー。
ChangeProperty = False
Resume Change_Bye
End If
End Function

(沢木)

データシートの表示

http://www.accessclub.jp/bibouroku/014.html
サブフォームでデータシートを使用する場合に、列の固定を行うことによって指定した項目を画面スクロールにかかわらず画面に表示できる。
固定したいフィールドの選択 > 書式 > 列の固定の順番にて行えます。
(ハル).

私的意見

書き込みはまだありません ...

補足

キャッシュから獲得している。これは
データシートビューで列を固定して表示する
と同じもののようだ。

データベースを共有モードの読み取りで開く -- みんなのAccess備忘録

分類

VBA

解説

DAOを用いて、データベースを共有モードの読み取りで開くプロシージャ。


Function DataBase共有排他Open()

on error goto エラー
dim db as database

Set db = Workspaces(0).OpenDatabase("Accessファイル名",False,True)

Exit Function

エラー:

MsgBox "予期せぬエラー発生。"
End

End Function
  • DAOを用いて、データベースを排他モードの読み取りで開くプロシージャは、下記のように引数を一部変更するだけで対応できます。

Set db = Workspaces(0).OpenDatabase("Accessファイル名",True,True)

(笹川 きよし)

私的意見

書き込みはまだありません。

関連リンク

書き込みはまだありません。

データベースを排他モードで開くプロシージャ -- みんなのAccess備忘録

分類

VBA

解説

DAOを用いて、データベースを排他モード開くプロシージャ。

Function DataBase排他Open()

on error goto エラー
dim db as database

Set db = Workspaces(0).OpenDatabase("Accessファイル名",True,False)

Exit Function

エラー:

MsgBox "予期せぬエラー発生。"
End

End Function

(笹川 きよし)

私的意見

書き込みはまだありません。

リストのn行目の項目を既定値に表示させる -- みんなのAccess備忘録

分類

VBA

解説

コンボボックスで表示させる場合

コンボボックスの既定値=[コンボボックス名].ItemData

(PIKO)

私的意見

書き込みはまだありません。

関連リンク

書き込みはまだありません。

固定長エクスポートでの桁ずれ(2000以降) -- みんなのAccess備忘録

分類

その他

解説

 
以下のような文字が含まれている場合、固定長としてテキストファイルにエクスポートすると、桁がずれてエクスポートされます。
・ギリシャ文字
・ロシア文字
・罫線素片
・囲み英数字
・ローマ数字
・単位記号
・省略文字
・囲み文字
いわゆる、機種依存文字です。

現象の再現手順

1.Access を起動し、
  新規データベース (mdb) を作成します
2.以下のテーブルを作成します。

========================================
テーブル1

F1      F2
ああ※  あああ
いいい  いいい

F1 テキスト型
F2 テキスト型

※に現象の起こる文字を入れてください

========================================

3.[ファイル] メニューの [エクスポート] より、
  テーブルを固定長テキストでエクスポートします。
4.エクスポートされたテキスト ファイルを開きます。
結果

以下のようにずれてエクスポートされます。

ああ※   あああ
いいい  いいい
Text IISAM ドライバ バージョン 4.0 の障害として認識しています。

だそうですので、不具合ですね。

これを回避するには、直接VBAで書き出します。
処理としては、ADOを使用しレコードを読み取り、LenB(StrConv([フィールド], vbFromUnicode))
を使用し半角1バイトでのバイト数を取得し、Space関数で桁を合わせます。

Sub test1()
 Const cLngSize As Long = 10
 Dim cn As ADODB.Connection
 Dim rs As ADODB.Recordset
 Dim StrFilePath As String
 Dim IntFile As Integer
 Dim StrValue As String
 Dim StrTmp As String
 Dim LngTmp As Long
 Dim i As Long
 Set cn = CurrentProject.Connection
 Set rs = New ADODB.Recordset
 StrFilePath = CurrentProject.Path & "\test.txt" 'パス
 IntFile = FreeFile
 With rs
  .Open "テーブル1", cn, adOpenStatic, adLockReadOnly
  If .RecordCount > 0# Then
   Open StrFilePath For Output Shared As #IntFile
    Do Until .EOF
     StrValue = vbNullString
     For i = 0 To 1
      StrTmp = Nz(.Fields(i), vbNullString)
      LngTmp = cLngSize - LenB(StrConv(StrTmp, vbFromUnicode))
      StrValue = StrValue _
         & StrTmp _
         & Space$(LngTmp)
     Next i
     Print #IntFile, StrValue
     .MoveNext
    Loop
   Close #IntFile
  End If
  .Close: Set rs = Nothing
 End With
 cn.Close: Set cn = Nothing
End Sub

(まる)

私的意見

 
環境によって文字化けや不具合するような機種依存文字はそもそもデータに使用するべきではないと思います。(まる)
すみません、誤ってリンクを削除してしまったようです。(YU-TANG)

関連リンク

[ACC2002]指定した位置と異なる位置でテキストがインポートされる-----Jet 4.0 SP-6 で Fix されています。(YU-TANG)
[ACC2002]固定長テキストへのエクスポートでずれる-----MSのサポートページ 不具合についての文書(まる)

誤って削除してしまったテーブルを復活させる

分類

全般

解説

これで助かった経験があるので書いておきます。
関数名をわかりやすく変えたりしています。


Public Function Fukkatu(Optional varFukkatuTable _ 
As Variant) As Boolean

';*****************************************************
';誤って削除してしまったテーブルを復活させる
';(最後に削除したテーブルに対してのみ有効)
';テーブルを削除してからデータベースを閉じていないことと、
';データベースを最適化していないことが条件
';
';標準モジュールに記述しておき、イミディエイトウィンドウで
';?Fukkatu("テーブル名")
';を入力し、Trueが返れば成功
';*****************************************************

  Dim db As DAO.Database
  Dim strSQL As String
  Dim strTablename As String
  Dim intI As Integer

On Error GoTo Err_Fukkatu
  Set db = CurrentDb
  Fukkatu = False
  For intI = 0 To db.TableDefs.Count - 1
    strTablename = db.TableDefs(intI).Name
    If Left(strTablename, 4) = "~tmp" Then
    strSQL = "SELECT DISTINCTROW [" & strTablename & _ 
    "].* INTO [" & varFukkatuTable & _ 
    "] FROM [" & strTablename & "];"
    DoCmd.SetWarnings False
    DoCmd.RunSQL strSQL
    DoCmd.SetWarnings True
    Fukkatu = True
  Exit For
End If
Next intI

Exit_Fukkatu:
Set db = Nothing
Exit Function

Err_Fukkatu:
MsgBox Err.Description
Resume Exit_Fukkatu

(vivi)
まぁ、あくまで最後の手段ということで。常識ですが、こまめにファイルのバックアップを取っておくことも必要ですね。
(vivi)

私的意見

書き込みはまだありません。

関連リンク

書き込みはまだありません。

条件付書式を 97でやる方法 -- みんなのAccess備忘録

分類

フォーム

解説

Access2000の新機能に条件付書式というものがあります。

条件付書式とは、帳票フォームなどでレコードの値によって文字の色や背景色を変更するというものです。
単票フォームではVBAを使用してプロパティを変更すれば出来ますが、
帳票フォーム・データシート ビューではそうはいきません。

以下は帳票フォームで実現する方法です。データシート ビューでは出来ません。

◆文字色をデータによって変える。

テキストボックスを2つ配置します。
配置する位置は上位置・左位置同じです。
つまり重ねて配置します。

前面側のテキストボックスは[背景スタイル]を「いいえ」にします。
背面側のテキストボックスは表示するべき[背景色]&[背景スタイル]を「はい」にします。
[前景色](文字色)をそれぞれ変えて
コントロールソースに

=IIf([フィールド名] = "条件",[フィールド名],Null)
=IIf([フィールド名] = "条件",Null,[フィールド名])
とそれぞれに入れます。

これで表示してみると変わっている事がわかると思います。
次にこのテキストボックスを入力や変更をしたい場合、
コントロールソースに式を入れているため変更が出来ません。

それを入力可にするには、
さらにテキストボックスを最背面に重ねて配置します。
コントロールソースには「フィールド名」を普通に入れます。
で、式を入れたテキストボックスの[タブストップ]を「いいえ」にして、
最前面のテキストボックスの[フォーカス取得時]イベントに

=[最背面のテキストボックス名].SetFocus

と入れます。

この方法以外に数値の正負の違いならば、
[書式]プロパティでも出来ます。(まる)
 

私的意見

 方法を見ればわかると思いますが、結構重い処理だったりする場合もあります。
使用するか、また使用データ量で実用に耐えるかよく確認し多方がいいと思います。
(まる)
エクセルとよく似た操作で手軽に色を付けられるところがいいですね。(ぱんち)

関連リンク 書き込みはまだありません

日付型の条件の yy/mm/dd 指定方法について -- みんなのAccess備忘録

分類

VBA

解説

VBA上でSQL文を実行する場合は、フォームでの Filterを使用する時に、日付型を条件にする事があると思います。
この日付指定に、
"[フィールド名] #" & Me![日付] & "#" という書き方をすると、ただしく抽出されない場合があります。
OSの日付の設定が 年2桁になっている場合、
00/01/01 = 2000年1月1日
01/01/01 = 2001年1月1日
01/01/02 = 2002年1月1日
01/01/03 = 2003年1月1日
となってしまいます。
これは、英語圏では日付を mm/dd/yy で認識しているからです。

これを回避するには、OSの日付の設定を4桁にするか、
Format関数を使用して、yyyy/mm/dd形式にすればいいです。

関連の動作として、
VBエディタ上で、
#02/01/01#
と入力すると
#2/1/2001#
と変換されます。

OSの設定を統一するのは、条件として不確かなので
全てFormatを使用するべきでしょう。
特に NT系はデフォルトで年4桁になっているので、
開発環境では動くのに、
クライアントの9x系で正しく動かないと言う事がありえます。
(まる)
文字列内でのクォーテーション -- みんなのAccess備忘録
http://www.accessclub.jp/bibouroku/010.html

分類

VBA

解説

 
★文字列内でのクォーテーション★
連結される文字列を記述する場合に、文字列の中に別の文字列を指定したり、文字列の中に文字列変数を指定することが必要な場合があります。
文字列を別の文字列の中にネストするのは次のような場合です。

・定義域集計関数で抽出条件を指定する場合
・Find 系メソッドで抽出条件を指定する場合
・フォームの "Filter/フィルタ" プロパティまたは "ServerFilter/サーバーフィルタ" プロパティのための抽出条件を指定する場合
・SQL 文字列を記述する場合

上のどの場合でも、文字列は Jet データベース エンジンに渡されます。
たとえば、定義域集計関数に引数 criteria を指定した場合、Access によって各変数が評価され、 これらが 1 つの文字列に連結されてから、抽出条件の文字列全体が Jet データベース エンジンに渡されます。

数値変数を指定した場合は、変数が評価され、その値が単純に文字列に連結されます。
しかし、変数が文字列の場合、得られる抽出条件の文字列では、文字列の中に文字列が含まれています。
文字列の中の文字列は、文字列区切り記号で識別する必要があります。
このようにしないと、Jet データベース エンジンは、文字列のどの部分が使用する値なのかを判断できません。

文字列の区切り記号は、変数の一部ではありませんが、引数 criteria を形成する文字列に含める必要があります。
引数 criteria に文字列を記述するには、3 とおりの方法があります。
どの方法でも、次のどちらかの形式の引数 criteria が作成されることになります。

"[氏名] = '山川'"

  • または -

"[氏名] = ""山川"""

シングル クォーテーションを含める方法

変数の値が文字列に連結されたときにシングル クォーテーションで囲まれるようにするには、引数 criteria にシングル クォーテーションを含めます。
たとえば、引数 criteria に strName という文字列変数を含める場合、引数 criteria は次のように記述できます。

"[氏名] = '" & strName & "'"
変数 strName が評価され、"抽出条件" 文字列に連結されると、"抽出条件" 文字列は次のようになります。

"[氏名] = '山川'"

[メモ]
この構文の場合、変数の値の中でシングル クォーテーションを使用することはできません。文字列変数の値にシングル クォーテーションが含まれていると、 実行時エラー

が発生します。変数の値にシングル クォーテーションが含まれる場合は、以下に説明する別の構文を使用してください。

ダブル クォーテーションを含める方法

変数の値が評価されたときにダブル クォーテーションで囲まれるようにするには、 引数 criteria にダブル クォーテーションを含めます。
文字列の中では、2 つの連続するダブル クォーテーションを使って、 1 つのダブル クォーテーションを表す必要があります。
たとえば、引数 criteria は次のように記述できます。
"[氏名] = """ & strName & """"

変数 strName が評価され、 引数 criteria に連結されると、連続する 2 つのダブル クォーテーションは 1 つのダブル クォーテーションに置換されます。
このため、引数 criteria は次のようになります。

"[氏名] = "山川""

この構文はシングル クォーテーションの構文よりも複雑に見えますが、 この構文を使うと、ダブル クォーテーションを含む文字列も引数 criteria に指定できます。
また、文字列の中に 1 つまたは複数の文字列をネストすることもできます。

クォーテーション マークを表す変数を含める方法

ダブル クォーテーションを表す文字列変数を作成し、 この変数を、他の変数の値と共に引数 criteria に連結できます。
ダブル クォーテーションの ANSI 文字表記は Chr$(34) です。
この値を文字列変数 strQuote に代入すると、引数 criteria は次のように記述できます。

"[氏名] = " & strQuote & strName & strQuote

変数が評価され、引数 criteria に連結されると、引数 criteria は次のようになります。

[氏名] = "山川"

(こまちゃん)
 

私的意見 書き込みはまだありません。

関連リンク 書き込みはまだありません。

 

--この記事は、みんなのAccess備忘録に投稿いただいた内容です--

BBSへの入り方

2016年10月24日 【Access2010】先にフォームを消した場合のクラスオブジェクト解放について
No14356.クラスオブジェクトが解放できないです
フォームにレポートをリンクさせているときに、先にフォームを削除すると「コードの保持」をTrueにしていると消えないフォームができてしまう。
まずbbs2が初心者 0044 が過去ログというような構造になっている。

まずトップページ
https://web.archive.org/web/20111010065521/http://accessclub.jp/index.html
から入ってBBSのTreeをクリックさらに過去ログをクリックという流れになる。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?