• ベストアンサー

excelの関数かマクロで連番、日付を付けたい

こんばんわ、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 どなたか、ご教授ください。 どうぞ、宜しくお願い致します。

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

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.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ではなく、シートの値によって自動的に更新される関数式の方がよいのです

その他の回答 (2)

  • maron--5
  • ベストアンサー率36% (321/877)
回答No.2

D2=B2&TEXT(C2,"-yyyy/m/d-")&COUNTIF($B$2:B2,B2) ★下にコピー

  • 134
  • ベストアンサー率27% (162/600)
回答No.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

関連するQ&A