質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%

Q&A

解決済

3回答

1177閲覧

Excel関数で略称と対応するものに並び替えたいです

退会済みユーザー

退会済みユーザー

総合スコア0

0グッド

0クリップ

投稿2020/07/20 15:26

編集2020/07/20 15:29

イメージ説明

B列の会社略称をもとにF列の請求書(順不同となっているもの)を並び替えC列に入るようにしたいです。
よろしくお願いいたします。

※1 会社略称は2~3文字の英字となっております。(画像の通り「AB」、「ABC」のような略称が付く場合がございます。)
※2 請求書は「(0文字以上の任意文字)会社略称(0文字以上の任意文字)請求書」となっております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2020/07/21 00:28

ワークシート関数では制約が多くtosiさんの回答にあるような問題点の解消が難しい可能性があります。マクロの使用も視野にいれた方がいいと思いますが、その点についてはどうでしょうか?
退会済みユーザー

退会済みユーザー

2020/07/21 11:38

誠に申し訳ございません 自身の実行例の掲載を失念しておりました。 修正の件、ご指摘ありがとうございます。 いただいた回答で実現したい内容はできましたので、そちらをベストアンサーとさせていただきます。
guest

回答3

0

そもそもの会社略称のつけ方と、並びが統一されていない請求書名のつけ方に問題アリと思います。
請求書名を (略称)_(文字列)請求書 みたいな形で統一ルール化すべきです。

あとは、この手の処理は 関数に正規表現が使えるGoogleスプレッドシートの方がやりやすいんですが、どーしてもExcel関数でやるなら

・作業列が必要
・会社略称以外に**英数字(半角文字)**を含まない & 100文字以内

という前提を用意した上で、Ctrl+shift+Enterでおなじみの配列数式を使えば対応できるかなと。

  1. 横並びにA~Zを入力したセルを用意 (仮に K1:AI1 とする)
  2. E列に請求書名から英字部分を抜き出す為に、E3に以下の式を入れる({}の部分はCtrl+shift+Enterすると自動で付きます)E3を下にオートフィル
  3. あとはC3にVLOOKUP入れて下にオートフィル
//こちらは ABAのようなケースで不具合がでるので下に変更 {=MID(F3,MIN(IFERROR(FIND($K$1:$AI$1,F3),1000)),MAX(IFERROR(FIND($K$1:$AI$1,F3),0))-MIN(IFERROR(FIND($K$1:$AI$1,F3),1000))+1)}

↓修正版 E3の式

{=LEFT(MID(F3,MIN(IFERROR(FIND($K$1:$AI$1,F3),1000)),100),LENB(JIS(MID(F3,MIN(IFERROR(FIND($K$1:$AI$1,F3),1000)),100)))-LENB(MID(F3,MIN(IFERROR(FIND($K$1:$AI$1,F3),1000)),100)))}

C3の式

=VLOOKUP(B3,$E$3:$F$7,2,FALSE)

英字が小文字も含むならFINDじゃなくて SEARCH に変えてください。

■参考 Findで複数条件指定を行う方法
https://excelkamiwaza.com/find_hukusuu.html

【追記・修正】
失礼しました。最初の回答の方法だと ABAや BACBみたいな 同じアルファベットが繰り返し登場する際に不具合が出るので、修正しました。

■参考 英字(数字)と日本語を分ける
https://excel-forest.net/2016/07/12/eisuujiwake/

投稿2020/07/21 01:27

編集2020/07/21 02:16
sawa

総合スコア3002

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

下記条件で対応しています。
・作業セルの使用
・略称以外の英字不使用

E3以下

Excel

