★★★★★★Access2000VBA・Excel2000VBA独学~配列を利用しての、新規レコードの一括セルデータ(レコード)追加のプログラム。(テーブル化した表の場合と、そうじゃない表の場合)~
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
※関連記事
『 ★★★★★★Access2000VBA・Excel2000VBA独学~配列を利用しての、新規レコードの一括セルデータ(レコード)追加のプログラム・その2。~顧客マスタ入力~ワークシートをフォームに見立てて、縦長のデータの行と列を入れ替えながら他のシートへ転記するサンプル。~ 』
『 ★★★★★★★★★★★★★★★★Access2000VBA・Excel2000VBA独学~最終行の行番号を求める方法~ 』
★ サンプルファイルダウンロード
Esetでウィルスチェックしてあります。
ファイルを開いたら、Alt+F11 でVBEditorを開きます。
その中の「配列で1レコード追加」というモジュールをダブルクリックすると、「Sample2()」と「Sample6() 」というプロシージャで動きを確認できます。
★ はじめに
参考URL
Excel-VBAのテーブルの使い方についての質問です。
1行当たりの列数が多い時、1行分をすべてのセルをループで記録していく方法も、もちろんあると思いますが、それが面倒な時、配列を使って1行丸ごとバンっと書き込む方法もあると思います。
ここでは、配列を使う方法を少しずつ書き足していきたいと思います。
ただ、Arrayに値をセットする時、結局ループを使わないといけないかもしれません。なので、本当に効率が良くなるかはわかりません。
何回もセル(Rangeオブジェクト)にアクセスせずにすむので速度的には多少速くなるかもしれませんが・・・。
ExcelではAccessと違って、「SQLがいたるところで使える」という仕様ではないため、いちいちループを回さないといけないし、「なんでもできすぎる」ことが裏目に出て「メチャクチャになりやすい」ので、その他の「各種の制限」などの設定(ロックその他)用のプログラムもムダに多いため「他人に使ってもらうプログラム」を非常に作りにくいです。
Accessの10倍は効率が悪いと思います。
自分のためだけに使うプログラムはExcelVBAのままでいいのですが、「他人に使ってもらうプログラム」を作りたいときはAccessなども検討するほうがいいです。
でも、ここでは、「それができない場合」、のために書いています。
あと、本記事のプログラムではUsedRangeを使っていますが、UsedRangeは、式が入っていたり、罫線や色がついているセルもUsedとみなされるのでエンドユーザーに「データベースを知らない人が居る場合は」要注意です。
思いもよらぬ誤操作をするときがあるから。
Accessでは防ぎやすいけどExcelは防ぎにくいので。
UsedRangeは、データベースを知っているシートに余計な設定や行を混ぜない人間には大変便利ですが、そうじゃない人が多い現場では裏目に出ることが想定できます。
UsedRangeを使う時は、以下のWebページを必ず参考にしてください。
最終行・最終列の取得方法(End,CurrentRegion,SpecialCells,UsedRange)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
' ' Option Explicit 'テーブルへの1レコード追加_本番 Sub Sample2() Worksheets("Sheet1").Range("A1").ListObject.ListRows.Add.Range = Array("2018/12/10", "広瀬", "C") End Sub 'テーブルへの1レコード追加_ひながた '「1000」は列の外側になってしまうので、書き込み=表示されない。 'エラーが出ないので注意。 Sub Sample2_old() Worksheets("Sheet1").Range("A1").ListObject.ListRows.Add.Range = Array("2018/12/10", "広瀬", "C", 1000) End Sub Sub Sample3() 'テーブルじゃない表に、1行にデータ(レコード)を追加 Worksheets("履歴01").Range("B12:E12").ClearContents Stop Worksheets("履歴01").Range("B12:E12") = Array("4", "初級", "1", "ああああ") End Sub Sub Sample4() 'テーブルじゃない表に、3行に同じ内容のデータ(レコード)を追加 Worksheets("履歴01").Range("B12:E14").ClearContents Stop Worksheets("履歴01").Range("B12:E14") = Array("4", "初級", "1", "ああああ") End Sub Sub Sample5() 'テーブルじゃない表に、3行指定したうちの2行目だけに、データ(1レコード)を追加 Worksheets("履歴01").Range("B12:E14").ClearContents Stop Worksheets("履歴01").Range("B12:E14").Rows(2) = Array("4", "初級", "1", "ああああ") End Sub Sub Sample6() 'テーブルじゃない表に、最後の行の次の行に、データ(レコード)を追加 Dim o_Rng01 As Range Dim l_LastRow As Integer Dim i_NewRow As Integer Set o_Rng01 = Excel.Application. _ ActiveWorkbook. _ Worksheets("履歴01"). _ UsedRange l_LastRow = o_Rng01.Rows.Count i_NewRow = l_LastRow + 1 ' Worksheets("履歴01").Range("B12:E14").ClearContents ' '↑これやると、消した範囲を「Used」とみなされてしまうので、使わない。 ' ' セルの内容を消すだけじゃなくて、行丸ごと削除しないと、 ' ' UsedRangeを使ったときは誤作動するので注意。 'UsedRangeは、式が入っていたり、罫線や色がついているセルも 'Usedとみなされるのでエンドユーザーに '「データベースを知らない人が居る場合は」要注意。 '思いもよらぬ誤操作をするときがあるから。 'Accessでは防ぎやすいけどExcelは防ぎにくいので。 'https://excel-ubara.com/excelvba4/EXCEL222.html Stop o_Rng01.Rows(i_NewRow) = Array("4", "初級", "1", "ああああ") End Sub ' ' |
- 投稿タグ
- 「ニセモノ」への道, 「本物」に近づくために, AccessVBA, Accessの独学, Access操作の基礎, Accesの独学, ADO/DAO, ExcelSQL, ExcelVBA, Excelの独学, Excel操作の基礎, Excel連携VBA, MicrosoftQuery, ODBC, SQL, パソコンでの自動化, ビジネスパソコンの基礎, ビジネス一般常識, マクロ, ワークシート関数, 独学, 自動化