Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 11 Pro : Microsoft 365)
連番付与
投稿日時: 25/07/25 06:28:10
投稿者: Pikumin

お世話になります。
 
既に登録済みのマスターにお客様コードが存在する場合、連番を付与したいです。
 
連番はルールは、
10から採番を開始し、19まで採番した後は、1Aから1Zまで採番します。
1Zまで採番した後は、20から29まで採番、次は2A-2Zまで採番していきたいです。
30-3Z・・・と続きますが、9Zまで採番した後は、A0-AZ、B0-BZ・・・と採番します。
ただし、Y0-YZ、Z0-ZZまでは使用できません。
XZまで採番した後は、お客様コードを新たに発番したいです。
 
例)
お客様コード A00001  連番 XZまで採番した後は、
       A00002  連番 10を採番したいです。
 
マスターは
A列:お客様コード
B列:枝番
で構成されています。
 
関数でできるのか、VBAがいいのかわからず、
こちらに投稿しました。
 
よろしくお願いします。

回答
投稿日時: 25/07/25 10:05:12
投稿者: sk

引用:
Microsoft 365

引用:
連番はルールは、
10から採番を開始し、19まで採番した後は、1Aから1Zまで採番します。
1Zまで採番した後は、20から29まで採番、次は2A-2Zまで採番していきたいです。
30-3Z・・・と続きますが、9Zまで採番した後は、A0-AZ、B0-BZ・・・と採番します。
ただし、Y0-YZ、Z0-ZZまでは使用できません。

1. 以下の数式を B1 セルに設定する。
 
-------------------------------------------------------------------------
 
=LET(IndexInGroup,COUNTIF(A$1:A1,A1)-1,CorrectIndex,MOD(IndexInGroup,1188),BASE(CorrectIndex+36,36))
 
-------------------------------------------------------------------------
 
2. B1 セルの数式を B2 セル以下の最後のデータ行までコピーする。
 
VBA で行いたい場合は、同様のアルゴリズムに落とし込めばよいでしょう。
 
引用:
XZまで採番した後は、お客様コードを新たに発番したいです。

上記に関しては、[お客様コード]のコード体系や「新しいコード」の採番規則が
不明であるため、現時点では回答のしようがありません。

投稿日時: 25/07/25 11:41:10
投稿者: Pikumin

skさん ありがとうございます。
 

引用:
=LET(IndexInGroup,COUNTIF(A$1:A1,A1)-1,CorrectIndex,MOD(IndexInGroup,1188),BASE(CorrectIndex+36,36))

 
MOD関数の1188がどういった意味合いかを教えていただけますか。
理解できてなくて申し訳ございません。
 
[quote][お客様コード]のコード体系や「新しいコード」の採番規則が
 
マスターに登録されているコードの続き番号を採番したいです。
数値データでした(例で文字を使ってしまいすみません)
 
 
マスター登録
000001
000002
000003
 :
 :
000018
 
新規でマスターがどんどん追加されているのですが、
同じ客先で支店、営業所が違う場合は、既存のお客様コードを使用し、枝番のみ発番になります。
その際、枝番がXZまで採番されてた場合は、マスター登録されているお客様コードの最終番号+1に
枝番10から採番したいです。
 

お客様コード:000004の支店、営業所を登録する際に、00004-XZまで採番した後、
       000019-10を採番したいです。
 
事前に詳細なことがお伝えできておらずすみません。
よろしくお願いします。

回答
投稿日時: 25/07/25 12:37:53
投稿者: Suzu

skさん そう来ましたか!
BASE関数で、36進数表示すれば 0-Z の連番を使えるか。。
気づかせてくれてありがとうございました。
 
 
1188 は、10〜XZ までの個数。
=DECIMAL(10,36) で、36が返り
=DECIMAL(XZ,36)で、1123が返ります。
 
これらから、お客様コードが持てる最大数は、1123-35 = 1188 個
(これを超えたとき、お客様コードが変わる)
 
-----------------------------------------------------
以下、今から運用なのであれば。。。参考に
 
お客様コードが変わるなんてな事するくらいなら、
枝番を 3文字にした方が・・・と思ってしまいます・・
 
36進で、コンピューターだけなら良いのですけど
手書処理がある場合、0-O-C、1-l、5-S、V-U 絶対に間違います。
 
それを、考慮するとなると、16進数の方が良いと思います。

投稿日時: 25/07/25 13:40:52
投稿者: Pikumin

Suzuさん
 
ありがとうございます。

引用:
1188 は、10〜XZ までの個数。
=DECIMAL(10,36) で、36が返り
=DECIMAL(XZ,36)で、1123が返ります。
  
これらから、お客様コードが持てる最大数は、1123-35 = 1188 個
(これを超えたとき、お客様コードが変わる)

そういうことなんですね。
 
 
引用:
以下、今から運用なのであれば。。。参考に

ありがとうございます。
すでに運用されてて、加えてシステムへの切り替えのため、
枝番も2桁しかもてない。という制約があるようなんです。
 
2回目の投稿に追記で、マスターには、
お客様コードと枝番が登録されています。記載漏れしています。
 
登録済みマスター
お客様コード 枝番
000001    10
000001    11
000001    12
000001    13
000001    14
000001    15
000002 10
000003 10
000004 10
 :
 :
000018 A8
 

お客様コード:000004の支店、営業所を登録する際に、00004-11から採番し、
       00004-XZまで採番した後、000019-10を採番したいです。
 
まとめきれず小出しになってしまいました。
申し訳ございません。
よろしくお願いいたします。

回答
投稿日時: 25/07/25 14:05:14
投稿者: Suzu

skさんからは
 
A列の値を入力数として、B列の値を出す関数が提示されています。
 
いま、A列の値も欲しいとの事ですが、入力も出力も A列は 循環参照となります。
少なくとも関数では、ダメでしょう。
 
 
となれば、
・どこのどんな入力値
・どこに
・どんな契機で
 
を考えないといけません。
 
 

引用:
マスター登録されているお客様コードの最終番号+1

に関しては、たいして難しくないですよね?
 
ご自身でかんがえてみましょう。

回答
投稿日時: 25/07/25 17:16:58
投稿者: sk

引用:
MOD関数の1188がどういった意味合いかを教えていただけますか。

Suzu さんが補足して下さった通りです。
 
MOD 関数を使用したのは、"XZ" の次の番号を "Y0" とせず
再び "10" に戻して循環させるためです。
 
引用:
[お客様コード]のコード体系

引用:
数値データでした

引用:
その際、枝番がXZまで採番されてた場合は、マスター登録されているお客様コードの最終番号+1に
枝番10から採番したいです。

上記の処理を実行させたいのは、どのような状況下において、
(どのセル範囲に対して)どのような操作が行なわれた時でしょうか。
 
引用:
マスターには、
お客様コードと枝番が登録されています

「登録済みのお客様情報に対しては何もしなくてよい(既に決定された
[お客様コード]や[枝番]をマクロなどによって勝手に振り直してはいけない)」
ということでしょうか。
 
引用:

お客様コード:000004の支店、営業所を登録する際に、00004-XZまで採番した後、
       000019-10を採番したいです。

少なくとも、元々のコードとはまるっきり異なるコードを割り振ってしまうと、
その両者が同じ客先を示しているかどうかを判別することが非常に困難となる恐れがあります。
 
その点についてはとりあえず無視しても問題ないのでしょうか。

トピックに返信