マクロや関数で来店管理表を作成したい

このQ&Aのポイント
  • マクロや関数を使用して、最終来店日別・顧客番号順の管理表を作成したいと考えています。
  • 表1と表2のデータを元に、来店日管理表の作成方法を教えてください。
  • 初日と2日目の方法をそれぞれ説明し、表1のデータを消去する手順も教えてください。
回答を見る
  • ベストアンサー

マクロや関数で来店管理表を作成したい。

最終来店日別・顧客番号順の管理表を作成したいと考えております。   表1・初日データ 行番号         列番号 G       列番号 H              顧客番号       最終来店日   6          100           2011-11-09   7           30           2011-11-09   8           500           2011-11-09   9           200           2011-11-09 10 ~   1000                                            表2・2日目データ 行番号         列番号 G       列番号 H              顧客番号       最終来店日   6          150            2011-11-10   7           500           2011-11-10   8           10            2011-11-10   9                  ~  1000                                            表3・来店日管理表 行番号 列番号 B  列番号 E     列番号 F        顧客番号  最終来店日    来店回数   6    10      2011-11-10    1   7    150          2011-11-10   1   8     500          2011-11-10   2   9     30    2011-11-09   1   10   100      2011-11-09      1   11    200     2011-11-09      1   12      ~  1000 ●〔表1〕・〔表2〕のデータから、〔表3〕のような〔来店日管理表〕の作成方法を教えてください。  1・初日 1・初日に〔表1〕のデータを〔表3〕に表示し、〔列番号 F〕に来店回数を〔1〕と表示する 2・〔最終来店日〕別・〔顧客番号順〕に表示する 3・〔表1〕のデータを消去する  2・2日目 1・〔表3〕のデータと〔表2〕のデータを統合して、初来店者は〔列番号 F〕に来店回数を           〔1〕と表示する          複数回来店者は、〔列番号 F〕に来店回数を〔前回回数+1〕して表示する 2・〔最終来店日〕別・〔顧客番号順〕に表示する 3・〔表1〕のデータを消去する 宜しくお願い致します。

  • oguno
  • お礼率61% (179/289)

質問者が選んだベストアンサー

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! 2日目の >3・〔表1〕のデータを消去する は >3・〔表2〕のデータを消去する だと解釈しての一例です。 表1はSheet1・表2はSheet2にあり、Sheet3にまとめるようにしてみました。 「初日」と「二日目」の二つのマクロになりますので、「初日」のマクロから実行してみてください。 Sub 初日() Dim i, j, k As Long Dim ws1, ws3 As Worksheet Set ws1 = Worksheets(1) Set ws3 = Worksheets(3) j = ws1.Cells(Rows.Count, 7).End(xlUp).Row k = ws3.Cells(Rows.Count, 2).End(xlUp).Row Application.ScreenUpdating = False If k > 5 Then Range(ws3.Cells(6, 2), ws3.Cells(k, 6)).ClearContents End If ws3.Columns(5).NumberFormatLocal = "yyyy-m-d" For i = 6 To j If WorksheetFunction.CountIf(ws3.Columns(2), ws1.Cells(i, 7)) = 0 Then With ws3.Cells(Rows.Count, 2).End(xlUp).Offset(1) .Value = ws1.Cells(i, 7) .Offset(, 3) = ws1.Cells(i, 8) .Offset(, 4) = 1 End With End If Next i k = ws3.Cells(Rows.Count, 2).End(xlUp).Row Range(ws3.Cells(6, 2), ws3.Cells(k, 6)).Sort key1:=ws3.Cells(5, 5), _ order1:=xlDescending, _ key2:=ws3.Cells(5, 2), order2:=xlAscending i = ws1.Cells(Rows.Count, 7).End(xlUp).Row Range(ws1.Cells(6, 7), ws1.Cells(i, 8)).ClearContents Application.ScreenUpdating = True End Sub Sub 二日目() Dim j, k As Long Dim ws2, ws3 As Worksheet Set ws2 = Worksheets(2) Set ws3 = Worksheets(3) Application.ScreenUpdating = False For j = 6 To ws2.Cells(Rows.Count, 7).End(xlUp).Row If WorksheetFunction.CountIf(ws3.Columns(2), ws2.Cells(j, 7)) Then k = WorksheetFunction.Match(ws2.Cells(j, 7), ws3.Columns(2), False) With ws3.Cells(k, 5) .Value = ws2.Cells(j, 8) .Offset(, 1) = ws3.Cells(k, 6) + 1 End With Else With ws3.Cells(Rows.Count, 2).End(xlUp).Offset(1) .Value = ws2.Cells(j, 7) .Offset(, 3) = ws2.Cells(j, 8) .Offset(, 4) = 1 End With End If Next j k = ws3.Cells(Rows.Count, 2).End(xlUp).Row Range(ws3.Cells(5, 2), ws3.Cells(k, 6)).Sort key1:=ws3.Cells(5, 5), _ order1:=xlDescending, _ key2:=ws3.Cells(5, 2), order2:=xlAscending j = ws2.Cells(Rows.Count, 7).End(xlUp).Row Range(ws2.Cells(6, 7), ws2.Cells(j, 8)).ClearContents Application.ScreenUpdating = True End Sub ※ 別Sheetでマクロを試してみてください。 ※ 的外れならごめんなさいね。m(_ _)m

