- ベストアンサー
エクセルVBAを使ってセルに日付+通し番号を入力したい
Excel2003でVBAを使い、セルに[現在の日付および時間]+[3桁の通し番号]を文字列で入力したいのですが、なかなかうまくいきません。 例えばA列に データA データB データC ・・・ ・・・ のようにデータが200個ほどある場合、B列に yymmddhhmm001 ← 2009年12月13日3時25分に実行した場合は0912130325001 yymmddhhmm002 yymmddhhmm003 ・・・ ・・・ のように記載したいと思っています。 VBA初心者ですので、ものすごく簡単なことを質問しているかもしれませんがご教授頂ければ幸いです。 宜しくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>ものすごく簡単なことを質問しているかもしれませんがご・・ それに近い。 ー A列の日+時刻が日・時刻順序に並んでいるかどうかが、ロジックの難しさを制します。質問に書いてないが、大切さを判ってますか。 並んでいるなら日・時刻部分を文字列化するのは A2に例えば2009/12/10 12:13:00とあるとして、 Sub test01() MsgBox Format(Cells(2, "A"), "yymmddhhmm") End Sub を実行して納得してください。そのあとに 連番は Sub test02() n = 1 MsgBox Format(n, "000") End Sub で納得してください。 ーー そして前の行の日+時刻と変わったか、比較して聞き 変わったなら n=1にして番号を決め、日・時刻部分と&で結合したら仕舞い。 同じ場合はn=n+1して番号を決め、日・時刻部分と&で結合しする。 簡単なことを聞いている。 ーー 順番がばらばらだと、色んな方法が考えられるが略。もしそうなら 別質問を立てたら。ソートが許されるなら、ソートして上記のロジックに持ち込むべきだ。 ーー ちなみに セルの値であるところの、日+時刻のシリアル値は整数+少数付き数になっているのを知ってますか。
その他の回答 (5)
- ka_na_de
- ベストアンサー率56% (162/286)
#6です。 訂正します。 前回のコードは無視してください。 前提条件は前回と同じです。 '================シートモジュールに記述================================= Private Sub Worksheet_Change(ByVal Target As Range) Dim myDate As String, myBuf As String If Target.Column <> 1 Then Exit Sub If Target.Row = 1 Then Exit Sub If Target.Value <> "" And Target.Offset(, 1).Value = "" Then myDate = Format(Now(), "yymmddhhmm") If Target.Row = 2 Then Target.Offset(, 1).Value = myDate & "001" Else myBuf = Target.Offset(-1, 1).Value If Len(myBuf) = 12 Then myBuf = "0" & myBuf ElseIf Len(myBuf) = 11 Then myBuf = "00" & myBuf End If If myDate = Left(myBuf, 10) Then Target.Offset(, 1).Value = myDate & _ Format(CInt(Right(myBuf, 3)) + 1, "000") Else Target.Offset(, 1) = myDate & "001" End If End If End If End Sub
お礼
とても参考になりました。お二人までしかポイントをお付けできないことを何卒ご容赦下さい。ご回答ありがとうございました。
- ka_na_de
- ベストアンサー率56% (162/286)
こんにちは。 実行するという意味が分かりませんが、 データが書き込まれた時間と解釈しました。 一度入力したデータを再入力(修正)する場合は考慮してません。 また、1行目は見出し行とし、2行目からデータ入力すると仮定してます。 さらに、B列の「書式」「表示形式」は「ユーザー定義」で 0000000000000 にしている前提です。(0が13個) '================シートモジュールに記述================================= Private Sub Worksheet_Change(ByVal Target As Range) Dim myLastRow As Long, i As Long Dim myDate As String, myBuf As String If Target.Column <> 1 Then Exit Sub If Target.Row = 1 Then Exit Sub myLastRow = Cells(Rows.Count, "A").End(xlUp).Row For i = myLastRow To 2 Step -1 If Cells(i, "A").Value <> "" And Cells(i, "B").Value = "" Then myDate = Format(Now(), "yymmddhhmm") If i = 2 Then Cells(i, "B").Value = myDate & "001" Else myBuf = Cells(i - 1, "B").Value If Len(myBuf) = 12 Then myBuf = "0" & myBuf ElseIf Len(myBuf) = 11 Then myBuf = "00" & myBuf End If If myDate = Left(myBuf, 10) Then Cells(i, "B").Value = myDate & _ Format(CInt(Right(myBuf, 3)) + 1, "000") Else Cells(i, "B").Value = myDate & "001" End If End If ElseIf Cells(i, "A").Value <> "" And Cells(i, "B").Value <> "" Then Exit For End If Next i End Sub
お礼
ご回答ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >VBA初心者ですので、ものすごく簡単なことを質問しているかもしれませんが 質問内容としては、非常に難しいです。どう解釈してよいのか分からないからです。 A列 B データA yymmddhhmm001 の関連性が見えてこないからです。 データAに日付や時間のデータがあるということでしょうか? それとも、1秒単位で、ループを動かして、数値を変えていくということでしょうか? いずれにしても、それは、ワークシートでは、Text 関数で処理できることだとは思います。VBAでは、Format 関数で、それほどには変わらないですから、それで試してみてください。 たとえば、こんなアドバイスが可能です。 For i to ~ のループなどで、i をインクリメントします。(increment =>1を足す) Cells(i, 2).Value = Format(Cells(i, 1).Value, "yymmddhhmm") & Format(i, "000")
お礼
とても参考になりました。ありがとうございました。
- KURUMITO
- ベストアンサー率42% (1835/4283)
例えば次のようなマクロにしてはどうでしょう。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 And Cells(Target.Row, 1) <> "" Then Cells(Target.Row, 2).Select Selection = Format(Now(), "yymmddhhmm") & Format(Application.CountA(Range(Cells(1, 1), Cells(Target.Row, 1))), "000") End If End Sub B列の書式は表示形式のユーザー定義で0000000000000としておくことが必要です。
お礼
とても参考になりました。お二人までしかポイントをお付けできないことを何卒ご容赦下さい。ご回答ありがとうございました。
- Trick--o--
- ベストアンサー率20% (413/2034)
> なかなかうまくいきません。 何ができて、何ができないのですか?
お礼
お蔭さまで解決いたしました。ありがとうございました。
お礼
Format関数で日付+時刻と連番の表示形式をそれぞれ指定し、それを&で結合したものをループさせることで無事希望どおりのことができました。ありがとうございました。