サブフォームから親フォーム非連結ボックスへ入力
サブフォームにフォーカスが移動している時に、親フォームのテキストボックスの値を変更したいことがある。
簡単な事なのですが、中々できなかったのでTipsにしました。
ココがポイント
Forms![親フォーム名]![非連結ボックス名] = Null
上のポイントは、サブフォームから親フォームの非連結ボックスに空白を入れるものですが、計算式などを入れて値を入れる方法などにも使える。
別フォームのデータをテキストボックスに表示
フォームを開くときに、別フォームのテキストボックス内のデータを引っ張ってきたい時がある。もしくは、ボタンをクリックした時に、別フォームの値を引っ張ってきたい場合などですね。
ココがポイント
Me.ID = Forms![別フォーム名]![ID]
Me.WID = Forms![別フォーム名]![WID]
短いテキストを数値型に変換
データに、全角で数値が入っていたり、余計かカンマや記号が入っていても数値型に変換することができます。
表記例 | 出力例 | 説明 |
---|---|---|
CInt("1000") | 1000 | |
CInt("5000") | 5000 | 全角でも変換されます |
CInt("1,000") | 1000 | カンマがあっても変換されます |
CInt("\1,000") | 1000 | \があっても変換されます |
CInt("3.5") | 4 | 小数点以下は偶数丸めされます |
CInt("4.5") | 4 | 小数点以下は偶数丸めされます |
TypeName(CInt("100")) | Integer | 整数型と判定されます |
CInt("1%") | (エラー) | パーセンテージは変換されずエラーとなります |
CInt("2017/09/16") | (エラー) | |
CInt(#2017/09/16#) | (エラー) | これもエラーですがこれはオーバーフローで、例えばCLng関数を使うと42994に変換されます |
VBAでレコード移動
データの抽出じゃなく、対象のレコードまで移動する方法を簡単そうでできなかったので備忘録にしました。
下記の例は、「NO検索」というテキストボックスに番号を入れた時に、その番号のレコードまで移動するVBAです。
Private Sub NO検索_AfterUpdate()
DoCmd.GoToControl "txt_NO"
DoCmd.FindRecord NO検索
If InStr(Me!txt_NO, NO検索) = 0 Or Null Then
MsgBox "該当レコードはありません。"
End If
MNO検索 = Null
End Sub
ちなみに、数時じゃなく、テキストの曖昧検索でのレコード移動は、
Private Sub メーカー名検索_AfterUpdate()
DoCmd.GoToControl "txt_メーカー名"
DoCmd.FindRecord "*" & メーカー名検索 & "*"
If InStr(Me!txt_メーカー名, メーカー名検索) = 0 Or Null Then
MsgBox "該当レコードはありません。"
End If
メーカー名検索 = Null
End Sub
ココがポイント
InStr(検索元, 検索ワード)[/st-cmemo]
引数「検索ワード」が見つからなかったときは0を返します。1 文字目で見つかったときは1を返します。見つかったときは1以上の値が返ります。
並び替えが変わるのを防ぐ方法
フォームでテーブルのデータを表示していて、なにかVBA処理のボタンなどを押して更新すると、並びが、変わってしまう場合がある。よくあるのが、主キーの順番になってしまう場合がある。
それを指定した並び替えにプロパティーなどで設定しているにも関わらず、並びが変わってしまう。
VBAの処理の中に、下記の1行を最後に入れておけば最後に並びを戻すことができる。
DoCmd.SetOrderBy "JNO DESC"
入力ミスを防ぐテキストボックスのロック
入力ミスを防ぐためと、データの不一致をさせないために、あるタイミングで、テキストボックスに編集ロックをかけたい時がある。その方法。
Sub Form_Current()
If Me.[社員ID] = "0001" Then
Me.[旅費明細].Enabled = True ※テキストボックス変化なし。
Me.[旅費明細].Locked = False ※ロックを外す
Else
Me.[旅費明細].Enabled = False ※テキストボックスグレーになり、フォーカス移動できない。
Me.[旅費明細].Locked = True ※ロックをする。
End If
End Sub
EnableとLockedはセットで使用しなくてもOK
編集だけできないようにさせる場合は、LockedだけでOKである。
サブフォームから親フォームの値参照
ココがポイント
=Me.Parent!親フォームコントロール名
Parent プロパティを使用すると、1 つのサブフォームまたはサブレポートが複数のフォームまたはレポートに挿入されている場合に、現在の親であるフォームまたはレポートを特定できます。
2つのテーブルの同期
本当は、SQLserverで同期をとりたかったが、そのスキルがまだない。
わかったら後ほど記載していきます。
Accessのクエリー2段でテーブル同士の同期ができるので記載しておきます。
このケースは、マスターテーブルに、データを追加したときに、リレーションしている作業用テーブルにも主キーあたりを同期させて追加させておきたいケースが発生する。その時用に使えるテクニックだ。
1.不一致クエリウィザードでテーブル1にしかないレコードを抽出するクエリーを作成
・抽出するテーブル:テーブル1
・比較するテーブル:テーブル2
・共通するフィールド:主キーとか
・表示するフィールド:追加に必要なフィールド全部
2.このクエリを元に追加クエリーを作成
追加クエリーで追加すると同期したいテーブルにその都度追加されて2重になるように感じてしまうが、実際は、不一致クエリを通しているので、追加されたデータだけのレコードが増えるだけで済む。
リレーションをしているので、メインのテーブルからレコードを削除や更新すれば、同期しているテーブルも同じように連動してくれる。
指定枚数のラベルを印刷
テーブルに「プリント枚数」という印刷枚数を数値で入れておくフィールドをつくる。レポートをデザインモードにして。
(1)レポートの中に、非表示にてその枚数フィールドを入れておく。
(2)非連結の[Text1]というテキストボックスを設置して、非表示にしておく。
(3)詳細のプロパティを開き、「フォーマット時」のイベントプロシージャを開く。
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
Dim 指定枚数 As Integer
指定枚数 = Me!プリント枚数
If IsNull([Text1]) Then [Text1] = 1
If [Text1] <> 指定枚数 Then
Me.NextRecord = False
Me.MoveLayout = True
Me.PrintSection = True
End If
End Sub
(4)同じく「印刷時」のイベントプロシージャを開き
Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
指定枚数 = Me!プリント枚数
If [Text1] <> 指定枚数 Then
[Text1] = [Text1] + 1
Else
[Text1] = 1
End If
End Sub
これで、印刷プレビューすれば、プリント枚数に入っている数値の枚数だけラベル印刷される。
VBAでバッチファイル実行
Dim objWSH As Object
If MsgBox("繰越処理を実行しますか? yes/no", vbYesNo, "繰越処理最終確認") = vbYes Then
Set objWSH = CreateObject("WScript.Shell")
objWSH.Run "d:\LIFE\LIFE繰越データバックアップ.bat"
Set objWSH = Nothing
End If
0の時は表示させない
以前は、IF関数を使って、0の時は、表示させないとやっていたが、もっと簡単な方法を見つけた。
ココがポイント
プロパティの書式に、#をいれるだけで解決
した。方法をしらないと無駄な事をしていまいますね。
あそれから、カンマを入れたい場合は、#,### になります。