oguno
質問者

お礼

tom04様 ありがとうございました。 2日目の >3・〔表1〕のデータを消去する は >3・〔表2〕のデータを消去する だと解釈しての一例です。 ●申し訳ございません、当方の間違いでした。 最初に三枚のシートで作成しました。 次に一枚のシートで作成しました。 いずれも、考えていましたように作成することが出来ました。 此れもご指導のおかげと感謝いたします。 一枚のシートでの作成をしておりましたので、御礼が遅くなりお詫び申し上げます。 今後ともご指導のほど宜しくお願い致します。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

こんなの課題を丸投げで、この質問コーナーをシステム作成の下請けと考えていないか。 一番大切なことは、>表1・初日データ>表2・2日目データ  が別シートどまりか、別ブックにあるのか書いてない。 量的に出来るなら、集約データ表を1つのシートに作ってはどうか。 ーー 同一ブック内の別シートにあるなら Sub test01() Dim sh For Each sh In Worksheets d1 = sh.Range("A65536").End(xlUp).Row d2 = Worksheets("sheet4").Range("A65536").End(xlUp).Row If sh.Name <> "Sheet4" Then 'Sheet4 は集約シート sh.Range("A2:C" & d1).Copy Worksheets("Sheet4").Range("A" & d2 + 1) End If Next End Sub 3シートの例でテストしたが、いくつあってもコードは変わらないで良い。Sheet4のシート名は「集約」とでもすれば良い。 各シート第1行目は項目見出し行とする。 ーー そそれが済めば、集約シートで、顧客番号+最終来店日でソートとして、望みの表にするコードを考えたら。ぐっと易しくなる。 別ブックの場合は1つのフォルダの中にブックを集め(手操作)どうしたら集約できるか考えること。 Googleででも「VBA フォルダ エクセルファイル 集約」で照会すれば沢山記事が出る。わたしも何回も回答している FAQだ。

