エクセルで見積書を作っている時にいつも思っていたことがあります。
あ!この途中に一項目入れ忘れた!とか思うことが多々ありました。
もちろん、行挿入などをして対応するのですが、行挿入するとレイアウトが崩れるので削って直したりします。
そういうのを考えずに印刷すると2ページになって白紙が出てきたり…なんてことありませんか??
せっかくなので、そういう機能を持たせることができればいいなぁと思いましたが、コードを組める知識がなかったので、ネットで探しました。
親切な方がいらっしゃるんですね。
教えてくださる方がいました。こちらのHatenaChipsさんというサイトです。
さっそく読んで、サンプルをダウンロードしてバラバラにして解読しました。
すごく作りこんでいるのでとても勉強になって参考になりました。
私もこういうふうにアイデアも交えて作れたらいいなと思います。
HatenaChipsさんのサイトで理解できる方はそれでいいですが、私なりにやっと理解したので早速作りながら解説します。
まずは、簡単にということで順番テーブルを作ります。
とくにいじったところはありません。
データビューにするとこんな感じです。
簡単にくだものリストにしてみました。順番、品名は自分で入力します。
次はクエリです。
クエリもテーブルをそのまま利用するので特にいじったところはありませんが、順番は『昇順』に設定してください。
フォームもそのまま作り、使いました。
まずは順番の説明から入ります。
ボタンは『上へ』、『下へ』、『削除』、『挿入』を作りました。
『上へ』のコードはこちらです。
Private Sub 上へ_Click() Dim Pos As Integer’整数型 宣言 Pos = Me.CurrentRecord ’フォーム上で現在カーソルがある行のレコード If Pos = 1 Or Me.NewRecord Then Exit Sub ’POSが1か新しいレコードなら条件式を出る Me.順番.Value = Pos - 1 ’POSが1または新しいレコード意外ならPOS-1 DoCmd.GoToRecord , , acPrevious ’そして前のレコードへ Me.順番.Value = Pos DoCmd.RunCommand acCmdSaveRecord ’レコードの保存 Dim varBM As Variant ’バリアント型 宣言 varBM = Me.Bookmark Me.Requery ’再クエリ Me.Bookmark = varBM End Sub
最初に1と新しいレコードじゃないか判断します。
それ以外なら(例題どおりなら2~10)今カーソルがある位置を確認後、-1します。
そして再クエリする。
ちょっと待って?!
再クエリすると一番上にカーソルが戻るんですけど?!
ということで、戻らないようにします。
それが、Dim varBM As Variantから続くコードです。
Me.Bookmarkを使うと、再クエリする直前にあったレコードに戻ります。
これは他でも十分使えそうですね♪
次は『下へ』です。
Private Sub 下へ_Click()
Dim Pos As Integer
Pos = Me.CurrentRecord ’フォーム上で現在カーソルがある行のレコード
If Pos >= Me.Recordset.RecordCount Then Exit Sub ’POSが最終レコード以上なら出る
Me.順番.Value = Pos + 1 ’POSに+1をする
DoCmd.GoToRecord , , acNext ’次のレコードへ
Me.順番.Value = Pos
DoCmd.RunCommand acCmdSaveRecord ’レコードの保存
Dim varBM As Variant ’上へと同じなので省略
varBM = Me.Bookmark
Me.Requery
Me.Bookmark = varBM
End Sub
最初に最終レコードでないか確認します。
それ以外なら(例題どおりなら1~9)今カーソルがある位置を確認後、+1します。
そして再クエリする。
これで『上へ』と『下へ』ができました。
最後までお読みいただきありがとうございました。