前回までですと、「顧客区分」の「リスト」や書式が、「顧客一覧」からコピーされていません。これを追加して、前回までのマクロを再度。0)'上で計算した個数分のセルを結合する。Sub太字の部分が、追加した所です。1)は、見出し部のコピーと同じです。「顧客一覧」の見出し部の1行下をコピーし、「顧客登録」の1列右に貼り付けています。1).ClearContents前回は、Worksheets("顧客登録").UsedRange.Clearというのが出てきましたが、.Clearはデータだけでなく、書式も消去します。.ClearContentsはデータのみクリアします。これで、「顧客一覧」から、「顧客登録」へ見出しと、データ部も書式がコピーされました。1つ忘れているものがあります。「顧客一覧」の「顧客名カナ」には、「=PHONETIC(D4)」を設定しました。今、それを無理に組み込んでも、混乱するだけなので、後回しにします。(方法は、列範囲をコピーして、行列を入れ替えて貼り付け、その後に1行置きに空行を挿入等)それよりもっと問題があるのです。それは、シート名を変更したり、シート内での開始位置を変更した場合、その都度、このマクロを変更する必要があるのです。これは都合が悪いです、なんとかしましょう。シート「設定」を作るまず、シート「設定」を作成して下さい。シート「設定」に以下の作業をして下さい。1.A1=「シート名」2.A2=RIGHT(CELL("filename",顧客登録!A1),LEN(CELL("filename",顧客登録!A1))-FIND("]",CELL("filename",顧客登録!A1)))3.=RIGHT(CELL("filename",顧客一覧!A1),LEN(CELL("filename",顧客一覧!A1))-FIND("]",CELL("filename",顧客一覧!A1)))4.=RIGHT(CELL("filename",項目名!A1),LEN(CELL("filename",項目名!A1))-FIND("]",CELL("filename",項目名!A1)))5.A2に「顧客登録シート名」と名前定義する。6.A3に「顧客一覧シート名」と名前定義する。7.A4に「項目名シート名」と名前定義する。3.4.は、2.とシート名のみの違いです。名前を入力し、「Emter」です。Ctrl+F3で名前定義の画面からでも可能です。名前定義をするので、実際はセルはどこでも良いです、例えばB列とかでも問題ありません。この作業は、シートが増えるたびに行っていきます。今後面倒なら、マクロを作る事も考えます。結果は、以下のようになるはずです。シート名が表示されたはずです。CELL(検査の種類,対象範囲)対象範囲の右上隅にある書式、位置等を返します。"filename"ですと、「フルパス[ブック名]シート名」が返ってきます。RIGHT(文字列,文字数)文字列の右端から指定した文字数だけ取り出すLEN(文字列)文字列の文字数を返すこれらの関数を組み合わせて、シート名を取り出しています。これは関数ですので、シート名が変更されると、自動的に変更されます。「顧客一覧」と「顧客登録」の先頭セルに名前定義する。シート「顧客一覧」と「顧客登録」の、B3(使用する先頭セル)に名前定義をします。以上で準備ができました。その前に、ちょっと休憩では、マクロを直しましょう。以下の作業をして下さい。1.VBEを起動します。2.「標準モジュール」の「Module1」を選択する。3.左下の、「プロパティ」ウインドウで、「オブジェクト名」を、「Mod顧客登録」に変更。モジュール」5.追加されたモジュールを選択し、、「オブジェクト名」を「Mod共通」にする。「Mod」共通のコードを表示(選択しダブルクリックまたは、F7)以下のコードを貼り付け。Explicitこれは、変数の宣言を強制するオプションです。変数の宣言は必ずするようにして下さい。思わぬバグで行き詰らない為の予防策です。「Mod顧客登録」の先頭にも入れておいて下さい。「ツール」→「オプション」で「変数の宣言を強制する」にチェックを付けておけば、モジュールの挿入時に、自動で付加されます。StringPublicは他のモジュールからも参照可能な変数の定義です。同一モジュールのみ参照可能にするなら、Privateとします。Stringは、文字列を入れる変数である事を意味します。RangeRangeは、オブシェクトです。値だけでなく、セルそのものを入れる事ができます。「設定」を再計算しています。Range("顧客登録シート名")Rangeは、前回出たCellsと似たもので、指定されたセル範囲を参照します。今、良く見たら、前回もRangeを使ってました、説明もれです。セル2)は、セル1からセル2のセル範囲になります。Range(名前定義)は、名前定義されているセルになります。シート名が指定されていませんが、良いのでしょうか?名前定義はブック共通なので、シートの指定が必要ありません。2007以降では、名前定義がシート単位で指定できますので、注意して下さい。特別な理由がない限り、名前定義は「ブック」にします。Rangeはデータ型です、ここのRangeはオブジェクトです、混同しないで下さい。Range("顧客登録開始")pos顧客登録はRange型のオブジェクトです。Range("顧客登録開始")は「顧客登録」の先頭セルです。セルをオブジェクトに入れています。このように、オブジェクトに入れる場合は、Setを先頭に付けます。私でもたまに付け忘れますが、実行時にエラーになるので、直ぐに分かります。結局何をしているかと言えば、Public変数に、シート名や、シートの使用先頭セルを格納しています。これを使う事で、シート名の変更や、開始位置の変更に対応させます。はい、次は、Subモジュール「顧客登録シート作成」の変更です。0)'上で計算した個数分のセルを結合する。Sub太字の部分が変更した箇所です。他のモジュールを呼んでいます。「シート名取得」というモジュールを実行しています。結果、Public変数にシート名やシートの使用先頭セルが格納されます。このPublic変数を参照することで、シート名を直接記述しなくて済むようにします。pos顧客登録.Columnpos顧客登録はRange型のオブジェクトであり、シートの使用先頭セルが格納されています。Rowは、行番号を返しますColumnは、列番号を返しますつまり、シート「顧客登録」の使用先頭セルの行列番号を取得しています。これで、シート名を変更しても、開始セルをずらしても、マクロを変更せずに済むことになります。今回は、ここまで、ちよっと疲れました。このペースでは、初めてマクロを使う人は、ついてくるのが大変ですよね。次回は、ここまでの復讐にでもしようかと思います。顧客登録のシートを作成(2)このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。顧客登録のシートを作成(2)このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。