Microsoft Access 掲示板

レコードの複製(1行コピーして一度に10行複製)

9 コメント
views
4 フォロー

よろしくお願いします。
accessで支払データを管理しています。
フォームで入力しておりますが、他からExcelでもらったデータなどは一度に貼り付けをしていることもあります。
その際、張り付けるための空のレコード(完全な空は出来ず、何かしらデータが入っていますが)を、レコードの複製というボタンで何度も複製を繰り返して、まとめて何十行ものExcelデータをコピーしているのですが、
この時に1行コピーして1行複製ではなく、1行コピーして10行または20行複製できる方法を探しています。

マクロとかVBAとか全く分からないのですが、今設置しているボタン(ウィザードで設置している埋め込みマクロのようです)を何か編集することで10行コピーのボタンが出来るのでしょうか?

茶々
作成: 2024/07/29 (月) 15:43:39
通報 ...
1
hiroton 2024/07/29 (月) 16:46:37 bdecc@f966d

いろいろ複雑な要件が絡む問題ですが、

普通にExcelで複数行コピーしたものを、ACCESSのテーブルでレコードを選択状態(左端のレコードセレクタ部分をクリック)にして張り付ければ新規レコードの追加として全て張り付きますよ

2

ありがとうございます。簡単ではないのですね。
Excelで作られたものが全く同じ形式ではないのと、オートナンバーの関係もあって、
例えば日付と項目等をレコード複製しておいて、金額と備考欄等をExcelから貼り付け、というふうにしています。
頻繁ではないですが、百回以上複製ボタンを押すことがあるので、まとめて出来たらなぁ~という淡い期待でした💦

3
hiroton 2024/07/29 (月) 18:00:12 bdecc@f966d >> 1

そういうことですね。ExcelとACCESS(データベース)はデータの持ち方が違うので、互いにデータをやり取りする場合は、データの形式を合わせるという作業が発生します

上記では「新規レコードを追加」で例にしましたが、テーブル上の操作では、既存レコードの見た目上2x2マスに、Excel上の2x2からコピーペーストもできますよ


ACCESS上の操作としてコピーペーストはできるとしましたが、問題の本質は、ACCESSで扱うために新たなデータを作りたいということでしょう

もう少し具体的には「新たなデータを作りたい」=「任意のレコード追加をしたい」ですね

さらに条件を挙げていくと、
「任意のレコード」=複数一括追加もしたい
「ID」->オートナンバーで取得
「日付と項目等」->既存レコードの複製=レコード追加前に一括で指定(準備)
「金額と備考欄等」->Excel上のデータ

と、現在手作業で行っていることをシステム(ExcelやAccess)に合わせて論理的に説明できるようになれば、あとはそれをシステム化するだけです(「Excel上のデータをどう指定するか」はもっと事細かに考える必要があります)

先にも上げましたが、データの形式を合わせるの部分をどれだけ正確に説明できるか?が問題です。具体的なシステム化部分はこの掲示板で多分それほど難しくない内容で回答が付くと思います


1行コピーして10行または20行複製

この前後も含めて理解に困るところですが、「10行コピーして10行」「20行コピーして20行」ではないんですかね?

1行が10行になるということは何十行ものExcelデータが何百何千のAccessデータになっているんでしょうか?

4
茶々 2024/07/30 (火) 16:05:04 35169@b17c5

accessの項目は以下です。

ID    →オートナンバー
支払日  →複製したい場合とExcelから張り付ける場合がある
支払種別 →複製したい場合とExcelから張り付ける場合がある
支払先名 →複製したい場合とExcelから張り付ける場合がある
部門名  →空白でok 
施設名   →複製したい場合とExcelから張り付ける場合がある
金額     →Excelから貼り付け
支払方法 →複製
該当月  →複製したい場合とExcelから張り付ける場合がある
備考   複製したい場合とExcelから張り付ける場合がある

・ひとつひとつ入力していく場合
このいくつかの項目の内容が同じ場合は、1行複写するボタンを使って、変わるものだけを入力しています(金額とか施設名とか)

Excelから貼り付けたい時
・各担当者が入力したデータを貼り付ける場合、元のExcelには支払方法・該当月がないので、
accessのコピー元に入れてコピーするか、またはExcelの方に追加してから貼り付けています。

・そのほか、光熱費やネットでの購入品などはcsvでダウンロードしたものを、支払日・支払い方法・該当月はこちらでコピー元に入れてコピーし、金額はcsvから貼り付け、施設名は別の施設名一覧Excelから貼り付け、等にしています。

このような感じで、元のレコードを複写しておいて、ところどころを貼り付けたいのです。

施設名 支払方法 該当月 だけを入力したレコードを、貼り付け用に100行用意する(=100回ボタンを押す)をしているので、それが10回押せば100行用意出来たら、すごく楽だなぁ、と思ったのです。

