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

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

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

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

Q&A

解決済

4回答

1060閲覧

VBA チェックボックスにチェックした項目だけ選んで、その中でランク付けをしたい

qqkf

総合スコア10

VBA

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

0グッド

0クリップ

投稿2020/09/15 15:23

編集2020/09/16 14:19

■実現したいことは以下になります。
・手順②(画像1)で指定したファイル(比較一覧表.xls)の中にあるタイプ一覧項目(画像3)を
手順③で必要なタイプ一覧だけにチェックし、その中でランク付けし、黄色枠にも結果を表示させたい

■分からないこと
・チェックボックスにチェックを入れた後、
ファイル(比較一覧表.xls)の中にあるタイプ一覧項目をどうやってチェックし、
手順①の緑枠Sampleデータと比較一覧表ファイルのSampleデータを比較しているか分からないです。

■前提
・今までは、タイプ一覧項目を作らずに手順①の緑枠(画像1)のSampleデータと
手順②のSampleデータを比べてランク付けをしました。

画像が以下になります。

イメージ説明
画像1 自動比較ツール.xlsmの画面 データ比較シート

イメージ説明
画像2 自動比較ツール.xlsmの画面 順位付けシート

データ比較シートの緑枠(画像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)

イメージ説明
画像3 比較一覧表.xlsの画面

コードが以下になります。

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ページで確認できます。

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

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

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

ttyp03

2020/09/16 00:13

質問の要点はコード内に書かないで、タイトルおよび質問文冒頭で説明するようにしてください。結局何がわからないのか、何を聞きたいのかがわかりづらいです。 やたらと「したい」を連発すると丸投げ判定されて回答が付きづらいですよ。
qqkf

2020/09/16 13:46

質問が分かりづらくて申し訳ございません。 再編集しました。 実現したいこと分からないことを冒頭で纏めましたのでご確認お願いします。
guest

回答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
kuma_kuma_

総合スコア2506

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

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

qqkf

2020/09/17 13:41

コーディングありがとうございます。 動作確認できました。 [順位付け]シートをVBA側で処理コーディングまで行ったんですね、ありがとうございます。 このプログラムは、RANK関数に重みをつけることは可能でしょうか。 一回目の処理手順で気付くのが遅くて申し訳ございません。 チェックボックスを作る前に、[順位付け]シートのRANK関数を使って重みも入れて行っていました。 例えば、A Sampleの点数に関しては「×2」を考慮してランク付けしたいときは、 セルQ1に「2」を入力して、 Q2:=RANK(J2,J$2:J$16,1)*Q$1 :(略) Q16:=RANK(J16,J$2:J$16,1)*Q$1 で行っていました。 また、[順位付け]シートのヘッダー部分A列はクリアしないで残したいのですが、可能でしょうか。
kuma_kuma_

2020/09/17 13:58

> 例えば、A Sampleの点数に関しては「×2」を考慮してランク付けしたいときは、 これをするなら[データ比較]シートに「重み」項目を追加して比較値をコピーする時に 同じように1行目にコピーするようにしたほうが良いです。 > [順位付け]シートのヘッダー部分A列はクリアしないで 1行目のA列からI列に関してはクリア後再設定していますが 「画像2 自動比較ツール.xlsmの画面 順位付けシート」を見るともともと空白だったはずです。 デバックの関係で付けた機能ですがA列が"No."で問題ありますか? あと修正は可能ですが、もうすでに「開発依頼」のレベルにきています。 ここはあくまで「わからない事を教えてもらう場」ですので誤解なきよう
qqkf

2020/09/17 14:21

すいません、実現したいことができたのでクローズいたします。 ここからは、地道に調べて改造していきたいと思います。 最後まで携わっていただきありがとうございました。
guest

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
kitasue

総合スコア314

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

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

qqkf

2020/09/16 13:56

前回に引き続き回答ありがとうございます。 (1)のチェックボックスですが、フォームコントロールで作成しましたが、 「指定した名前のアイテムが見つかりませんでした。」エラーメッセージがでました。 どうやってチェックボックスを作成されたのでしょうか。
kitasue

2020/09/16 13:58

名前をCheckBox1とかに変更しましたか?
qqkf

2020/09/16 14:11

変更しましたが、同じエラーメッセージが表示されます。 手順は開発タブ→挿入→フォームコントロール→チェックボックス(フォームコントロール)よかったですか?
kitasue