関連するQ&A

  • マクロをご教示ください。

    (1) C列に顧客番号を表示しその時の販売金額をH列に表示しております。     顧客番号はC6からC1000に発生順に表示しているため顧客番号は順不同です。     販売金額はH6からH1000に発生順に表示していますす。         列番号 C    列番号 H 行番号    顧客番号      金額   6        100        2000   7         30        3000  ~         500         10  100        30        20000  ~         100       25000  700        30        5000  ~         200        500 1000        100       10000 (2) 上記(1)の表を顧客別・金額順に並べ替えた表を作成したい。 顧客番号はP6からP1000に昇順に表示したい。 販売金額はQ6からZ6に高額順に表示したい。       列番号P   列番号Q   列番号R   列番号S   ~ 列番号Z 行番号  顧客番号   金額1   金額2   金額3   金額10   6      30   20000 5000 3000 7 100 25000 10000 2000 8 200 500 9 500 10 ~1000 ● ご教示のほど宜しくお願い致します。

  • DCOUNT関数がなぜかカウントしない

    DCOUNT関数を使って顧客のデータから来店回数を抽出しようとしているのですが、エラーは出ないのですが、なぜかどの客も来店回数が0なのです。 顧客データがにはちゃんと来店日、売上などがかいていあるのですけど… DCOUNT関数のdatabaseに顧客の全データ(顧客の来店などのデーターを含む)のシート全体を指定して、フィールドに「ID番号」(顧客の)の列を指定して、クリテリアには集計するID番号の顧客ID番号を入力しています。 数字は出てくるんですが、どの顧客も来店回数0です。 エクセル2000を使っています。 なぜ、うまく計算されないのかさっぱり分かりません。 よろしくお願いします。

  • 車のタイヤ管理表

    車のタイヤを年月で管理して6か月経過経過した車両を点検と表示したいのです。計算式を教えてください。 (例)下記のような管理表を作成して管理したいのです。      列1        列2         列3        列4  行1 車両番号  前回点検年月   今回点検年月   点検  行2 車両番号  以下数百台あります            行1列4に該当車両だけ点検と表示したいのです。  ご無理なお願い申しますが宜しくお願いします。

  • 表のばらばらの文字列をまとめるマクロ 関数

    以前、同じ内容の質問を聞いたのですが、少し条件を変えて質問です。 (1)左の表には数式が入っていて、この他にもう一つある表のデータに該当すると1列ごとにSMとかNPとか表示されるようになっています。 (2)この左の表は実際には136列あるので、結果を印刷すると一枚に収まりきらないのです。なので、右の表のように、最短の列に表示したいのです。 (3)この例ではたまたま1行に1個ずつしか文字列が入ってないので右の表は1列ですが、1行に付き2個以上文字列が入ることもあります。5個以上はほとんどないです。 (4)関数でできませんか? またはマクロでもいいです。 以前、回答でいただいた関数は =IFERROR(HLOOKUP("*?",$A1:$D1,1,FALSE),"") 又は =IF(COUNTIF($A1:$D1,"*?"),HLOOKUP("*?",$A1:$D1,1,FALSE),"") でしたが、これだと1行につき1個文字列があるときのみ可能です。 1行に付き2個以上文字列がある場合に、例えば空欄を削除して左に詰めるような感じでマクロでできないでしょうか?

  • Excelで作成した表の中から重複している数値を知りたい

    仕事でExcelで作成した表について教えていただきたいことがあります。 項目がたくさんある表なのですが、そのなかのひとつの項目で、重複する番号がたくさんある項目があるのですが、どれが重複した番号かを知りたいのです。500行くらいになる表なので、作業が大変なのですが・・・。現在はいったん、その項目を番号順にデータの並べ替えをしてから、データの集計を行い、番号の重複している行を色分けして、またデータの並べ替えで元の行番号順に戻し、色がついている行が重複しているんだなと思いながら作業をしています。 かなりの行数なのでその作業がすごく大変です。 関数などよくわからないのですが、何か簡単にできる方法がないかなといつも考えています。 例えば、並び替えなどをせず、作成している表の横に、その項目の重複している番号を表示する、とか、そういったことができないものでしょうか? 分かりにくい書き方で申し訳ありません・・・。

  • 売上帳に顧客識別番号を記入しており、顧客の来店数及び来店月を集計しよう

    売上帳に顧客識別番号を記入しており、顧客の来店数及び来店月を集計しようと考えています。 売上帳はシート別に日付名で管理しておりその中の顧客識別番号記載の列を読み取り、別の集計シートで どの顧客がその月で何回来店したかを管理したく思っております。 現在の状態 1、シートは日付別で11-1~11-30の名前で管理している。 2、顧客識別番号は各シート B4~B48 までに入力してある。 3、別途集計用シートにて 1~400 までの顧客が何回来店しているかを求めたい。 ※顧客識別番号は1~400まで登録されている。 4、売上は各月ブック別で管理 例: 売上シート    A      B C       D    E 3  No.(来店数) 顧客識別番号 顧客名     商品名 担当 4  1       35    顧客太郎    タンス 太朗 5  2       111   顧客花子     棚    二朗 6  3        7    顧客サム    センス 三朗 * ※シート名 11-4 集計シート         (来店数)  (来店数)  (来店数)    A      B      C       D 1  (顧客識別番号)   10月    11月    12月 2    1          1      5      1 3    2          1      0      1 4    3          1      0      1 5    4          1      2      1 6    5          2      1      1 7    6          1      4      0 8    7          4      1      0 9    8          0      8      2 10   9          1      1      1 *   (400まで) このように集計したい↑もしくは単月(月別ブック)集計だけでも良い。 これらを他のブックに反映する事は可能か?※リンクが閉じられている状態でも。 初心者ながら色々過去ログも試してみたのですが反映されずどうしたものだろうと困っています。 宜しくお願い致します。      

  • マクロで表の一部を書き換えたい

    A列に購入日・B列に管理番号・C列に使用状況・D列に使用日と言った表が有るとして、指定したセル(例えばE5に管理番号・E6に使用日)を入力してマクロを実行した時に表の一部を書き換えたい。 A列は条件から外しても良いと思いますので以下の説明は省略します。 表には 管理番号 使用状況 使用日 1001  未使用  (空白) 1002  未使用  (空白) 1003  未使用  (空白) 使用日を1月1日・管理番号を1002と入力した時に 管理番号 使用状況 使用日 1001  未使用  (空白) 1002  使用   1月1日 1003  未使用  (空白) と書き換えたい。 条件は、まず表の中に入力した管理番号が有るかの判別し無ければエラーメッセージを返して終了、次に入力した管理番号が既に使用になっていないかを判別し使用になっていればエラーメッセージを返して終了、この2つの条件を満たした時に表を書き換えて完了。 解り難い説明で申し訳ありませんが、よろしくお願いします。

  • エクセルで二つの表を一つにする方法

    エクセルの二つの表を一つにまとめる方法がわかりません。 表1・表2とも共通なところは、列Aから順に会社名(表1は(株)などの表示あり、表2には無い)・住所(表1には都道府県名から記載あり、表2には無い。またその逆パターンもあり)・電話番号・FAX番号があります。電話番号やFAX番号も何本か回線があるものもあり、必ずしも一致するとは限りません。 E列以降は表1には代表者名、表2には、交渉日、担当者名、交渉内容と別の物が入っています。 1行に一つの会社の情報が入っていますが、行についてはA列とB列の並び順はバラバラで、それぞれ重複している会社もあれば、他方に無い会社データもあります。 この二つの表を一つにまとめるため、最良なエクセルの使い方を教えてください!よろしくお願いします。

  • 次回来店日を表示する方法

    顧客管理をする方法で来店日より次回来店日を表示する方法が在りますでしょうか? 例えば今日来た人が21日後や90日後に来る場合、その来店日を何月何日と表示する方法です

  • データ分類と罫線作成

    windous7 エクセル2010を使用しています。 約50000行×5列の1列に8桁のコード番号があるシートがあります。これを番号順に並べ替え同一コード番号を有する行は1つのグループとして示すため、異なるコード番号との境に罫線を引き、最終的には全てのコード番号順一覧表としてに印刷する必要があります。 同一コード番号を有する行の数は定まっておらず、1行の場合や30行程になる場合もあります。番号順はソートすれば、できることは分かるのですがグループを判断するには見て判断しながら罫線を引いていくしかないでしょうか?良い方法がありましたら教えて下さい。

専門家に質問してみよう