B列の会社略称をもとにF列の請求書(順不同となっているもの)を並び替えC列に入るようにしたいです。
よろしくお願いいたします。
※1 会社略称は2~3文字の英字となっております。(画像の通り「AB」、「ABC」のような略称が付く場合がございます。)
※2 請求書は「(0文字以上の任意文字)会社略称(0文字以上の任意文字)請求書」となっております。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/07/21 11:38
回答3件
0
そもそもの会社略称のつけ方と、並びが統一されていない請求書名のつけ方に問題アリと思います。
請求書名を (略称)_(文字列)請求書 みたいな形で統一ルール化すべきです。
あとは、この手の処理は 関数に正規表現が使えるGoogleスプレッドシートの方がやりやすいんですが、どーしてもExcel関数でやるなら
・作業列が必要
・会社略称以外に**英数字(半角文字)**を含まない & 100文字以内
という前提を用意した上で、Ctrl+shift+Enterでおなじみの配列数式を使えば対応できるかなと。
- 横並びにA~Zを入力したセルを用意 (仮に K1:AI1 とする)
- E列に請求書名から英字部分を抜き出す為に、E3に以下の式を入れる({}の部分はCtrl+shift+Enterすると自動で付きます)E3を下にオートフィル
- あとは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総合スコア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総合スコア1925
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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総合スコア553
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/07/20 23:47
2020/07/21 01:13 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
関連した質問
Excel関数で略称と対応するものに並び替えたいです