• ベストアンサー

エクセルVBAを使ってセルに日付+通し番号を入力したい

Excel2003でVBAを使い、セルに[現在の日付および時間]+[3桁の通し番号]を文字列で入力したいのですが、なかなかうまくいきません。 例えばA列に データA データB データC ・・・ ・・・ のようにデータが200個ほどある場合、B列に yymmddhhmm001 ← 2009年12月13日3時25分に実行した場合は0912130325001 yymmddhhmm002 yymmddhhmm003 ・・・ ・・・ のように記載したいと思っています。 VBA初心者ですので、ものすごく簡単なことを質問しているかもしれませんがご教授頂ければ幸いです。 宜しくお願いします。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.4

>ものすごく簡単なことを質問しているかもしれませんがご・・ それに近い。 ー 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して番号を決め、日・時刻部分と&で結合しする。 簡単なことを聞いている。 ーー 順番がばらばらだと、色んな方法が考えられるが略。もしそうなら 別質問を立てたら。ソートが許されるなら、ソートして上記のロジックに持ち込むべきだ。 ーー ちなみに セルの値であるところの、日+時刻のシリアル値は整数+少数付き数になっているのを知ってますか。

pockyholic
質問者

お礼

Format関数で日付+時刻と連番の表示形式をそれぞれ指定し、それを&で結合したものをループさせることで無事希望どおりのことができました。ありがとうございました。

その他の回答 (5)

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.6

#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

pockyholic
質問者

お礼

とても参考になりました。お二人までしかポイントをお付けできないことを何卒ご容赦下さい。ご回答ありがとうございました。

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.5

こんにちは。 実行するという意味が分かりませんが、 データが書き込まれた時間と解釈しました。 一度入力したデータを再入力(修正)する場合は考慮してません。 また、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

pockyholic
質問者

お礼

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

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 >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")

pockyholic
質問者

お礼

とても参考になりました。ありがとうございました。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

例えば次のようなマクロにしてはどうでしょう。 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としておくことが必要です。

pockyholic
質問者

お礼

とても参考になりました。お二人までしかポイントをお付けできないことを何卒ご容赦下さい。ご回答ありがとうございました。

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.1

> なかなかうまくいきません。 何ができて、何ができないのですか?

pockyholic
質問者

お礼

お蔭さまで解決いたしました。ありがとうございました。