【AccessVBA】サブフォームの行番号を任意で入れ替えるコードとやり方

エクセルで見積書を作っている時にいつも思っていたことがあります。

あ!この途中に一項目入れ忘れた!とか思うことが多々ありました。

もちろん、行挿入などをして対応するのですが、行挿入するとレイアウトが崩れるので削って直したりします。

そういうのを考えずに印刷すると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します。

そして再クエリする。

これで『上へ』と『下へ』ができました。

最後までお読みいただきありがとうございました。

カテゴリー:
関連記事