- ベストアンサー
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 どなたか、ご教授ください。 どうぞ、宜しくお願い致します。
- みんなの回答 (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)
D2=B2&TEXT(C2,"-yyyy/m/d-")&COUNTIF($B$2:B2,B2) ★下にコピー
- 134
- ベストアンサー率27% (162/600)
こんなんでよいでしょうか? 連番と日付を入力し、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