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

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

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

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Q&A

4回答

1324閲覧

3つのセルに当てはまる項目が一致したら、指定の単語を入れたい。

sh444

総合スコア15

COUNT

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

0グッド

0クリップ

投稿2021/02/25 02:39

編集2021/02/25 07:01

3つのセルに当てはまる項目があれば、結果を表示させたい。
イメージ説明

A2-C8に入力されている内容が検索対象の表です。
一致表のE2-G7が検索表と一致したら、H欄の表示項目をA12に表示させていきたいです。
検索表の項目が一致表にない事もあるので、その場合は色塗りができれば分かりやすいので助かります。

ifとcountifを考えたのですが、全く分かりませんでした。
一致表は、表示項目を追加していくので範囲が広いものがいいです。
お力添えを願います。

可能であれば、vbaでコードを作っていただけると助かります。
宜しくお願いします。

追記です。
ちなみに、A12に=VLOOKUP(A3&B3&C3,$E$3:$H$7,4)を入れたのですが、A12にトイレドア補修、A13洗面所水栓交換、A14襖補修、A15襖補修になりました。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/02/25 03:10

ご自分で「どう実装したのか」と「どううまくいかないのか」を書かないと、丸投げ指摘されますよ。
1T2R3M4

2021/02/25 05:05

>vbaでコードを作っていただけると助かります。 作業依頼ですか。
guest

回答4

0

暇だったので作ってみました。これを全て貼り付けて実行下さい。
表の拡張にも対応しております。

お仕事のなかでExcelを触る機会が多くあるなら、これを機に色々VBAについて調べてみては。
プログラミング初心者にはおすすめな言語だと思います。

※本サイトでは作業の丸投げはNGですので、次回から気をつけて下さいね。

VBA

1'// 「一致表」の最後の列は必ず「表示項目」となるようにしてください 2 3 4 5Sub main() 6 Dim sh As Worksheet 7 Set sh = ThisWorkbook.ActiveSheet 8 9 10'★ここだけ変更してね=============================================================================== 11 Dim 検索表 As Range 12 Set 検索表 = sh.Range("A3:C8") '←タイトルを除いた表の範囲に応じて変更下さい 13 14 Dim 一致表 As Range 15 Set 一致表 = sh.Range("E3:H7") '←タイトルを除いた表の範囲に応じて変更下さい 16 17 Dim 結果入力開始セル As Range 18 Set 結果入力開始セル = sh.Range("A12") 19 20 21'================================================================================================== 22 23 24 25 '// 検索表リストの作成 26 Dim Searchlist As Object 27 Set Searchlist = CreateKeyList(検索表) 28 29 '//一致表リストの作成 30 Dim PrintList As Object 31 Set PrintList = CreateKeyList(一致表) 32 33 34 '// 結果表リストの作成 35 Dim ResultList As Object 36 Set ResultList = MergeList(Searchlist, PrintList) 37 38 '// 検索開始 39 Dim buf As Variant 40 Dim endrow As Long 41 endrow = sh.Cells(Rows.Count, 結果入力開始セル.Column).End(xlDown).row 42 sh.Range(sh.Cells(結果入力開始セル.row, 結果入力開始セル.Column), sh.Cells(endrow, 結果入力開始セル.Column)).Clear 43 44 '// 検索結果を排出 45 Dim cnt As Long 46 For Each buf In ResultList 47 sh.Cells(結果入力開始セル.row + cnt, 結果入力開始セル.Column) = buf 48 If buf = "入力する" Then: sh.Cells(結果入力開始セル.row + cnt, 結果入力開始セル.Column).Interior.Color = 65535 49 50 cnt = cnt + 1 51 Next 52 53 54End Sub 55 56 57'// Rangeを引数にして、行ごとにList.Addして返す 58' "トイレ|ドア|補修$トイレドア補修"といった形。 59 60Private Function CreateKeyList(arg_rng As Range) As Object 61 62 Dim lst As Object 63 Set lst = CreateObject("System.Collections.ArrayList") 64 Dim rowData As Variant 65 Dim colData As Variant 66 67 Dim keyValue As String 68 Dim printValue As String 69 For Each rowData In arg_rng.Rows 70 keyValue = "" 71 For Each colData In rowData.Columns 72 If rowData.Columns.Count = colData.Column - rowData.Columns.Count Then 73 printValue = colData.Value 74 Else 75 keyValue = keyValue & "|" & colData.Value 76 End If 77 Next 78 lst.Add (keyValue & "$" & printValue) 79 Next 80 81 Set CreateKeyList = lst 82 83End Function 84 85 86Private Function MergeList(argSList As Object, argPList As Object) As Object 87 88 Dim buf As Variant 89 Dim F As Variant 90 Dim index As Long 91 92 Dim lst As Object 93 Set lst = CreateObject("System.Collections.ArrayList") 94 95 96 For Each buf In argSList 97 index = IndexOf(argPList, buf) 98 If index < 999999 Then 99 F = Split(argPList.Item(IndexOf(argPList, buf)), "$") 100 lst.Add (F(UBound(F))) 101 Else 102 lst.Add ("入力する") 103 104 End If 105 106 Next 107 108 Set MergeList = lst 109End Function 110 111Public Function IndexOf(TargetList, element) As Variant 112 Dim x 113 Dim cnt As Long 114 cnt = 0 115 Dim flg As Boolean 116 flg = False 117 118 119 For Each x In TargetList 120 If InStr(x, element) > 0 Then 121 flg = True 122 Exit For 123 End If 124 cnt = cnt + 1 125 Next 126 127 If flg Then 128 IndexOf = cnt 129 Else 130 IndexOf = 999999 131 End If 132 133End Function 134

