dポイントプレゼントキャンペーン実施中!

VBA初心者です。

昨日、複数のご教示をいただきましたが、要件の追加があり(汗)再度質問させていただきます。
(管理台帳が四半期単位の作成となるための追加要件です)

以下の要件をVBAで処理したいのです。

継続要件
・開始ボタン押下による処理開始
・区分ごとの管理番号を採番(4ケタ、0パディング)

追加要件
・区分ごとに管理番号の開始番号を変える(前期の最終番号を継承するため)
  →新規ファイルごとにメンテする予定です。
・区分が未入力の場合は管理番号列に空白を返す

例)

管理番号:A列
案件名:B列
区分:C列

管理番号 案件名 区分
---------------------------------
a0100  案件1  a
b0051  案件2  b
c0001  案件3  c
a0101  案件4  a
 案件5  
b0052  案件6  b
a0102  案件7  a
c0002  案件8  c

関数では以下の様になると思います。
(前回記載した数式をアレンジしています)

=IF(C2="a",C2&RIGHT(COUNTIF(C$2:C2,C2)+10099,4),IF(C2="b",C2&RIGHT(COUNTIF(C$2:C2,C2)+10050,4),IF(C2="c",C2&RIGHT(COUNTIF(C$2:C2,C2)+10000,4),"")))

再度、御教示よろしくお願いします。

A 回答 (2件)

こんばんは!



C列は「a,b,c」のいずれかが入るという前提です。

関数での場合はA2セルに
=IF(C2="","",C2&TEXT(50*(MATCH(C2,{"c","b","a"},0)-1)+COUNTIF(C$2:C2,C2)-IF(C2="a",1),"0000"))
という数式を入れフィルハンドルでずぃ~~~!っと下へコピーしてみてください。

今回はVBAでの方法をご希望のようですので、一例として・・・

Sub Sample1()
Dim i As Long, lastRow As Long, myVal As Variant
lastRow = Cells(Rows.Count, "B").End(xlUp).Row
If lastRow > 1 Then
Range(Cells(2, "A"), Cells(lastRow, "A")).ClearContents
End If
For i = 2 To lastRow
If Cells(i, "C") <> "" Then
myVal = WorksheetFunction.CountIf(Range(Cells(2, "C"), Cells(i, "C")), Cells(i, "C"))
Select Case Cells(i, "C")
Case "a"
Cells(i, "A") = Cells(i, "C") & Format(100 + myVal - 1, "0000")
Case "b"
Cells(i, "A") = Cells(i, "C") & Format(50 + myVal, "0000")
Case Else
Cells(i, "A") = Cells(i, "C") & Format(myVal, "0000")
End Select
End If
Next i
End Sub

といった感じでも大丈夫だとおもいますが、
わざわざVBAでやる必要はないように思えます。m(_ _)m
    • good
    • 0
この回答へのお礼

ご教示いただきありがとうございます。
VBAのコードもですが、関数に関しても勉強不足であると痛感しました。
orz
おっしゃる通り、VBAでやる必要がないことかもしれません。
大変助かります。
ありがとうございました。

お礼日時:2015/11/08 19:37

前回回答したものです。


・区分が未入力の場合は管理番号列に空白を返す
については
Sub ボタン1_Click()
For i = 2 To Range("C" & Rows.Count).End(xlUp).Row
If Range("C" & i).Value="" Then
Range("A" & i).Value =""
Else
Range("A" & i).Value = Range("C" & i).Value & Right("000" & WorksheetFunction.CountIf(Range("C2:C" & i), Range("C" & i).Value), 4)
End If
Next
End Sub
こんな感じで大丈夫かと思います。

・区分ごとに管理番号の開始番号を変える(前期の最終番号を継承するため)
  →新規ファイルごとにメンテする予定です。
これでは、データの管理の仕方が悪いです。
データは一枚のシートにひたすら縦方向に入力していく
必要に応じて、ある期間のデータを別シート、或いは 別ファイルに抽出するようにする。
こちらの方が良いです(普通です)

今回のコードでも、実行すると2行目から最終行まで再度、管理番号が入ることになりますが
本来であれば、C列(区分)を入力したら、その都度
その行に管理番号が自動で入る仕組みの方が良いと思います。
    • good
    • 1
この回答へのお礼

重ね重ね御教示いただきありがとうございます。
データ管理や採番の仕組みなど、ご指摘の通りだと今更ながらに思いました。
特にDBの観点すると、おっしゃる通りと赤面しています。
ありがとうございました。

お礼日時:2015/11/08 15:23

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