• ベストアンサー

桁数の異なるコードを分解したい

製品のコードを分類別に表にしたいと考えています。 例えば コード     機能1 機能2 機能3 AABBCCC  AA   BB   CCC のような感じです。 しかし、あるメーカーのコードは機能部分の桁数が決まっていません。 AABCCC、ABBBCC、AABBBBCC、などのように1~4桁ぐらいの英数字で機能分けされています。 機能1や機能2に登場する組み合わせは決まっています。 まずはExcelやAccessでの表作りの検討を始めているのですが、 どのように自動化できるものでしょうか。 Officeシリーズでは無理なのでしょうか。。。 どうぞよろしくお願いします。

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

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

機能1および機能2に登場する組み合わせが決まっていて、最高4ケタまでの英数字であるとして、機能1での組み合わせがシート2のA列に、機能2での組み合わせがB列にあるとしたら次のようにしてはどうでしょう。 シート1のA1セルから下方に製品のコードがあるとしてB列に機能1を表示するためにはB1セルに次の式を入力して下方にオートフィルドラッグします。 =IF($A1="","",IF(COUNTIF(Sheet2!$A:$A,MID($A1,1,1)),MID($A1,1,1),IF(COUNTIF(Sheet2!$A:$A,MID($A1,1,2)),MID($A1,1,2),IF(COUNTIF(Sheet2!$A:$A,MID($A1,1,3)),MID($A1,1,3),IF(COUNTIF(Sheet2!$A:$A,MID($A1,1,4)),MID($A1,1,4),""))))) 機能2を表示するためにC1セルには次の式を入力して下方にオートフィルドラッグします。 =IF($A1="","",IF(COUNTIF(Sheet2!$B:$B,MID(SUBSTITUTE($A1,$B1,""),1,1)),MID(SUBSTITUTE($A1,$B1,""),1,1),IF(COUNTIF(Sheet2!$B:$B,MID(SUBSTITUTE($A1,$B1,""),1,2)),MID(SUBSTITUTE($A1,$B1,""),1,2),IF(COUNTIF(Sheet2!$B:$B,MID(SUBSTITUTE($A1,$B1,""),1,3)),MID(SUBSTITUTE($A1,$B1,""),1,3),IF(COUNTIF(Sheet2!$B:$B,MID(SUBSTITUTE($A1,$B1,""),1,4)),MID(SUBSTITUTE($A1,$B1,""),1,4),""))))) 機能3を表示するためにD1セルには次の式を入力して下方にオートフィルドラッグします。 =SUBSTITUTE(SUBSTITUTE($A1,$B1,""),$C1,"") 上記の式で$の記号はなくてもよいですね。

sarugetu
質問者

お礼

ステキです! VBAで検討していたのですが、関数だけでも対応できてしまうんですね。 最初、何をしているかわかりませんでしたが、なんとか読み解けました。 実際には、シート2のA列がコード、B列が説明(例:AAA、りんご)ですので、vlookup等と組み合わせてB列を返したいと思います。 また、無いは思いますが、ご検出防止のために、4文字→1文字の順にマッチングをかけてみたいと思います。 本当にありがとうございました!

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

メーカーさんに製品コードの中にハイフンを埋め込んで貰う訳には 行かないんでしょうね (^^ゞ Excelは未だ道半ばなのでAccessの場合で(こっちも怪しいものですが) 機能1と機能2のリストがメーカーさんから貰えれば何とかなるかも? 機能1だけでは機能2と機能3の切り分けが出来ないので不可能と思えます。 (明確なパターンがあれば別ですが) 仮に機能1と機能2のリストが貰えたとして。 機能1に関しては、Like演算とかInstrg関数などで引っ張れそうです。 機能2に関しても↑で確定できたとして、機能1の部分を検索対象外か 一時的に機能1の部分を削除したものに対して同様な処理を行えば出来るかも? 残りが機能3ですね。 ただ出来たとしても件数によっては相当に重い処理になりそうな予感が。。。 回答できるとは限りませんが、もう少し具体的な説明と例示があればねぇ・・。

すると、全ての回答が全文表示されます。
  • layy
  • ベストアンサー率23% (292/1222)
回答No.2

コードと提供リストと比較になりますが、 2ケタずつにしかなりません、でもないので、 存在チェックできる最少の次元は1ケタずつです。 双方を1ケタずつに区切って、でしょう。 値「15」を「1」「5」にする。 リストが「152」なら「1」「5」「2」です。 順次判定していって結果不一致とみなす、 「15」なら一致とみなす、そんなロジック。 基本アルゴリズムのマッチングが使えそうなのでそう難しくない。 完全一致を探す。 値「15」でリスト「152」は不一致とみなす。 せいぜい4ケタだし、どちらが長い文字列でもできる話。 それか、 instr関数がどこまで使えるか検討。

すると、全ての回答が全文表示されます。
  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.1

B2に =LEFT(A2,FIND("B",A2)-1) C2に =MID(A2,FIND("B",A2),FIND("C",A2)-FIND("B",A2)) D2に =RIGHT(A2,LEN(A2)-FIND("C",A2)+1)

sarugetu
質問者

お礼

説明不足ですみません。。。 機能部分のコードは、 実際には「15」「VY」「105」「R」などいろいろな英数字の組み合わせになります。 ただし、機能1にくるのは「15」と「A11B」と、、などとリストは提供されています。

すると、全ての回答が全文表示されます。

関連するQ&A