★★★★★★Access2000VBA・Excel2000VBA独学~配列を利用しての、新規レコードの一括セルデータ(レコード)追加のプログラム・その2。~顧客マスタ入力~ワークシートをフォームに見立てて、縦長のデータの行と列を入れ替えながら他のシートへ転記するサンプル。~
  
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
  
※関連記事
★★★★★★Access2000VBA・Excel2000VBA独学~配列を利用しての、新規レコードの一括セルデータ(レコード)追加のプログラム。(テーブル化した表の場合と、そうじゃない表の場合)~
★★★★★★★★★★★★★★★★Access2000VBA・Excel2000VBA独学~最終行の行番号を求める方法~
  
  

  
  
★ サンプルファイルダウンロード

こちらからダウンロードしてください。

Esetでウィルスチェックしてあります。

ファイルを開いたら、Alt+F11 でVBEditorを開きます。
その中の「本番」というモジュールをダブルクリックすると、「SampleNewRecAddAtherSht04()」とという今回のメインのプロシージャを確認できます。

そのほかにも少し、他のコマンドボタンがらみのプログラムやイベントプロシージャも追加してありますので一度ご覧になってみてください。

  
  
★ はじめに
ここでは、「Excelのショボいユーザーフォーム」よりも、シートをフォームがわりに使った方が便利な例を挙げさせていただきました。(特に自分だけで使うなら。他の人にも使わせるならダメかもだけど。)

Ctrlキーを押しながらマウスのホイールを回すと、拡大表示や縮小表示ができますので、ユーザーフォーム使うよりも便利だと思います。高齢者や文字が小さくて見えない人にも対応できます。ちょっとしたメモもシート上にできますし。配列でセルの値も一発で取得し、かつ、そのデータの行と列の入れ替えもすぐにできますし。
シートやセルの設定を自分好みに変えることもできます。(自分で使うだけだから)

項目が増えたら、例えば本記事のサンプルなら、フォーム代わりのシートに増やした順番通りに、一覧のシートにも列を増やして、ファイルを再起動するだけです。

Excelのユーザーフォームを使うといちいちテキストボックスの値をループなどで書き出さないといけないし、拡大縮小表示やその他のシートの便利な機能も使えないので不便だと思います。

ただ、他人に使わせたい場合は、「ユーザーに不要なことはさせたくない」という場合には、ユーザーフォームのほうがいい場合もあるかもしれません。でも僕ならExcelのショボいユーザーフォーム使うくらいなら、各種設定が50倍はラクなAccessフォームを使います。

Excelのユーザーフォームは、「これはExcelのユーザーフォームでしか絶対にできない!」「Accessフォームなんかじゃかえって不便!」というときに使います。(例えばユーザーに何らかの条件を選ばせる等々のちっちゃなフォームとか、その他諸々。)

それ以外(ある意味規模の大きなフォーム)は、やはり、シートをフォーム替わりに使います。

あと、ユーザーフォームのほうが「見た目的にカッコイイ気がする」かもしれませんが、大変無礼ですみませんが、そういう考え方は(上から目線で本当にすみませんがでもマジで)「愚の骨頂」といいますか・・・、「効率のことを無視しています」ので、無駄だらけとなり、コスパも最悪となります。誰かが言っていても絶対に真似しなようにしてください。

そもそも「Excelのユーザーフォーム」なんて、使ったところで効率が悪いことが少なくないのに、なぜそんなものを、しかも、例えば顧客データ入力のような(不要なシーンで)わざわざ使おうとするのか、僕にはまったく理解できません。

ユーザーフォームや表操作がらみで「クラスモジュールでこんなことまでできちゃうよ!」なんて言ってる本やサイトを見かけますが、Accessのフォーム機能を使えば十数秒か数十秒で終わるような「事務系のよくある機能」の作りこみを、Accessの数万をケチって無駄なクラスモジュールをいちいち作るなんて、本当に「愚の骨頂」だと思います。
Office365ならAccessタダで付いてくる・・・って言っても過言ではないくらい安いですし。いつも話が逸れてすみませんが、小規模(同時に使うのが5台以下)なら、Accessランタイムすら必要なくて、Accessが使えるわけですから、COMオートメーションでAccessフォームを呼び出してExcelと連携プレーするほうが、「圧倒的にコスパがイイ」です。
全部をExcelだけでやろうとするなんて、本当に「愚か」だと思います。だって、Office365ならAccessタダみたいなもんなんですから。なぜ『 タダで・かつ・Excelユーザーフォームの50倍は効率がいい 』のに学習しようとしないのか、その意味がわかりません。
もちろん、全部をAccessだけでやろうとするのも「バカの極み」です。