2020/09/16 18:59

はい、それでOKです。チェックボックスを作成した直後なら、左上のA1セルの上あたりに「チェック 1」とか表示されていると思いますが、そこにカーソルを入れて「CheckBox1」に変更します。 すでに作成済みなら、チェックボックスを右クリックすると、同様の処理が可能です。 下のサイトはボタンの例です。 http://www.k1simplify.com/vba/tipsleaf/callbuttonname.html
kitasue

2020/09/16 19:13

もし、他にチェックボックスが存在せず、今後も増やす予定が無いのであれば、 For i = 1 To 4 If wshCmp.CheckBoxes("CheckBox" & i).Value = xlOn Then j = j + 1 ReDim Preserve strCriteria(j) strCriteria(j) = wshCmp.CheckBoxes("CheckBox" & i).Caption End If Next i の部分を Dim CheckBox For Each CheckBox In wshCmp.CheckBoxes If CheckBox.Value = xlOn Then j = j + 1 ReDim Preserve strCriteria(j) strCriteria(j) = CheckBox.Caption End If Next CheckBox に変更しても動きます。
qqkf

2020/09/17 13:11

動作確認できました。 同じ動作(例:全部チェックしたときなど)を何回も行うと順位が毎回変動してしまいます。 また、比較後、[順付け]シートを見にいくと同じものが下にコピーされていました。
qqkf

2020/09/17 13:30

順位が毎回変動ですが、こちらの貼り付けミスでしたので、解決です。 [順付け]シートを見にいくと同じものが下にコピーはされます。
kitasue

2020/09/17 13:37 編集

同じものが下にコピーされるのは、そこを作業領域としているからで、正常な動作です。
qqkf

2020/09/17 13:44

作業後は、クリアしたいのですが可能でしょうか。
kitasue

2020/09/17 14:07

wshCmp.Range("A31:i37").Value = wshOrd.Range("A31:i37").Value の後ろに2行追加しました。
qqkf

2020/09/17 15:00

コーディングありがとうございます。 無事に実現したいことができました。
guest

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」の[順位付け]シートに[データ比較]シートの比較元の値を設定する。

セル対比表

順位付けデータ比較
I1C10
J1E10
K1G10
L1C11
M1E11
N1G11
O1I11

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
kuma_kuma_

総合スコア2506

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

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

kuma_kuma_

2020/09/16 14:39

自動比較ツール.xlsmの[データ比較]シートにあるデータファイル「読み込みデータ.xls」は なにか使用しているのですか?
qqkf

2020/09/16 15:26

現在使用していないです。 これはデータファイル選択ボタン押下後、「読み込みデータ.xls」にあるSampleデータをオレンジ枠および緑枠に自動で貼り付けを行います。 オレンジ枠及び緑枠は、手動でも入力したいので無視していいです。 処理の手順ですが、メインの処理 1.「自動比較ツール.xlsm」の[データ比較]シートの上位7行をクリアする。 2.「自動比較ツール.xlsm」の[順位付け]シートをクリアする。 のクリアするというどういう意味でしょうか。
kuma_kuma_

2020/09/16 15:40

>クリアするというどういう意味でしょうか。 前回実行した時の値が残っている可能性がありますので行を削除しておきます。
guest

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

kuma_kuma_

総合スコア2506

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

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

qqkf

2020/09/16 13:38

回答ありがとうございます。 質問が分かりづらくて申し訳ございません。 手順3でチェックしたタイプ一覧に対して、手順1の緑枠のSampleデータと比較一覧表.xlsの中にあるSampleデータを比較をしたいです。 質問を再編集したので併せて確認お願いします。
kuma_kuma_

2020/09/16 13:49 編集

「画像3 比較一覧表.xlsの画面」で見ると1シートに対して複数比較一覧表が設定されているように見えるのですがこのような登録がされているのですか? あと比較一覧表は必ず5行なのでしょうか?
qqkf

2020/09/16 13:52

いいえ、本来ならシートごとに記載しています。 画像3は、それを1シートに纏めました。 シート1は、"1_比較一覧"、シート2は、"2_比較一覧"、シート3は、"3_比較一覧"です。
kuma_kuma_

2020/09/16 13:55

画像3を張り替える事をオススメします。
qqkf

2020/09/16 14:23

画像3を貼り替えました。 比較一覧表の行数ですが、現段階では5行です。 今後は、それぞれのシートに行の増減させたいと考えています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問