アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんばんわ、EXCELマクロ入門者です。
excelの関数かマクロ、VBAで日付や、連番を付けたいです。
できれば関数でできたらなぁと思います。マクロ、VBAはほとんど初めてです。
(1)まず、B2に商品名を入れます。
(2)すると、A2に連番、C2に今日の日付(システム日付)、
D2に商品名と今日の日付、商品ごとの連番が自動的に振っていく感じにしたいです。毎日たくさん入力するらしいのでマクロとかVBAとか関数で作ってくれと頼まれました。

A列は例えばA3に=if(B3="","",A2+1)を入れて何とかできたのですが、
C列の日付(today関数やnow関数ではファイルを開き直すと日付が変わってしまう)とD列の商品名-日付-商品ごとの連番で特に困っています。

イメージとしては下のような感じです。
  A   B    C     D
1 連番 商品名 日付    商品名-日付-商品ごとの連番
2 1   ○○○ 2007/8/10  ○○○-2007/8/10-1
3 2   ××× 2007/8/12  ×××-2007/8/12-1
4 3   △△△ 2007/8/13  △△△-2007/8/13-1
5 4   ○○○ 2007/8/15  ○○○-2007/8/15-2
6 5   ○○○ 2007/8/16  ○○○-2007/8/16-3

どなたか、ご教授ください。
どうぞ、宜しくお願い致します。

A 回答 (3件)

>C2に今日の日付(システム日付)


を入れるのであれば関数では実現できません。VBA(マクロ)が必要になります。
でもB列の日付、D列の商品・日付・連番までVBAで書き込むのはうまい方法とは言えません(理由は後述)。VBAでは日付だけ書き込んで、A列、D列は関数で表示させるのが良いと思います

B列の値が変更されたとき、C列に日付を書き込むマクロは以下です。このマクロはデータを入力するシートの「シート名右クリック」→「コードの表示」で開く画面に貼り付けてください

Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Range("B2:B65536")) Is Nothing Then
  If Target.Cells(1, 1).Value = "" Then
   Target.Offset(, 1) = ""
  Else
   Target.Offset(, 1) = Date
  End If
 End If
End Sub

A2セルの関数式は
 =IF(B2="","",ROW()-1)
D2セルの関数式は
 =IF(B2="","",B2&"-"&TEXT(C2,"YYYY/MM/DD")&"-"&SUMPRODUCT((B$2:B2=B2)*(C$2:C2=C2)))
A2,D2ともに下方向にコピーしてください

補足
VBAでシートのSelection_Changeイベントを使って、「B列が変更されたらA列、D列にデータを書き込む」のは簡単にできます。
でも10行目までデータを入力した後、2行目に戻って商品名を直したらどうなりますか?

VBAで2行目の連番はふり直されますが、3行目~10行目の連番ふり直しは普通しません。(毎回全行のふり直しをするようVBAを書けば別ですが、普通そんな無駄な処理にはしないでしょう)
ですから特にD列のデータ書き込みはVBAではなく、シートの値によって自動的に更新される関数式の方がよいのです
    • good
    • 0

D2=B2&TEXT(C2,"-yyyy/m/d-")&COUNTIF($B$2:B2,B2)


★下にコピー
    • good
    • 1

こんなんでよいでしょうか?


連番と日付を入力し、D列にジャンプするようにしています。


Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 Then
Cells(Target.Row, 3).Value = Date
Cells(Target.Row, 1) = "=row()"
Cells(Target.Row, 4).Select
End If
End Sub
    • good
    • 0

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