■実現したいことは以下になります。
・手順②(画像1)で指定したファイル(比較一覧表.xls)の中にあるタイプ一覧項目(画像3)を
手順③で必要なタイプ一覧だけにチェックし、その中でランク付けし、黄色枠にも結果を表示させたい
■分からないこと
・チェックボックスにチェックを入れた後、
ファイル(比較一覧表.xls)の中にあるタイプ一覧項目をどうやってチェックし、
手順①の緑枠Sampleデータと比較一覧表ファイルのSampleデータを比較しているか分からないです。
■前提
・今までは、タイプ一覧項目を作らずに手順①の緑枠(画像1)のSampleデータと
手順②のSampleデータを比べてランク付けをしました。
画像が以下になります。
データ比較シートの緑枠(画像1)のSampleデータと手順②のSampleデータを絶対値の差で比較しました。
差を出した後、P2~V16でRANK関数で点数評価し、合計が一番少ないのがランク上位に表示させています。
i2=ABS(B2-I$1)
:(略)
o16=ABS(H16-O$1)
P2:=RANK(I2,I$2:I$16,1)
:(略)
V16:=RANK(O16,O$2:O$16,1)
W2=SUM(P2:V2)
:(略)
W16=SUM(P16:V16)
コードが以下になります。
VBA
1'手順④の比較開始ボタンです。 2'押下すると、手順①の緑枠のデータと画像3が比較されランク付けされ上位7が表示されます。 3Private Sub HikakuButton_Click() 4 Dim wbk As Workbook 5 Dim i As Long 6 Dim wshCmp As Worksheet 7 Dim wshOrd As Worksheet 8 9 Set wshCmp = Worksheets("データ比較") 10 Set wshOrd = Worksheets("順位付け") 11 12 Set wbk = Workbooks.Open(wshCmp.Range("C15").Value, ReadOnly:=True) 13 For i = 1 To 3 14 wbk.Worksheets(i & "_比較一覧").Range("A4:H8").Copy wshOrd.Range("A" & i * 5 - 3) 15 Next i 16 wbk.Close SaveChanges:=False: Set wbk = Nothing 17 18 wshOrd.Range("i1").Value = wshCmp.Range("C10") 19 wshOrd.Range("J1").Value = wshCmp.Range("E10") 20 wshOrd.Range("K1").Value = wshCmp.Range("G10") 21 wshOrd.Range("L1").Value = wshCmp.Range("C11") 22 wshOrd.Range("M1").Value = wshCmp.Range("E11") 23 wshOrd.Range("N1").Value = wshCmp.Range("G11") 24 wshOrd.Range("o1").Value = wshCmp.Range("i11") 25 26 With wshOrd.Sort 27 .SortFields.Clear 28 .SortFields.Add Key:=Range("W2:W16") 29 .SetRange Range("A2:W16") 30 .Apply 31 End With 32 33 wshOrd.Range("A2:H8").Copy wshCmp.Range("A31") 34 35 Set wshOrd = Nothing 36 Set wshCmp = Nothing 37 38End Sub
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/16 13:46
回答4件
0
動作確認お願いします。
###[データ比較]シートのコントロール設定
- [abc_1]チェックボックス
ActiveXのチェックボックスで作成
(オブジェクト名)=chkTypeList1
- [abc_2]チェックボックス
ActiveXのチェックボックスで作成
(オブジェクト名)=chkTypeList2
- [def_1]チェックボックス
ActiveXのチェックボックスで作成
(オブジェクト名)=chkTypeList3
- [def_2]チェックボックス
ActiveXのチェックボックスで作成
(オブジェクト名)=chkTypeList4
- [比較開始]ボタン
ActiveXのボタンで作成
(オブジェクト名)=btnComparisonStart
※フォームコントロールではないので注意してください。
###VBAコード群
データ比較シートに記載
VBA
1Private Sub btnComparisonStart_Click() 2'------------------------------------------------------------------------------- 3' btnComparisonStart_Click 4' 説明 5' 比較開始ボタン クリック時 6'------------------------------------------------------------------------------- 7 Call StartComparison 8 9End Sub
標準モジュールに記載
VBA
1Public Sub StartComparison() 2'------------------------------------------------------------------------------- 3' StartComparison 4' 説明 5' 比較開始 6'------------------------------------------------------------------------------- 7 8 Dim wsDataCmp As Worksheet ' データ比較シート 9 Dim wsRank As Worksheet ' 順位付けシート 10 Dim appCmp As Excel.Application 11 Dim wbCmp As Workbook ' 比較一覧表.xls ブック 12 Dim wsCmp As Worksheet ' _比較一覧シート 13 Dim rngCells As Range ' セル範囲 14 Dim strXLSPath As String ' 比較一覧表.xlsのパス 15 Dim intIndex As Integer ' インデックス 16 Dim strTypeList() As String ' タイプ一覧 17 Dim intTypeIndex As Integer ' タイプ一覧インデックス 18 Dim objOLE As OLEObject ' OLEオブジェクト(コントロール) 19 Dim lngGetRowIndex As Long ' 取得行位置 20 Dim lngGetRowMax As Long ' 取得行位置最大 21 Dim lngGetColIndex As Long ' 取得列位置 22 Dim lngSetRowIndex As Long ' 設定行位置 23 Dim lngSetColIndex As Long ' 設定列位置 24 Dim varValue As Variant ' 値等 25 Dim blnIsCopy As Boolean ' コピー判定 26 Dim strFormula As String ' 数式 27 28On Error GoTo StartComparison_Err: 29 30 '----- 各シートの参照設定 31 Set wsDataCmp = Application.ActiveWorkbook.Worksheets("データ比較") 32 Set wsRank = Application.ActiveWorkbook.Worksheets("順位付け") 33 34 '----- チェックボックスがOnのタイプ一覧の検索値取得 35 intTypeIndex = -1 36 For Each objOLE In wsDataCmp.OLEObjects 37 '----- OLEオブジェクト(コントロール)の名前が"chkTypeList"で始まる場合 38 If objOLE.Name Like "chkTypeList*" Then 39 '----- チェックボックスがOnの場合 40 If objOLE.Object.Value = True Then 41 '----- チェックボックスのラベルの値(検索値)をタイプ一覧に登録 42 intTypeIndex = intTypeIndex + 1 43 ReDim Preserve strTypeList(0 To intTypeIndex) 44 strTypeList(intTypeIndex) = objOLE.Object.Caption 45 End If 46 End If 47 Next objOLE 48 49 '----- 1.「自動比較ツール.xlsm」の[データ比較]シートの上位7行をクリアする。 50 wsDataCmp.Range("A31:I37").ClearContents 51 52 '----- 2.「自動比較ツール.xlsm」の[順位付け]シートをクリアする。 53 Set rngCells = wsRank.UsedRange 54 rngCells.ClearContents 55 rngCells.Cells(1, 1).Value = "No." 56 rngCells.Cells(1, 2).Value = "A Sample" 57 rngCells.Cells(1, 3).Value = "B Sample" 58 rngCells.Cells(1, 4).Value = "C Sample" 59 rngCells.Cells(1, 5).Value = "D Sample" 60 rngCells.Cells(1, 6).Value = "E Sample" 61 rngCells.Cells(1, 7).Value = "F Sample" 62 rngCells.Cells(1, 8).Value = "G Sample" 63 rngCells.Cells(1, 9).Value = "タイプ一覧" 64 65 '----- 3. 格納先セルにあるフルパスから「比較一覧表.xls」を開く 66 strXLSPath = wsDataCmp.Range("C15").Value ' 比較一覧表.xlsのパス 67 Set appCmp = New Excel.Application 68 Set wbCmp = appCmp.Workbooks.Open(strXLSPath, ReadOnly:=True) 69 70 '----- 4.「比較一覧表.xls」の中には[1_比較一覧][2_比較一覧][3_比較一覧]シートが存在する 71 lngSetRowIndex = 1 ' 設定行位置 72 lngSetColIndex = 1 ' 設定列位置 73 For intIndex = 1 To wbCmp.Sheets.Count 74 If wbCmp.Sheets(intIndex).Name Like "*_比較一覧" Then 75 Set wsCmp = wbCmp.Sheets(intIndex) 76 '----- 5. 各シートの比較一覧表からタイプ一覧のチェックボックスで選択された値のみ抽出し、 77 ' 「自動比較ツール.xlsm」の[順位付け]シートに2行目からコピーする。 78 For lngGetRowIndex = 4 To wsCmp.UsedRange.Rows.Count 79 '----- 対象行取得 80 varValue = wsCmp.Range(wsCmp.Cells(lngGetRowIndex, 1), wsCmp.Cells(lngGetRowIndex, 9)).Value 81 82 '----- 行終了の判断はNo.セルに値が無かったらとする。 83 if Isnull(varValue(0)) or len(varValue(0)) = 0 Then Exit For 84 85 '----- タイプ一覧によるコピー判定 86 blnIsCopy = False 87 If (Not strTypeList) = True Then 88 '----- チェックボックスがすべてOffの場合 89 blnIsCopy = True 90 Else 91 '----- タイプ一覧による絞り込みがある場合 92 For intTypeIndex = 0 To UBound(strTypeList) 93 If varValue(1, 9) = strTypeList(intTypeIndex) Then 94 blnIsCopy = True 95 Exit For 96 End If 97 Next intTypeIndex 98 End If 99 100 '----- 行コピー判定 101 If blnIsCopy = True Then 102 '----- コピー先範囲取得 103 lngSetRowIndex = lngSetRowIndex + 1 ' 設定行位置 104 Set rngCells = wsRank.Range(wsRank.Cells(lngSetRowIndex, 1), wsRank.Cells(lngSetRowIndex, 9)) 105 106 '----- 値のコピー 107 rngCells.Value = varValue 108 109 '----- 書式設定 110 rngCells.Columns(2).NumberFormatLocal = "0.00000" 'B列 111 rngCells.Columns(3).NumberFormatLocal = "0.00000" 'C列 112 rngCells.Columns(4).NumberFormatLocal = "0.00000" 'D列 113 rngCells.Columns(5).NumberFormatLocal = "0.00000" 'E列 114 rngCells.Columns(6).NumberFormatLocal = "0.00000" 'F列 115 rngCells.Columns(7).NumberFormatLocal = "0.00000" 'G列 116 rngCells.Columns(8).NumberFormatLocal = "0.00000" 'H列 117 118 End If 119 120 Next lngGetRowIndex 121 122 End If 123 Next intIndex 124 lngGetRowMax = lngSetRowIndex 125 126 '----- 6. コピー処理を3シート分行ったら「比較一覧表.xls」を閉じる 127 Call CloseExcel(appCmp, wbCmp) ' 比較一覧表.xls ブック 128 129 '----- 7.「自動比較ツール.xlsm」の[順位付け]シートに[データ比較]シートの比較元の値を設定する。 130 wsRank.Range("J1").Value = wsDataCmp.Range("C10").Value 131 wsRank.Range("K1").Value = wsDataCmp.Range("E10").Value 132 wsRank.Range("L1").Value = wsDataCmp.Range("G10").Value 133 wsRank.Range("M1").Value = wsDataCmp.Range("C11").Value 134 wsRank.Range("N1").Value = wsDataCmp.Range("E11").Value 135 wsRank.Range("O1").Value = wsDataCmp.Range("G11").Value 136 wsRank.Range("P1").Value = wsDataCmp.Range("I11").Value 137 138 '----- 8.「自動比較ツール.xlsm」の[順位付け]シートに計算式を設定する。 139 For lngGetRowIndex = 2 To lngGetRowMax 140 For lngGetColIndex = 10 To 24 141 Select Case lngGetColIndex 142 Case 10 To 16 143 '----- ABS 144 strFormula = "=ABS(" & Chr(lngGetColIndex + 56) & lngGetRowIndex & "-" & Chr(lngGetColIndex + 64) & "$1)" 145 Case 17 To 23 146 '----- RANK 147 strFormula = "=RANK(" & Chr(lngGetColIndex + 57) & lngGetRowIndex & "," & Chr(lngGetColIndex + 57) & "$2:" & Chr(lngGetColIndex + 57) & "$" & lngGetRowMax & ",1)" 148 Case 24 149 '----- SUM 150 strFormula = "=SUM(P" & lngGetRowIndex & ":V" & lngGetRowIndex & ")" 151 End Select 152 '----- 数式設定 153 wsRank.Cells(lngGetRowIndex, lngGetColIndex).Formula = strFormula 154 Next lngGetColIndex 155 Next lngGetRowIndex 156 157 '----- 9. 「自動比較ツール.xlsm」の[順位付け]シートを2行目からW列を昇順で並び替える 158 wsRank.Sort.SortFields.Clear 159 wsRank.Sort.SortFields.Add Key:=Range("X2:X" & lngGetRowMax & ""), _ 160 SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 161 With wsRank.Sort 162 .SetRange Range("A2:X" & lngGetRowMax & "") 163 .Header = xlGuess 164 .MatchCase = False 165 .Orientation = xlTopToBottom 166 .SortMethod = xlPinYin 167 .Apply 168 End With 169 170 '----- 10.「自動比較ツール.xlsm」の[順位付け]シート上位7行の内容を[データ比較]シートにコピーする 171 wsDataCmp.Range(wsDataCmp.Cells(31, 1), wsDataCmp.Cells(37, 9)).Value = wsRank.Range(wsRank.Cells(2, 1), wsRank.Cells(8, 9)).Value 172 173 Call MsgBox("比較処理が完了しました。", vbOKOnly + vbInformation, "自動比較ツール") 174 175StartComparison_End: 176On Error Resume Next 177 178 '----- 終了処理 179 Set wsDataCmp = Nothing ' データ比較シート 180 Set wsRank = Nothing ' 順位付けシート 181 Set wsCmp = Nothing ' _比較一覧シート 182 Call CloseExcel(appCmp, wbCmp) ' 比較一覧表.xls ブック 183 184Exit Sub 185 186'----- エラー処理 187StartComparison_Err: 188 Call MsgBox("ErrNo:" & Err & vbNewLine & Error, vbOKOnly + vbCritical, "StartComparison") 189Resume StartComparison_End: 190End Sub 191 192Private Sub CloseExcel(ByRef app As Excel.Application, ByRef wb As Workbook) 193'------------------------------------------------------------------------------- 194' CloseExcel 195' 説明 196' Excelを閉じる(SAVEなし) 197' パラメータ 198' app : Excelアプリケーション 199' wb : ワークブック 200'------------------------------------------------------------------------------- 201 202On Error GoTo CloseExcel_Err: 203 204 '----- ブックを閉じる 205 If Not wb Is Nothing Then 206 Set app = wb.Application 207 app.DisplayAlerts = False 208 Call wb.Close 209 app.DisplayAlerts = True 210 Set wb = Nothing 211 End If 212 213 '----- Excelを閉じる 214 If Not app Is Nothing Then 215 app.Quit 216 Set app = Nothing 217 End If 218 219CloseExcel_End: 220On Error Resume Next 221Exit Sub 222 223'----- エラー処理 224CloseExcel_Err: 225 Call MsgBox("ErrNo:" & Err & vbNewLine & Error, vbOKOnly + vbCritical, "CloseExcel") 226Resume CloseExcel_End: 227End Sub
投稿2020/09/16 20:27
編集2020/09/17 04:40総合スコア2506
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/17 13:41
2020/09/17 13:58
2020/09/17 14:21
0
ベストアンサー
プロシジャの最後の方で、[順位付け]シートの値を[データ比較]シートへコピーする際に、フィルターを使用してはいかがでしょうか。
なお、
(1) チェックボックスは、フォームコントロールのチェックボックスとし、名前は、CheckBox1, CheckBox2, CheckBox3, CheckBox4としました。
(2) チェックボックスのテキスト(Caption)をそれぞれ、abc_1, abc_2, def_1, def_2としました。
(3) [順位付け]シートのI列を「タイプ一覧」の列として挿入しました。よって、それ以降の列が右に1列ずれます。
VBA
1Private Sub HikakuButton_Click() 2 Dim wbk As Workbook 3 Dim i As Long 4 Dim wshCmp As Worksheet 5 Dim wshOrd As Worksheet 6 7 Set wshCmp = Worksheets("データ比較") 8 Set wshOrd = Worksheets("順位付け") 9 10 Set wbk = Workbooks.Open(wshCmp.Range("C15").Value, ReadOnly:=True) 11 For i = 1 To 3 12 wbk.Worksheets(i & "_比較一覧").Range("A4:i8").Copy wshOrd.Range("A" & i * 5 - 3) 13 Next i 14 wbk.Close SaveChanges:=False: Set wbk = Nothing 15 16 wshOrd.Range("J1").Value = wshCmp.Range("C10") 17 wshOrd.Range("K1").Value = wshCmp.Range("E10") 18 wshOrd.Range("L1").Value = wshCmp.Range("G10") 19 wshOrd.Range("M1").Value = wshCmp.Range("C11") 20 wshOrd.Range("N1").Value = wshCmp.Range("E11") 21 wshOrd.Range("o1").Value = wshCmp.Range("G11") 22 wshOrd.Range("P1").Value = wshCmp.Range("i11") 23 24 wshOrd.Range("A1").AutoFilter 25 With wshOrd.Sort 26 .SortFields.Clear 27 .SortFields.Add Key:=Range("X2:X16") 28 .SetRange Range("A2:X16") 29 .Apply 30 End With 31 32 Dim strCriteria() As String 33 Dim j As Long 34 j = -1 35 For i = 1 To 4 36 If wshCmp.CheckBoxes("CheckBox" & i).Value = xlOn Then 37 j = j + 1 38 ReDim Preserve strCriteria(j) 39 strCriteria(j) = wshCmp.CheckBoxes("CheckBox" & i).Caption 40 End If 41 Next i 42 43 If j >= 0 Then 44 wshOrd.Range("A1:i16").AutoFilter Field:=9, Criteria1:=strCriteria, Operator:=xlFilterValues 45 End If 46 47 wshOrd.Range("A30:i45").ClearContents 48 wshOrd.Range("A1").CurrentRegion.Resize(, 9).Copy wshOrd.Range("A30") 49 wshCmp.Range("A31:i37").Value = wshOrd.Range("A31:i37").Value 50 wshOrd.Range("A30:i45").ClearContents 51 wshOrd.Range("A30:i45").ClearFormats 52 53 Set wshOrd = Nothing 54 Set wshCmp = Nothing 55 56End Sub
投稿2020/09/16 03:57
編集2020/09/17 14:06総合スコア314
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/16 13:56
2020/09/16 13:58
2020/09/16 14:11
2020/09/16 18:59
2020/09/16 19:13
2020/09/17 13:11
2020/09/17 13:30
2020/09/17 13:37 編集
2020/09/17 13:44
2020/09/17 14:07
2020/09/17 15:00
0
一回まとめました。
この処理手順で問題ありませんか?
ファイル構成
-
自動比較ツール.xlsm
処理実行用ファイル
[データ比較]シート
処理を行うためのシート
[順位付け]シート
比較データの順位付けを行うためのシート -
比較一覧表.xls
データが格納されているファイル
[1_比較一覧]シート
比較対象となるデータが記載されている(n行)
[2_比較一覧]シート
比較対象となるデータが記載されている(n行)
[3_比較一覧]シート
比較対象となるデータが記載されている(n行)
実行までの工程
1.自動比較ツール.xlsmの[データ比較]シートのオレンジおよび緑の項目に比較元となる値を設定
2.格納先に「比較一覧表.xls」のフルパスを指定
3.タイプ一覧のチェックボックスで比較一覧表の対象行を選択する
4.「比較開始」ボタンを押下するとメインの処理が動く
メインの処理
1.「自動比較ツール.xlsm」の[データ比較]シートの上位7行をクリアする。
2.「自動比較ツール.xlsm」の[順位付け]シートをクリアする。
3.格納先セルにあるフルパスから「比較一覧表.xls」を開く
4.「比較一覧表.xls」の中には[1_比較一覧][2_比較一覧][3_比較一覧]シートが存在する
5.各シートの比較一覧表からタイプ一覧のチェックボックスで選択された値のみ抽出し、
「自動比較ツール.xlsm」の[順位付け]シートに2行目からコピーする。
行終了の判断はNo.セルに値が無かったらとする。
6.コピー処理を3シート分行ったら「比較一覧表.xls」を閉じる
7.「自動比較ツール.xlsm」の[順位付け]シートに[データ比較]シートの比較元の値を設定する。
セル対比表
順位付け | データ比較 |
---|---|
I1 | C10 |
J1 | E10 |
K1 | G10 |
L1 | C11 |
M1 | E11 |
N1 | G11 |
O1 | I11 |
8.「自動比較ツール.xlsm」の[順位付け]シートに計算式を設定する。
i2=ABS(B2-I$1)
:(略)
o16=ABS(H16-O$1)
P2:=RANK(I2,I$2:I$16,1)
:(略)
V16:=RANK(O16,O$2:O$16,1)
W2=SUM(P2:V2)
:(略)
W16=SUM(P16:V16)
9.「自動比較ツール.xlsm」の[順位付け]シートを2行目からW列を昇順で並び替える
10.「自動比較ツール.xlsm」の[順位付け]シート上位7行の内容を[データ比較]シートにコピーする
投稿2020/09/16 14:35
編集2020/09/16 14:59総合スコア2506
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/16 14:39
2020/09/16 15:26
2020/09/16 15:40
0
すみません読解力がなくって
手順③に比較したい項目にチェックを入れ、その中で比較をしたいです。
この比較は「なに」と「なに」を比較したいのですか?
(abc_1,abc_2,def_1,def_2の意味がつかめません)
それが判れば「タイプ一覧」に設定できるのですが...
あと処理自体は「比較開始」ボタンを押下したときではなく
手順③の「タイプ一覧」のチェックボックスをOn,Offしたときの動作なのですか?
チェックボックスをOn,Off判定なら
VBA
1If abc_1.Value = True Then 2 'abc_1がOnの時 3Else 4 'abc_1がOffの時 5End If
で判りますが...
投稿2020/09/15 23:41
総合スコア2506
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/16 13:38
2020/09/16 13:49 編集
2020/09/16 13:52
2020/09/16 13:55
2020/09/16 14:23
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。