投稿2021/02/25 06:47

編集2021/02/25 06:50
inari_ken

総合スコア34

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

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

0

VBAを使わずExcelの式でアプローチするのも一手です。

Excel

1'I3セルに以下の式を入れる。 2=TEXTJOIN(",",TRUE,E3:G3) 3'その後セルコピーしてI4以降に貼りつける。 4 5'A12セルに以下の式を入れる。 6=IFERROR(INDEX(H:H,MATCH(TEXTJOIN(",",TRUE,A3:C3),I:I,FALSE)),"入力する") 7'その後セルコピーしてA13以降に貼りつける。

投稿2021/02/25 04:19

jinoji

総合スコア4585

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

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

sh444

2021/02/25 07:00

Excelが2010なので、TEXTJOINが使えないため、CONCATENATEを用いたのですが結果は入力するのみの表示になりました;
jinoji

2021/02/25 07:05

それぞれ、以下に置き換えれば大丈夫だと思います。 =CONCAT(E3:G3) =IFERROR(INDEX(H:H,MATCH(CONCAT(A3:C3),I:I,FALSE)),"入力する")
guest

0

私ならDictionaryを使うと思います。
一致表を行ごとに読んで辞書にする(Keyは内容&項目&対応をつなげる、Itemは表示項目)
検索表を行ごとに読んで、同じようにKeyを作り、そのKEYで辞書から探し、
見つかったらそれを書く、見つからなければその旨書く


VBA

1 2Sub sample() 3 Dim ws As Worksheet 4 Set ws = ActiveSheet 5 6 Dim dic As Scripting.Dictionary 7 Set dic = CreateObject("Scripting.Dictionary") 8 9 Dim 一致表 As Range 10 Set 一致表 = ws.Range("E1").CurrentRegion 11 With 一致表 12 Dim i, k, v 13 For i = 3 To .Rows.Count 14 k = TabJoin(.Cells(i, 1).Resize(, .Columns.Count - 1).Value) 15 v = .Cells(i, .Columns.Count).Value 16 dic.Add k, v 17 Next 18 End With 19 20 Dim 検索表 As Range 21 Set 検索表 = ws.Range("A1").CurrentRegion 22 With 検索表 23 Dim j, s, outCell As Range 24 For j = 3 To .Rows.Count 25 Set outCell = ws.Cells(.Rows.Count + j, 1) 26 27 s = TabJoin(.Rows(j).Value) 28 29 If dic.Exists(s) Then 30 outCell.Value = dic(s) 31 Else 32 outCell.Value = "入力する" 33 outCell.Interior.Color = vbYellow 34 End If 35 Next 36 ws.Cells(.Rows.Count + 2, 1).Value = "結果" 37 End With 38End Sub 39 40Function TabJoin(r) 41 With WorksheetFunction 42' TabJoin = .TextJoin(vbTab, True, r) 43 TabJoin = Join(.Transpose(.Transpose(r)), vbTab) 44 End With 45End Function

投稿2021/02/25 03:44

編集2021/02/25 07:08
jinoji

総合スコア4585

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

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

0

For文でA列を検索してA列の文字を取得
次はB列、その次はC列
3つの文字列をくっつけて表示

投稿2021/02/25 03:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問