プロが教える店舗&オフィスのセキュリティ対策術

自分で関数やVBAコードを作成してみましたが、うまく出来ませんでした。
皆さんならどのようにするかご教授願います。

購入日を元に購入月ごとにDMを送付する為のデータを作成したいです。

ブック:購入履歴
E2 顧客no
F2 顧客氏名
I2 購入日
J2 購入店舗

のデータを元に

ブック:DM送付履歴
E6 顧客氏名
F6 顧客no
G6 購入日
S6 購入店舗
を自動的に入力したいです。

前任者は、フィルターで月ごとに抽出しコピペしてDM送付履歴を作成していました。
どうにか簡単に作業をしたいのですが、関数の組み合わせも上手くできません。
良い方法があれば教えて頂きたいです!

質問者からの補足コメント

  • 回答ありがとうございます。
    記録マクロでひと月分は作成できるのですが、それを毎月同じ作業を行うところまで持っていけませんT_T

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/06/15 22:21

A 回答 (5件)

No.2です。


気になったのでとりあえず作ってみました。
もう不要でしたらスルーしていただいて結構です。
ちなみに伝達事項としては
①購入履歴.xlsmには作業列を設けておりDM送付履歴へコピペしたデータには「コピペ済」と念のため記します。
②該当データをDM送付履歴.xlsxへ貼り付ける際7行目から貼り付けていっています。既存データの削除処理は入れておりません。
③DM送付履歴の上書き保存処理は入れておりません。
④「I2 購入日」の入力パターンを3つ作ってみました。もし該当するものがあれば他の2つはクリアして下さい。該当するものがない時はゴメンナサイ。

Public Sub a()

Dim buf As String
Dim ym As String
Dim cntALL As Double
Dim r1 As Double
Dim r2 As Double
Dim cnt As Double

'//-------------------------------
'ブック名の指定
Const bk1 = "購入履歴.xlsm"
Const bk2 = "DM送付履歴.xlsx"
'-------------------------------//
'//-------------------------------
'シート名の指定(購入履歴)
Const sn1 = "Sheet1"
'シート名の指定(DM送付履歴)
Const sn2 = "Sheet1"
'-------------------------------//
'//-------------------------------
'作業列の指定
Const wkR = "K"
'-------------------------------//
'//-------------------------------
'DM送付履歴の保存パス
Const pth = "C:\xxx\"
'-------------------------------//

With Workbooks(bk1).Worksheets(sn1)

'抽出年月の指定
buf = InputBox(Prompt:="抽出したい年月を入力してください。", Default:="yyyymm")

'作業列をクリア
.Columns(wkR & ":" & wkR).Select
Selection.ClearContents
.Range("A1").Select

'データ数の確認
r1 = 3
cntALL = 0
Do Until Len(.Range("I" & r1)) = 0
r1 = r1 + 1
cntALL = cntALL + 1
Loop

'「DM送付履歴」を開く
If Dir(pth & bk2) <> "" Then
Workbooks.Open pth & bk2
Else
MsgBox "『" & bk2 & "』の指定パスが正しくない可能性があります", vbExclamation
End If

'該当データのコピペ
r1 = 3
r2 = 7
For cnt = 1 To cntALL

'パターン①:購入日が『yyyymmdd』の場合
ym = Left(.Range("I" & r1), 6)

'パターン②:購入日が『yyyy/mm/dd』の場合
ym = Left(.Range("I" & r1), 4) & Mid(.Range("I" & r1), 6, 2)

'パターン③:購入日が『yyyy/m/d』の場合
ym = Left(Format(.Range("I" & r1), "yyyymmdd"), 4) & Mid(Format(.Range("I" & r1), "yyyymmdd"), 5, 2)

If buf = ym Then
Workbooks(bk2).Worksheets(sn2).Range("E" & r2) = .Range("E" & r1)
Workbooks(bk2).Worksheets(sn2).Range("F" & r2) = .Range("F" & r1)
Workbooks(bk2).Worksheets(sn2).Range("G" & r2) = .Range("I" & r1)
Workbooks(bk2).Worksheets(sn2).Range("S" & r2) = .Range("J" & r1)
.Range(wkR & r1) = "コピペ済"
r2 = r2 + 1
End If
r1 = r1 + 1
Next
End With
End Sub
    • good
    • 0
この回答へのお礼

ありがとう

picopico_7様
お礼が遅くなり申し訳ありません!
来月も再来月も同じ作業がありますので、回答頂き本当に感謝ですm(_ _) m

作成して頂いたものと自分の作った物を比べてみると、定義が足りなかった様に思います。フィルタをかけるからと曖昧になっていたようですT^T
作成頂いたものを解読し、来月の作業に向けて再度作成してみます。
ありがとうございました!

お礼日時:2016/06/24 18:51

No.2です。


誰だって最初は素人ですしVBAで業務を効率化したいと考えられることはとても良いことだと思いますよ。
発送期限が近付いておられ今頃お忙しくされていることと思いますので手が空いている時に以下の内容を教えてください。
こちらでもちょっとやってみます。

①「I2 購入日」の入力形式(yyyy/m/dなど)
②「ブック:DM送付履歴」は6行目がタイトルでデータは常に7行目から上書きで貼り付けて良い?(貼り付け前に存在するデータはクリアされる)
③「ブック:DM送付履歴」の拡張子(xlsxなど)
    • good
    • 0

こんばんは



「作業列」という考え方もあります。
例えば、z列あたりに
=TEXT(G6,"mm")
と関数を入れておけば、日にちは関係なく、「月」だけを拾えます。
これでフィルタを掛ければ、月の指定が楽になります。

これで、記録マクロを試してみてください。

追加のポイントは「今月」なのか「来月」なのかあたりだと思います。
今日(作業日)が何月なのかは下記のコードで拾えます。
Month(Date)
来月なら、
Month(Date) + 1
となります。
    • good
    • 0
この回答へのお礼

ありがとう

回答ありがとうございます!
面倒な事に、1年前の同月に購入された方に送るんです…^^;
あっちもこっちも…と考えていると混乱して頭から湯気が出てきてしまいます´д` ;
とりあえず、締め切りに間に合うよう地道に発送したいと思いますT^T
ありがとうございました!!

お礼日時:2016/06/22 19:10

こんにちは。


購入日の入力形式が分からないのでアドバイス程度になりますが、マクロを実行させた時に入力ボックスを表示させてあげてはどうでしょう?
例えば購入日がyyyymmdd形式で入力されているならばyyyymmを入力させる入力ボックスを表示させてその値をフィルターの「~で始まる」ものと一致させ、表示されたものを「DM送付履歴」にコピペしてあげてみては?

何か行き詰るようでしたらまた補足をください。
    • good
    • 0
この回答へのお礼

お返事が遅くなり申し訳ありません。
なんとかポップアップで月を選択するようにできましたが、今後は別のファイルを開くことが出来なくなってしまいました(;´Д`A
会社PCの為詳細を掲示できないのですが、素人がVBAで楽しようというのが間違っていたのかなと反省しております。。。
発送期限も迫ってきたので、地道に頑張ろうと思います。
ありがとうございました!!

お礼日時:2016/06/22 18:56

自分なら記録マクロで他のブックを参照するところまで記録して、できたマクロを見てみる。

この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!