5
hiroton 2024/07/30 (火) 18:14:39 0129f@f966d

パターンが多すぎるようなら、中間作業をExcelでやってしまえばいいんじゃないかと思ってしまいますね。1行コピーして100行選択して貼り付けで100行分データが出来上がりです
Accessでレコードを選択してコピーからExcelに貼り付けで1行の元データも作成できますし

パターンが網羅できるようなら、すべての手作業パターンをそっくりそのままコード化してしまえば良いでしょう


"DefaultValue/既定値" プロパティ

新規レコードで、各フィールドごとに初期値を設定しておくことができます。わざわざレコードを複製しなくても、単純な入力作業が必要なところだけの入力で済みます

例えば、入力フォームに「規定値設定」ボタンを配置し、以下プロパティを設定します

名前   |規定値設定
クリック時|[イベント プロシージャ]

[イベント プロシージャ]を設定した欄の右端の[...]をクリックするとVBEが立ち上がります
次のような表記になっているので、コードを記述します

Private Sub 規定値設定_Click()

End Sub

Private Sub 規定値設定_Click()
    Me!支払日.DefaultValue = Me!支払日
    Me!支払種別.DefaultValue = Me!支払種別
End Sub

一度フォームを閉じて保存したあと、再度フォームを開いて「規定値設定」ボタンを押してみてください。新規レコードの「支払日」「支払種別」が、「規定値設定」ボタンを押したレコードの内容になります

6

例えば日付と項目等をレコード複製しておいて、金額と備考欄等をExcelから貼り付け、というふうにしています。

ID    →オートナンバー
支払日  →複製したい場合とExcelから張り付ける場合がある
支払種別 →複製したい場合とExcelから張り付ける場合がある
支払先名 →複製したい場合とExcelから張り付ける場合がある
部門名  →空白でok 
施設名   →複製したい場合とExcelから張り付ける場合がある
金額     →Excelから貼り付け
支払方法 →複製
該当月  →複製したい場合とExcelから張り付ける場合がある
備考   複製したい場合とExcelから張り付ける場合がある

この辺から推測するに、
支払伝票的なものをAccessで管理したいという印象。

だとすると、扱うデータは、
共通するデータ(ヘッダー項目)とレコード毎に変化するデータ(明細データ)に分けられると思います。

データベースは同じデータを繰り返し格納しないという設計原則があります。
繰り返されるデータ(今回ならヘッダー項目)と変化するデータ(今回なら明細データ)は別テーブルにすることになります。
このような設計を「正規化」といいます。いちど「正規化」でWEB検索してみてください。

例えば、Accessで解説しているページとしては下記あたりを参考に。

正規化とは - もう一度学ぶMS-Access

アクセスデータベース設計の基本(正規化) | ExcelとAccessの学習室

正規化されたテーブルなら同じデータを複製する必要はなくなります。
また、Accessでは正規化されたデータを入力する場合は、メイン/サブフォーム形式の入力フォームを使うのが一般的です。
メインフォームでヘッダー項目を入力、サブフォームで明細データを入力というUIになります。

Accessのフォームのメイン/サブフォームとは | できるネット

7

何度もありがとうございます。
とりあえず、10行複製のボタンは簡単には出来ないんだなぁ、という事がわかりました。
規定値設定ですが、1月の伝票が150行続く時もあれば、その次には2月のもの、等バラバラなので、なかなか…という感じです。
正規化については、時間を見つけて取り組んでみたいと思います。
ありがとうございました。

8
hiroton 2024/07/31 (水) 09:48:40 8b699@f966d >> 6

「10行複製のボタン」は簡単に作れますよ。それだけのものに意味がないのでその方法を誰も回答しないだけで

ACCESSはデータベースソフトなので、それを逸脱するような作りはいろいろな問題があります。それをやりたいならExcelでやったほうが簡単だし問題も少ないです(目的は別にして手法だけならという意味で)

なぜAccessなのか、データベースとはどういうものなのか、データベース化することによってどのようなメリットがあるのか、Accessでどうこうする以前の「情報をどのように扱うべきか」という理論レベルの知識がもっと必要ですね

具体的に言うなら「なぜExcelではだめなのか」を考えてみましょう
そのうえで、それでも「10行複製のボタン」が欲しいとなるなら、もしかするとAccessという選択が間違いなのかもしれませんよ

9

正規化できるまでのつなぎとして「10行複製のボタン」をとりあえず作成するなら、下記のようなイメージ。

複製するフィールドは F1, F2, F3 と仮定。
フォームのカレントレコードの値を10レコード分複製

Public Sub Sample()
    Dim rs As DAO.Recordset, i As Long
    Set rs = Me.RecordsetClone
    For i = 1 To 10
        rs.AddNew
        rs!F1 = Me.F1
        rs!F2 = Me.F2
        rs!F3 = Me.F3
        rs.Update
    Next
End Sub