- ベストアンサー
エクセルの式に関して
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
複数列の値を対象にして、パターンマッチングするには、(エクセル関数でやるには)1つの値にまとめる、しかない。 なおかつ各列の値とその順序は保存して、作る必要がある。 意外にVBAでやるのも、複数列のデータとマッチングは、簡単にはできないと思う。小生などロジックも思いつかない。 この質問の問題は、意外にむつかしい問題だと思う。 ーー 「1つの値にまとめる」のは、 TEXTJOIN関数は2016で新設された関数のようです。 エクセル関数の質問は、エクセルのバージョンを、書かなくてもよい場合が多いが、本件はそうではない。質問にバージョンを書くこと。 それ以前なら、G列などに=B13&"/"&C13&"/"&D13&"/"&E13&"/"&F13 と入れる。 回答式も=INDEX(A13:A100,MATCH(B4&"/"&C4&"/"&D4&"/"&E4&"/"&F4,$G13:$G100,0)) 行数のF100、$G100の100は適宜修正のこと。 また入力途中ではエラーが出るが、防止のことは、今回は考慮してない。 ーー 例データ A13:F14 作成済みとする。 G列関数式は =B13&"/"&C13&"/"&D13&"/"&E13&"/"&F13 a 12 13 13 14 15 12/13/13/14/15 b 11 13 11 14 13 11/13/11/14/13 ーーー A4:F6 B-F列は入力する。 A列のA4の関数式 =INDEX(A13:A100,MATCH(B4&"/"&C4&"/"&D4&"/"&E4&"/"&F4,$G13:$G100,0)) 下方向に式を複写する。 a 12 13 13 14 15 b 11 13 11 14 13 #N/A 11 11 13 11 11
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
質問者は関心ないでしょうが、VBAなどでやれないか考えたので、後の読者のために書いてみます。 ーーー 例データ ブック名が「5列照合.xlsm」の Sheet1のA-F列に 項目 条件1 条件2 条件3 条件4 条件5 a 11 12 13 14 15 b 13 14 15 16 17 c 11 12 1 14 15 d 11 12 13 14 15 と、データを作った。 ーー B-F列のそれぞれの列の条件の値を示して、一致する行の項目名=A列の値を出そうとしている。 ーー データのあるブックとは「別ブック」の標準モジュールに Sub 複数項目照合SQL() ' ************************************************************** ' :ADO と Microsoft Jet OLE DB 4.0 プロバイダを使用して、 ' Excelシートに接続する ' ************************************************************** Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim strFilePath As String Dim strFileName As String On Error GoTo Err_Handler ' ファイルパスを指定する strFilePath = "C:\Users\XXXX\Documents\" ' ファイル名を指定する strFileName = "5列照合.xlsm" ' 面倒なのでファイルパス+ファイル名にする strFileName = strFilePath & strFileName Application.ScreenUpdating = False Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strFileName & ";" & _ "Extended Properties=""Excel 8.0;HDR=Yes;"";" MsgBox "AAA" rs.Open "SELECT 項目 FROM [Sheet1$A1:F20] WHERE 条件1=13 AND 条件2=14 AND 条件3=15 AND 条件4=16 AND 条件5=17;", cn, _ adOpenStatic, adLockOptimistic, adCmdText ' シート「Sheet1」のB2に貼り付けます。 ThisWorkbook.Sheets("Sheet2").Range("A2").CopyFromRecordset rs ' オブジェクトの破棄 rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing Application.ScreenUpdating = True Exit Sub Err_Handler: Application.ScreenUpdating = True MsgBox CStr(Err.Number) & Err.Description End Sub 実行すると、5条件に当てはまる行のA列の項目名を ThisWorkbook.Sheets("Sheet2").Range("A2")に、「b」を 指摘してくれる。 工夫すれば、5条件をその都度入力した際に、該当行があればその項目名を 返すようにできるだろう。 ーー Accessのテーブルにエクセルのシートデータをコピーして、上記のSQL文の実行かまたは「クエリの実行」でできるだろう。 すなわち、データべースソフト向けの課題だと思う。 == SQL文の中で、条件(Where句にANDを入れて)を5つ書き並べるだけなので、思いつきやすいし、すっきりしていると思った。
お礼
私にとっては少し難しい感じでしたが、いろいろと考えていただきありがとうございます。 少しずつ学んでいきたいです。
- msMike
- ベストアンサー率20% (364/1805)
添附圖參照(Excel 2019) Sheet2 に於いて、 1.式 =TEXTJOIN("/",,B2:F2) を入力したセル G2 のフィルハンドルを  ̄ ̄「エイヤッ!」とダブルクリック Sheet1 に於いて、 2.式 =TEXTJOIN("/",,B2:F2) を入力したセル G4 のフィルハンドルを  ̄ ̄「エイヤッ!」とダブルクリック 3.次式を入力したセル A4 のフィルハンドルを「エイヤッ!」とダブ  ̄ ̄ルクリック  ̄ ̄=IFERROR(INDEX(Sheet2!A$2:A$5,MATCH(G4,Sheet2!G$2:G$5,0)),"")
お礼
ありがとうございました。 私のエクセルではまだ実装されていませんでした。 今はそういうのがあるのですね。参考になりました。
お礼
ありがとうございました。 無事に解決いたしました。 ヴァージョンが以前のでしたので非常に助かりました。