「AccessVBA開発」カテゴリーアーカイブ

【Access】フォームウィザードでフォームが作成できない⇒基のテーブル等でフィールド名に特殊文字を使用した場合は、作成できない

【問題】フォームウィザードでフォームが作成できない

【答え】基のテーブル等でフィールド名に特殊文字を使用した場合は、フォームが作成できない。

http://support.microsoft.com/default.aspx?scid=kb;ja;826763

★Access、または Microsoft Visual Basic アプリケーションや
Active Server Pages (ASP) アプリケーションなどの他のアプリケーションで作業する場合、
以下の特殊文字の使用を避ける必要があります。

スペース
二重引用符 ”
アポストロフィ ‘
アクセント記号 `
番号記号 #
パーセント記号 %
不等号 (より大) >
不等号 (より小) <
感嘆符 !
ピリオド .
角かっこ [ または ]
アスタリスク *
ドル記号 $
セミコロン ;
コロン :
疑問符 ?
キャレット ^
中かっこ ( または )
正符号 +
バックスラッシュ \

【Access】レポートでSUM関数の結果がエラーになってしまうのはナゼ!?

★☆★☆★☆★☆★☆★☆★☆ 解決 ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
「AccessのレポートでSUM関数の結果がエラーになってしまうのはナゼ!?」
Sum関数の引数は、レポート上の独自のコントロール名では動作しません。
必ずレコードソースに存在するフィールド名を設定する必用があります。

詳細エリアにコントロールソースが「=[数量]*[単価]」の「小計」コントロールがあるとします。
この[小計]フィールドはレコードソースに存在しないので、「=Sum([小計])」では集計ができません。

存在するフィールド名を使用した形、この場合では「=Sum([数量]*[単価])」とすれば
目的の結果を得ることができます。

———————-

=Sum(IIf([税抜き原価]=””,0,[税抜き原価]))

————————
もう1つ、ポイントです。
「Sum関数」は、レポートフッターかグループフッターに設置します。
ページフッターでは動作しないので注意。

【AccessVBA】ADO、DAOのレコードセットで検索や抽出に 条件式およびSQLでWHERE句に使用する条件式の書式と事例

★☆★☆★☆★☆★☆  解決 ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
◎VBAを使ってのADO、DAOのレコードセットで検索や抽出に
条件式およびSQLでWHERE句に使用する条件式の書式と事例です。
データ型によって記述方法が異なります

特に変数を使用する場合は注意が必要です。

http://fk-plaza.jp/acs/TIPS/waza19.htm

●より大きい(小さい)
数値型     ” [年齢] > 25 ”
数値型変数 [年齢] > ” & var
日付/時刻型 ” [生年月日] > #5/25/1965#
●範囲 ( 「 Between 」演算子を使用 )
日付/時刻型 ” [生年月日] Between #1/1/1995# And #12/31/2000#

●複合条件 ( 「 And 」 双方一致 「 Or 」 いずれか一致 を使用 )
双方一致 ” ( [入会日] > = #4/1/2012# ) And ( [都道府県] = ‘ 東京都 ‘ ) ”
いずれか一致 ” ( [都道府県] = ‘ 東京都 ‘ ) Or ( [都道府県] = ‘ 神奈川県 ‘ ) ”
×)sqlName = “(商品コード >=’strGenkahyou1’) And (商品コード <= ‘strGenkahyou2’)”
○)sqlName = “([商品コード]>='” & strGenkahyou1 & “‘) And ([商品コード] <= ‘” & strGenkahyou2 & “‘)”

【AccessVBA】DAOのrecordcountで件数が取れない⇒MoveLastする

★☆★☆★☆★☆★☆  解決 ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
DAOのrecordcountで件数が取れない
⇒DAOの場合、MoveLastしないとRecordCountの値が正しく取得できないケースがあるので、
多分一回最終行までレコード移動すればいい。
⇒rs.MoveLast

> ——————————-
> Set cn = Application.CurrentProject.Connection
> rs.Open Me.RecordSource, cn, adOpenKeyset, adLockOptimistic

rs.MoveLast

> If rs.RecordCount > 0 Then
> rs.MoveFirst
> Do Until rs.EOF
> rs!送信可否 = -1
> rs.Update
> rs.MoveNext
> Loop
> End If

単価の文字列表記への変換⇒DLookup 関数

クエリのビルド式

税込原価: IIf([tb商品一覧.仕入日] <= #2014/04/01#, Fix([tb商品一覧.税抜原価]*1.05),Fix([tb商品一覧.税抜原価]*1.08))

※単価の文字列表記への変換

Right(Fix(Tanka/10),i)
[一] = Right([税抜原価], 1)
[十] = Right(Int([税抜原価] / 10), 1)
[百] = Right(Int([税抜原価] / 100), 1)
[千] = Right(Int([税抜原価] / 1000), 1)
[万] = Right(Int([税抜原価] / 10000), 1)
[十万] = Right(Int([税抜原価] / 100000), 1)
[百万] = Right(Int([税抜原価] / 1000000), 1)

@:Right(Int([税抜原価] / 1000000), 1)+Right(Int([税抜原価] / 100000), 1)+Right(Int([税抜原価] / 10000), 1)+Right(Int([税抜原価] / 1000), 1)+”-“+Right(Int([税抜原価] / 100), 1)+ Right(Int([税抜原価] / 10), 1)+Right([税抜原価], 1)
———————————
○DLookup 関数

指定されたレコードのセット (定義域) から、特定のフィールドの値を返します。DLookup 関数は、Visual Basic for Applications (VBA) モジュール、マクロ、クエリ式、またはフォームやレポート上の演算コントロールで使うことができます。

構文
DLookup(expr, domain [, criteria] )
expr>>:対象となるデータが含まれているフィールドを表す式
テーブルまたはクエリ内のフィールドを表す文字列式か、またはそのフィールドのデータを使用して計算を実行する式を指定します。テーブルのフィールド名、フォームのコントロール、定数、または関数を指定できます。
domain>>:定義域を構成するレコードを指定する文字列式
criteria>>:省略可能

※、[受注明細] テーブルを基にする[受注明細] フォームに、[商品コード] フィールドを表示する [商品コード] というテキスト ボックスがあるとします。[商品コード]の値に基づいて [商品] テーブルから [商品名] を参照する場合

=DLookup(“[商品名]”, “商品”, “[商品コード] = ” & Forms![受注明細]!商品コード)
——————————-

=DLookup(“@s”, “tb単価文字コード”, “[数値] = “& Right(Int([税抜原価] / 1000000), 1))
&DLookup(“@s”, “tb単価文字コード”, “[数値] = “& Right(Int([税抜原価] / 100000), 1))
&DLookup(“[文字コード]”, “tb単価文字コード”, “[数値] = “& Right(Int([税抜原価] / 10000), 1))
&DLookup(“[文字コード]”, “tb単価文字コード”, “[数値] = “& Right(Int([税抜原価] / 1000), 1))
&DLookup(“[文字コード]”, “tb単価文字コード”, “[数値] = “& Right(Int([税抜原価] / 100), 1))
&DLookup(“[文字コード]”, “tb単価文字コード”, “[数値] = “& Right(Int([税抜原価] / 10), 1))
&DLookup(“[文字コード]”, “tb単価文字コード”, “[数値] = “& Right([税抜原価] , 1))
@:
IIf(IsNull([税抜原価]/1000000),1),””,DLookUp(“[文字コード]”,”tb単価文字コード”,”[数値] = ” & Right(Int([税抜原価]/1000000),1))) &
IIf(IsNull(Right(Int([税抜原価]/100000),1)),””,DLookUp(“[文字コード]”,”tb単価文字コード”,”[数値] = ” & Right(Int([税抜原価]/100000),1))) &
IIf(IsNull(Right(Int([税抜原価]/10000),1)),””,DLookUp(“[文字コード]”,”tb単価文字コード”,”[数値] = ” & Right(Int([税抜原価]/10000),1))) &
IIf(IsNull(Right(Int([税抜原価]/1000),1)),””,DLookUp(“[文字コード]”,”tb単価文字コード”,”[数値] = ” & Right(Int([税抜原価]/1000),1))) &
IIf(IsNull(Right(Int([税抜原価]/100),1)),””,DLookUp(“[文字コード]”,”tb単価文字コード”,”[数値] = ” & Right(Int([税抜原価]/100),1))) &
IIf(IsNull(Right(Int([税抜原価]/10),1)),””,DLookUp(“[文字コード]”,”tb単価文字コード”,”[数値] = ” & Right(Int([税抜原価]/10),1))) & IIf(IsNull(Right([税抜原価],1)),””,DLookUp(“[文字コード]”,”tb単価文字コード”,”[数値] = ” & Right([税抜原価],1)))

———————————————-

@s:
Replace(Trim(Replace(Right(Int([税抜原価] / 1000000), 1)+Right(Int([税抜原価] / 100000), 1)+Right(Int([税抜原価] / 10000), 1)+Right(Int([税抜原価] / 1000), 1)+”-“+Right(Int([税抜原価] / 100), 1)+ Right(Int([税抜原価] / 10), 1)+Right([税抜原価], 1),”0″,” “)),” “,”0″)

————————————————-
@1: IIf(InStr(1,[@s],”-“)<5,””,Mid([@s],InStr(1,[@s],”-“)-4,1))
@2: IIf(InStr(1,[@s],”-“)<4,””,Mid([@s],InStr(1,[@s],”-“)-3,1))
@3: IIf(InStr(1,[@s],”-“)<3,””,Mid([@s],InStr(1,[@s],”-“)-2,1))
@4: IIf(InStr(1,[@s],”-“)<2,””,Mid([@s],InStr(1,[@s],”-“)-1,1))
@x: IIf(Right([@s],1)=”-” Or Left([@s],1)=”-“,””,”-“)
@5: IIf(InStr([@s],”-“)=1 And Len([@s])<2,””,Mid([@s],InStr([@s],”-“)+1,1))
@6: IIf(InStr([@s],”-“)=1 And Len([@s])<3,””,Mid([@s],InStr([@s],”-“)+2,1))
@7: IIf(InStr([@s],”-“)=1 And Len([@s])<4,””,Mid([@s],InStr([@s],”-“)+3,1))
——————————————————–
@1d:IIf([@1]=””,””,DLookUp(“文字コード”,”tb単価文字コード”,”[数値] =” & [@1]))
@2d:IIf([@2]=””,””,DLookUp(“文字コード”,”tb単価文字コード”,”[数値] =” & [@2]))
@3d:IIf([@3]=””,””,DLookUp(“文字コード”,”tb単価文字コード”,”[数値] =” & [@3]))
@4d:IIf([@4]=””,””,DLookUp(“文字コード”,”tb単価文字コード”,”[数値] =” & [@4]))
@xd: [@x]
@5d: IIf([@5]=””,””,DLookUp(“文字コード”,”tb単価文字コード”,”[数値] =” & [@5]))
@6d: IIf([@6]=””,””,DLookUp(“文字コード”,”tb単価文字コード”,”[数値] =” & [@6]))
@7d: IIf([@7]=””,””,DLookUp(“文字コード”,”tb単価文字コード”,”[数値] =” & [@7]))
——————————————————-
@:@1d+@2d+@3d+@4d+@xd+@5d+@6d+@7d
——————————————————-
cmdGenkahyouInsatu
txtIdHajimari
txtIdOwari
strGenkahyou1=txtIdHajimari.Value
strGenkahyou2=txtIdOwari.value

【AccessVBA】フォーム間での値の受け渡しをするとき、値を受け取る側のフォームのイベントは[Open]ではなく、[Active]で作成する。

☆★☆★☆★☆★☆★問題解決☆★☆★☆★☆★☆★☆★
フォーム間で値の受け渡しをする場合、
値を受け取る側のイベントを「Open」で指定すると
「オブジェクトに値を代入できません」とエラーが出る
⇒イベントを「Active」にすると、問題解決!!

☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

まずは、フォーム間(フォーム1⇒フォーム2)で値をやり取りするためのパブリック変数を共通モジュールで定義する。
フォーム1が開くときに、定義したパブリック変数に空文字(初期値)を入れる。
次に、テキストボックスに値を入力し、フォーム2を開こうとするときに入力した値をいったんパブリック変数に格納する。
フォーム2が開いた時(アクティブになったとき)に、パブリック変数から値を受けとる。

【手順】

1.フォーム間で使う変数の定義

※共通モジュールでパブリック定数を定義する。

Public pstrTamTam As String

2.フォーム1が開く時

‘フォーム1が開く時
Private Sub Form_Open(Cancel As Integer)
pstrTamTam = “” ‘とりあえず変数に空文字を入れる
txtTamTam.Value = pstrTamTam ‘テキストボックスへ空文字を入れる
End Sub

3.フォーム1のテキストボックスへ文字を入力

4.フォーム1でフォーム2を開く

‘フォーム2が開くボタンをクリック
Private Sub cmdOpenForm2_Click()
pstrTamTam = txtTamTam.Value ‘テキストボックスの値を変数へ格納
DoCmd.OpenForm “frmForm2” ‘フォーム2を開く
End Sub

5.フォーム2が開く時

‘フォーム2が開く時
Private Sub Form_Active(Cancel As Integer)
lblTamTam.Caption = pstrTamTam
End Sub