エクセルで顧客管理を作ります、ここまで、ハイペースで来ましたので、一旦整理しながら復習します、まず、エクセルのシートの確認です。シート「顧客一覧」の「顧客区分」に、「入力規則」の「リスト」を設定します。名前定義1.シート「項目名」を選択2.Ctrl+F3を押して下さい。Ctrl+F3は名前定義の画面を表示するショートカットです。2.「名前」に、「顧客管理」と入力3.2007以降の場合は、「範囲」は「ブック」のままにして下さい。4.「参照範囲」に、「=OFFSET($A$2,0,0,COUNTA(項目名!$A:$A)-1,1)」と入力5.「OK」「入力規則」の「リスト」の設定1.シート「顧客一覧」を選択2.セルC4:C103までを選択。顧客区分の全範囲です。2007以降なら、「データ」→「データの入力規則」4.「入力値の種類」で、「リスト」を選択」5.「元の値」で、「顧客管理」と入力。F3で一覧から選択できます。6.「OK」この名前定義との使い方は絶対に覚えましょう。他の関数と組み合わせることで、利用範囲の広いテクニックです。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に「項目名シート名」と名前定義する。シート名取得の関数です。ブック名なら、=MID(CELL("filename",A1),FIND("[",CELL("filename",A1))+1,FIND("]",CELL("filename",A1))-FIND("[",CELL("filename",A1))-1)「顧客一覧」と「顧客登録」の先頭セルに名前定義する。名前定義シート名を変更しても、シート位置がずれても、マクロを修正しなくて済ませる為の準備です。'上で計算した個数分のセルを結合する。Sub以上が作成したエクセルとマクロです。幅)基準のセルから指定の行数と列数だけシフトした位置にある、高さと幅のセル範囲を返す関数です。COUNTA(範囲)指定範囲の、空白でないセルの個数を返します。PHONETIC(範囲)ふりがなの文字列を取り出します。CELL(検査の種類,対象範囲)対象範囲の右上隅にある書式、位置等を返します。"filename"ですと、「フルパス[ブック名]シート名」が返ってきます。RIGHT(文字列,文字数)文字列の右端から指定した文字数だけ取り出すLEFTなら左端からになります。Longこれは、変数の定義です、変数とは、データを一時的に保存しておく入れ物です。この入れ物には、種類が色々あり、入れられる物が違ってきます。身の回りで言えば、鍋、ザル、ダンボール等々だと考えて下さい。水を入れるなら、上のなかなら、鍋しかないですよね。入れるデータによって種類を決めます。これをデータ型と言います。この変数定義は、「,」で区切ることで、1行に複数書くことが出来ます。バリアント型それぞれ詳しい値の範囲等は省略します。Integerの範囲だけ示したのは、現在のエクセルでは、行数には不足している事を理解して欲しいからです。行数をいれるなら、Longが必要です。これをいきなり全て覚えるのは無理でしょうから、分からない時は、Variantを指定して下さい、これは何でも入れられる便利なものです。3これは、r1という変数に3を入れることです。r2を3に等しくすると考えればよいでしょう。Worksheets("顧客登録")は、シート「顧客登録」のことです。これは、Sheets("顧客登録")でも同じです。シートは、「ワークシート」や「グラフ」等があり、この種別のちがいであり、Sheetsなら全てのシートを指定できます。最初はどちらでも好みで良いと思います。UsedRangeは、そのシートで使用したことのあるセル範囲を示します。その範囲を、Clearしています、全て消去されます、値も書式も消去されます。範囲をシート全部にするなら、「.Cells.Clear」と指定します。条件・・・LooPで、条件を満たすまで、・・・を繰り返します。""になるまで、つまり、空白セルになるまで以下の処理を繰り返すのです。この場合の「=」は値の代入ではなく、等しいかの判定です。列)は、指定の行列の位置のセルを指します。列).Valueなのですが、Valueは省略可能です。Valueは値の入っているプロパティです。c1)のセルの値が空白かの判断をしています。Cellsについては、もっと詳しく説明する必要がありますが、次回以降で。条件・・・Loopがあります、これは、条件を満たしている間、処理を繰り返します。「<>」は等しくないと言う意味です。なります、このValueは、セルが持つプロパティで、値がはいっています。このValueは省略できるのです。シート「顧客一覧」の該当セルの値を、シート「顧客登録」の該当セルに入れています。1これは値の代入です。c1に1を足して、元のc1に入れています。c1を1増やしています。Withこれは、オプジェクトに対し、再定義を省略できるようにします。「・・・」の部分では、このオブジェクトの記述を省略できます。言って、初心者には直ぐには理解しずらいと思います。本来なら、もっと後で説明するところなのですが、ブログへのアップを考えると、記述を短くした方が良いので、あえて先に出しました。理屈ぬきで、オブジェクトを省略出来ると思って下さい。この場合は、Worksheets("顧客登録").○○○は、.○○○だけで良いということです。先頭の「.」は絶対に必要です、決して忘れないで下さい。c2)これは、セルのコピー&ペーストです。マクロの記録だと、Sheets("顧客一覧").Selectrange("B3").SelectSelection.CopySheets("顧客登録").Selectrange("B3").SelectActiveSheet.Pasteこんなふうになると思います。これでは記述が長すぎるし、処理スピードも遅くなります。コピー先」として1行で記述できています。c2)の先頭の「.」は、先のWithで省略された部分です。セルをコピーしていますので、文字・書式の全てがコピーされています。True上で計算して、列数分をセル結合しています。Trueで指定の範囲のセルが結合されます。intW))のセルに対して、上下左右に線をひいています。xlContinuousは線種で、実線になります。マクロの記録をしてみれば分かると思いますが、とんでもなく長い記述になります。今回は簡単に実線を引く場合のやり方です。罫線には色々種類や引き方があるので、必要になった時点で詳しく説明します。1).ClearContents前回は、Worksheets("顧客登録").UsedRange.Clearというのが出てきましたが、.Clearはデータだけでなく、書式も消去します。.ClearContentsはデータのみクリアします。Explicitこれは、変数の宣言を強制するオプションです。VBAでは、変数の宣言を省略できますが、変数の宣言は必ずするようにして下さい。思わぬバグで行き詰らない為の予防策です。「Mod顧客登録」の先頭にも入れておいて下さい。「ツール」→「オプション」で「変数の宣言を強制する」にチェックを付けておけば、モジュールの挿入時に、自動で付加されます。StringPublicは他のモジュールからも参照可能な変数の定義です。同一モジュールのみ参照可能にするなら、Privateとします。Stringは、文字列を入れる変数である事を意味します。RangeRangeは、オブシェクトです。値だけでなく、セルそのものを入れる事ができます。Worksheets("設定").Calculate自動計算が停止していたりして、シート名取得の関数が再計算されていないことを防ぐため、「設定」を再計算しています。Range("顧客登録シート名")Rangeは、前回出たCellsと似たもので、指定されたセル範囲を参照します。今、良く見たら、前回もRangeを使ってました、説明もれです。セル2)は、セル1からセル2のセル範囲になります。Range(名前定義)は、名前定義されているセルになります。シート名が指定されていませんが、良いのでしょうか?名前定義はブック共通なので、シートの指定が必要ありません。2007以降では、名前定義がシート単位で指定できますので、注意して下さい。特別な理由がない限り、名前定義は「ブック」にします。Rangeはデータ型です、ここのRangeはオブジェクトです、混同しないで下さい。Range("顧客登録開始")pos顧客登録はRange型のオブジェクトです。Range("顧客登録開始")は「顧客登録」の先頭セルです。セルをオブジェクトに入れています。このように、オブジェクトに入れる場合は、Setを先頭に付けます。私でもたまに付け忘れますが、実行時にエラーになるので、直ぐに分かります。シート名取得他のモジュールを呼んでいます。「シート名取得」というモジュールを実行しています。pos顧客登録はRange型のオブジェクトであり、シートの使用先頭セルが格納されています。Rowは、行番号を返しますColumnは、列番号を返します結構いろいろ出てきていますね。これからは、さらに複雑なマクロ作成になります。基本を押さえて下さい。次回は、さらにこれをプロっぽいプログラムにしていきます。Mod共通の使い方は、いかにも素人ぽいので(笑)Public変数の使い方を説明するために、このような記述をしましたが、Public変数など使用しないほうが、コードがスマートに見えますので。このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。