1=MID(F3,SUMPRODUCT(ROW(OFFSET(INDIRECT("Z1"),,,LEN(F3)))*ISNUMBER(FIND(MID(LOWER(ASC(F3)),ROW(OFFSET(INDIRECT("Z1"),,,LEN(F3))),1),"abcdefghijklmnopqrstuvwxyz"))* 2ISERROR(FIND(MID(" "&LOWER(ASC(F3)),ROW(OFFSET(INDIRECT("Z1"),,,LEN(F3))),1),"abcdefghijklmnopqrstuvwxyz"))),SUMPRODUCT(ISNUMBER(FIND(MID(LOWER(ASC(F3)),ROW(OFFSET(INDIRECT("Z1"),,,LEN(F3))),1),"abcdefghijklmnopqrstuvwxyz"))*1))

C3以下

Excel

1=IF(SUMPRODUCT(EXACT(B3,E:E)*ROW(E:E))=0,"",INDEX(F:F,SUMPRODUCT(EXACT(B3,E:E)*ROW(E:E))))

大文字小文字は分けて判断されます。
E3以下の数式は拾い物です。
リンク内容

投稿2020/07/21 00:32

編集2020/07/21 02:44
radames1000

総合スコア1925

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2020/07/21 01:40

"ABC"限定処理はちょっとあれなので低評価です。
radames1000

2020/07/21 05:38 編集

確かにちょっとあれですよね。失礼しました。
guest

0

セルC3へこちらの関数式をコピペして、後のセルへもこのC3セルを複写して見て下さい。
=VLOOKUP(""&B4&"",$F$3:$F$7,1,FALSE)
(追記)
ユーザー関数も作成して見ました。
標準モジュールへ張り付けて、C3へ関数「=GetSeikyuName(B3,$B$3:$B$7,$F$3:$F$7)」を張り付け。
後はセル複写で行くかと思います。

VBA

1'(Test_Sample_Miniature) 2Option Explicit 3Function GetSeikyuName(ByRef Target As Range, ByRef Data As Range, ByRef Master As Range) As String 4 Application.Volatile 5 Dim strTarget As String 6 Dim strCoi3 As String 7 Dim varDataArray As Variant 8 Dim varMastArray As Variant 9 Dim lX As Long 10 ' 11 GetSeikyuName = "" 12 strTarget = Target.Parent.Cells(Target.Row, Target.Column) 13 strCoi3 = "" 14 varDataArray = Data.Value 15 varMastArray = Master.Value 16 ' 17 strTarget = Target.Value 18 If Len(strTarget) <= 2 Then 19 For lX = 1 To UBound(varDataArray, 1) 20 If InStr(CStr(varDataArray(lX, 1)), strTarget) <> 0 Then 21 If Len(CStr(varDataArray(lX, 1))) = 3 Then 22 strCoi3 = CStr(varDataArray(lX, 1)) 23 Exit For 24 End If 25 End If 26 Next 27 End If 28 ' 29 For lX = 1 To UBound(varMastArray, 1) 30 If InStr(CStr(varMastArray(lX, 1)), strTarget) > 0 Then 31 If strCoi3 = "" Then 32 GetSeikyuName = CStr(varMastArray(lX, 1)) 33 Exit For 34 Else 35 If InStr(CStr(varMastArray(lX, 1)), strCoi3) = 0 Then 36 GetSeikyuName = CStr(varMastArray(lX, 1)) 37 Exit For 38 End If 39 End If 40 End If 41 Next 42End Function

投稿2020/07/20 23:13

編集2020/07/21 04:32
tosi

総合スコア553

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/20 23:47

tosiさん、ご回答ありがとうございます! いただいた関数を試してみたのですが、 「えええABCおお請求書」が「いいいAB請求書」より上にある場合、 C3は「えええABCおお請求書」になってしまうようです。。
tosi

2020/07/21 01:13 編集

なるほど。 3文字比較で一致確認→2文字比較で一致確認という手順を盛り込まないとダメですね。 VBA(マクロ)を使ったユーザー関数では出来そうです。 また、データベース関数でも可能かもしれません。(データベース関数は得意ではありません) ユーザー関数以外の通常関数でやるとしたら私の力量不足の為無理です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問