プロが教える店舗&オフィスのセキュリティ対策術

Excel2003でVBAを使い、セルに[現在の日付および時間]+[3桁の通し番号]を文字列で入力したいのですが、なかなかうまくいきません。
例えばA列に

データA
データB
データC
・・・
・・・

のようにデータが200個ほどある場合、B列に

yymmddhhmm001 ← 2009年12月13日3時25分に実行した場合は0912130325001
yymmddhhmm002
yymmddhhmm003
・・・
・・・

のように記載したいと思っています。
VBA初心者ですので、ものすごく簡単なことを質問しているかもしれませんがご教授頂ければ幸いです。
宜しくお願いします。

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

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

お礼日時:2009/12/13 20:11

#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
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/12/13 20:12

こんにちは。



実行するという意味が分かりませんが、
データが書き込まれた時間と解釈しました。

一度入力したデータを再入力(修正)する場合は考慮してません。
また、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
「エクセルVBAを使ってセルに日付+通し番」の回答画像5
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/12/13 20:12

こんにちは。



>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")
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/12/13 20:10

例えば次のようなマクロにしてはどうでしょう。


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としておくことが必要です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/12/13 20:10

> なかなかうまくいきません。



何ができて、何ができないのですか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/12/13 20:09

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A