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

下記のようなレコードが5万件あるエクセルの顧客管理シートがあります。
このシートをもとに差し込み印刷ではがきを作成しDMを発送するのですが、何日かに分けて発送しE列に発送日を入力します。
その際にA列の№をもとに、例えば1~150までを同日発送した場合、E列に一括で発送日が反映される方法を教えてください。
この表とは別に、発送日○/○ №○~№○ という表を作って、そこから一括で発送日が指定行に反映されればと思っています。
よろしくお願いします。


A ・・・B・・・ ・・C ・・・・D ・・・・・・E
№・・・名前・・ ・〒 ・・・・住所 ・・・・発送日
1 ・・・東京花子 ・157-00・・東京都
2 ・・・大阪太郎 ・222-00 ・・大阪府

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

  • うーん・・・

    ”反映”は”表示させる”です。
    発送履歴?それはどうやるのでしょう?
    併せてCOUNTIFSの数式も教えていただければ嬉しいです。

    No.4の回答に寄せられた補足コメントです。 補足日時:2017/01/24 18:59

A 回答 (4件)

こんばんは!



E列の日付データは残しておく必要がありますよね。
そうなるとおそらく数式で対応できないような気がしますので、
VBAでの一例です。

↓の画像のようにH列に「発送日」「開始No.」「最終No.」を入力するという前提のコードです。

Sub 発送日()
Dim c As Range, r As Range, myFlg1 As Boolean, myFlg2 As Boolean
If Range("H1") = "" Then
MsgBox "発送日を入力してください"
Range("H1").Select
Exit Sub
End If
If Range("H2") = "" Then
MsgBox "開始No.を入力してください"
Range("H2").Select
Exit Sub
End If
If Range("H3") = "" Then
MsgBox "最終No.を入力してください"
Range("H3").Select
Exit Sub
End If
Set c = Range("A:A").Find(what:=Range("H2"), LookIn:=xlValues, lookat:=xlWhole)
If c Is Nothing Then
myFlg1 = True
MsgBox "開始No.なし"
Range("H2").Select
Exit Sub
End If
Set r = Range("A:A").Find(what:=Range("H3"), LookIn:=xlValues, lookat:=xlWhole)
If r Is Nothing Then
myFlg2 = True
MsgBox "最終No.なし"
Range("H3").Select
Exit Sub
End If
If myFlg1 = False And myFlg2 = False Then
With Range(Cells(c.Row, "E"), Cells(r.Row, "E"))
.NumberFormatLocal = "yyyy/m/d" '←表示形式は好みで!//
.Value = Range("H1")
End With
End If
End Sub

※ 本来であれば重複しないように最終番号(何番までDMを送ったか?)
をどこかに記録として残すのが良いのかもしれません。

※ 厳密にやれば細かいエラー処理が必要になるかもしれませんが、
まずはこの程度で・・・m(_ _)m
「Excelで指定行に日付が一括で反映でき」の回答画像1
    • good
    • 1
この回答へのお礼

助かりました

早速のご回答ありがとうございました。
やっぱりVBAなんですね。
ハードル高いですがコピぺしてやってみます。
ありがとうございました(*^▽^*)

お礼日時:2017/01/23 23:01

別シートと言うシート名で内容をA列:発送日、B列:開始No、C列:終了No、としますね。


仮に1行目~1000行目まで入力予定とします。

E1に各タイトルが入っているなら、E1及びA1をE2及びA2と読み替えてください。
E1=SUMPRODUCT((A1>=別シート!B$1:B$1000)*1,(A1<=別シート!C$1:C$1000)*1,別シート!A$1:A$1000)

これは、別シートのB1~B1000の中でA1以下の行を探し、同様にC1~C1000の中でA1以上の行を探し、両方に一致する行の対応するA1~A1000のセルのデータ(つまり発送日)を取得するというものです。

配列計算の為、列全体にすると重くなるので、とりあえず1000あるとして記載しています。
内容をもう少し説明すると、
まず別シートのB1~1000でA1以下のものをTRUE、そうでないものをFORSEとして判定します。
*1によって、それを1と0の判定に変換します。
この時、例えば該当するのが3行目の発送日の期間だった場合、(1,1,1,0,0,0…)と判定されます。
同様に別シートのC1~1000で(0,0,1,1,1,1…)と判定されます。
3つ目は少し違って、そのまま別シートのA1~1000が入っています例で1/1から毎日とすると(1/1,1/2,1/3,1/4,1/5,1/6…)となっています。
そして対応するセルの数値がそれぞれかけられます。(日付も数値データなので)
(1*0*1/1,1*0*1/2,1*1*1/3,0*1*1/4,0*1*1/5,0*1*1/6…)という感じですね。
計算された結果(0,0,1/3,0,0,0…)となります。
これが合計されて1/3と表示されます。

発送日が数値として判定されないような入力(文字列として入力等)をしている場合は、掛け算の時点でエラーとなりますので、該当するセルの位置を判定して抽出するといった段階をくわえなければなりません。
    • good
    • 1
この回答へのお礼

ご回答いただきありがとうございます。

すごく丁寧で分かりやすいです。
早速やってみたいと思います。

お礼日時:2017/01/24 19:02

え?ある程度連続した番号を発送するんですよね。



オートフィルタで該当番号を抽出して、発送日の列を上から下まで選択、日付を入力後Ctrl+Enterでいいのでは?

わざわざ別表作る方が面倒だと思いますけど…
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

レコードが多いのと、連続するとは限らないので…。

お礼日時:2017/01/24 19:01

発送履歴を作っておけば COUNTIFSで済むと思います。


「反映」というのが「表示させる」という意味ならですけど。
この回答への補足あり
    • good
    • 0

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