話を戻します。

もっというと、表の操作ならクラスモジュールなんか使わなくても、ADOやDAOなどでオブジェクトとして扱えますから、一般的なビジネス集計などなら、まず、クラスモジュールなんて必要ないと思います。

そしてExcelのショボい「ユーザーフォーム」なんか使うよりも、シートをフォーム替わりにするほうがよっぽど色んな機能が使えます。
色んなものが動かせます。
そして、シートをフォーム替わりに使うと、目的次第ではAccessのフォームをしのぐこともできてしまします。非常に優秀だと思います。

見た目より、効率や作り変えがラクなほう重視がいいです。
特に自分だけが使う場合、売るソフトを作るわけではないので、「見た目なんてどうでもいい」のです。
見た目にこだわるとコスパが最悪になります。ご注意ください。
  
  

※補足:Excelのユーザーフォームは本当にムダ?

もちろん、Excelのユーザーフォームは、
「まったくの役立たず」という意味ではありません。

・顧客登録には必ずしも必要ない(というか、基本、必要ない。)、
・Excelのユーザーフォームの妄信は危険、
・「Excelのユーザーフォームのほうがなんとなくカッコイイ」という意識は
  「ダメ設計の典型」、
というだけで・・・。

Excelのユーザーフォームは、何かの動作の途中で、「ちょっとした設定」をユーザーにさせるときには、便利で、ユーザーフォームにしかできないことが結構ある、と思います。

ただ、繰り返しになりますが、「顧客登録」というシーンには、(もちろん使いたければ使えばいいですが)、基本、必ずしも必要ではありません。本記事でお示ししたとおりです。

シートをフォームに見立てるほうが、「特定のセルの入力について」、入力規則等々で各種制限や日本語入力モード設定、また、単純に拡大縮小などもできますし、色々と便利だと思います。
もちろん、VBAによって、Changeイベントによっても「特定のセルの入力について」、その他のことをチェックすることも可能です。

それでは対応できないなら、「そのときにはじめて」、Excelのユーザーフォームを使うことも選択肢に入れてもいいですが、ループコードを書かないといけなかったり、場合によっては名前範囲の無駄な指定や関連コードが必要、フィルタや検索が使えない、また、単純に拡大縮小機能など、「結構作りこまないといけなくなるのが超面倒くさい・非効率」になります。
それならフォームはフォームでも、「AccessとAccessのフォーム」を使うほうが、数秒で設定が終わるシーンが少なくないので、そちらを使った方がはるかに効率的・・・ということのほうが「事実」「現実」です。

結局、
「Accessの数万と学習時間をケチって、Excelで無駄な苦労を頑張る」か、
「ケチらないで素直にAccessとAccessフォームを使う」か、
それを両てんびんにかけるわけですが、
「VBAを絶対に使わない」なら話は別ですが、「VBAを使う」のですから、
悩ましいかもしれませんが、後者で行ってADOやQueryTableオブジェクトなども学ぶと、
確かに最初は多少苦労するかもしれませんが、
でも、そのあとが色々と便利になるとは思います。
  
  
  

★ 核となるテストプログラム

基本的には以下の数行で今回の目的は達成できます。

(この段階では、)
疑似フォーム側(Sheet1)の行が増えたら、それに応じて同じ位置にSheet2の列も増やし、さらにそれに応じて、以下の2か所のプログラムのセル範囲指定を書き換えます。
・v_CelData = ActiveWorkbook.Worksheets("Sheet1").Range("B3:B17")
・Worksheets("Sheet2").Cells(l_TrgNewRow, 1).Range("A1:O1") = v_CelData

疑似フォーム側(Sheet1)の行の順序を入れ替えた場合は、それに応じてSheet2の列の順序を入れ替えればOKです。
プログラムの変更は要りません。

  
  
★ 前項のプログラムを少し汎用的っぽく?作り変えたもの

フォーム側の行が増えたら、それに応じて同じ位置にSheet2の列も増やします。
前項のプログラムのような、行が列が増えることに伴ってのプログラムの変更は要りません。

フォーム側の行の順序を入れ替えた場合は、それに応じてSheet2の列の順序を入れ替えればOKです。
こちらもプログラムの変更は要りません。