Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Pro : Microsoft 365)
見積番号を取得して連番にしたい
投稿日時: 23/05/25 00:41:18
投稿者: Moony

Excelにて見積書を作成おり、下記の様な事をVBAで出来ないでしょうか?
お知恵を拝借したいです。
 
Sheet1(入力フォーム)
Sheet2(保存先)A行にて見積番号管理しています。
 
Sheet1にてボタンを押すとSheet2のA行で見積番号を取得し
見積番号に見積日の20230525-01,02,03の様にその日に作った見積書に枝番を振りたいです。
次の日になると枝番はリセットされ20230526-01,02,03にしたいです。
 

回答
投稿日時: 23/05/25 09:32:53
投稿者: 半平太

Sheet1のボタンに下記コードを登録する
 

Sub ボタン1_Click()
    Dim lastR As Range, DnN
    
    Set lastR = Worksheets("Sheet2").Cells(Rows.Count, "A").End(xlUp)
    DnN = Split(lastR.Value & "-", "-")
    
    If DnN(0) = Format(Date, "yyyymmdd") Then
        lastR.Offset(1) = DnN(0) & Format(DnN(1) + 1, "-00")
    Else
        lastR.Offset(1) = Format(Date, "yyyymmdd-01")
    End If
End Sub

投稿日時: 23/05/25 11:30:04
投稿者: Moony

早速のコメントありがとうございます。
やりたかった事が出来ました。
 
Sheet1 B8 に取得した番号を入力したいのですが
どの様に記述したらよろしいでしょうか。
言葉足らずで申し訳ございません。

回答
投稿日時: 23/05/25 17:13:35
投稿者: WinArrow

質問文の中に
「Sheet1」の内容を「Sheet2」に転記することが説明されていないので、
 
NEXT番号をSheet1のセルB8に取得するコードの
代案を紹介します。
 
標準モジュールに
 
Sub ボタン1_Click()
Dim myTODAY As Date
Dim CNT As Long
    myTODAY = Date
    CNT = WorksheetFunction.CountIf(Sheets("Sheet2").Columns("A"), Format(myTODAY, "yyyymmdd") & "*")
    Sheets("Sheet1").Range("B8").Value = Format(myTODAY, "yyyymmdd") & "-" & Format(CNT + 1, "00")
     
End Sub
 
 

回答
投稿日時: 23/05/25 17:31:16
投稿者: WinArrow

代案2
 
ボタンを設置せずに
「B8セルに「Ctrl]+[;]で日付を入力した」
イベントで実行するマクロです。
Sheet1シートモジュールに
 

Private Sub Worksheet_Change(ByVal Target As Range)
Dim CNT As Long

    If Target.Address <> "$B$8" Then Exit Sub
    If Target.Value <> Date Then Exit Sub

    CNT = WorksheetFunction.CountIf(Sheets("Sheet2").Columns("A"), Format(Target.Value, "yyyymmdd") & "*")
    Application.EnableEvents = False
    Target.Value = CStr(Format(Target.Value, "yyyymmdd")) & "-" & Format(CNT + 1, "00")
    Application.EnableEvents = True
    
End Sub

でも、同じになります。
 

投稿日時: 23/05/25 18:18:12
投稿者: Moony

ありがとうございます。
思い通りに動きました。
 
これにて終わりにします。
ありがとうございました。