fork download
  1. Option Explicit
  2.  
  3. Public Sub ユークリッド距離順()
  4. Const BA1 As Long = 1000 '表縦の倍率
  5. Const BA2 As Long = 100 '表横の倍率
  6. Const BA3 As Long = 10 '表高の倍率
  7. Const BA4 As Long = 1000 '裏縦の倍率
  8. Const BA5 As Long = 100 '裏横の倍率
  9. Const BA6 As Long = 10 '裏高の倍率
  10. Dim sh1 As Worksheet '元データシート
  11. Dim sh2 As Worksheet '結果表示用シート
  12. 'Dim dicT As Object '今回未使用なのでコメントアウトしました
  13. Dim maxrow1 As Long '元データの最大行
  14. Dim namerow As Long '名前行(検索対象の名前があった行)(基準となる名前の行)
  15. Dim wrow As Long '作業用行番号(元データシート)
  16. Dim row2 As Long '作業用行番号(結果表示用シート)
  17. Dim name As String '名前(検索用)
  18. '距離計算用
  19. Dim d1 As Long, d2 As Long, d11 As Long, d12 As Long, d13 As Long, d21 As Long, d22 As Long, d23 As Long
  20. 'Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義 今回未使用なのでコメントアウトしました
  21. Set sh1 = Worksheets("Sheet1") 'シート設定(元データシート)
  22. Set sh2 = Worksheets("Sheet2") 'シート設定(結果表示用シート)
  23. maxrow1 = sh1.Cells(Rows.Count, 1).End(xlUp).Row 'sheet1 最終行を求める
  24. If maxrow1 < 4 Then Exit Sub '最大行が4未満なら終了
  25. name = sh2.Range("B1").Value 'B1の内容をnameへ設定
  26. If name = "" Then Exit Sub 'nameが空白なら終了(B1が空白なら終了)
  27. sh2.Rows("5:" & Rows.Count).ClearContents '5行目以降クリア
  28. namerow = 0 '名前行をクリア
  29. '3行から最終行まで繰り返す(元データシート)
  30. For wrow = 3 To maxrow1
  31. '検索用の名前と一致した場合、その行を名前行に記憶する
  32. If name = sh1.Cells(wrow, 1).Value Then
  33. namerow = wrow
  34. End If
  35. Next
  36. '名前行に行番号が設定されていないなら、終了する
  37. If namerow = 0 Then
  38. MsgBox (name & "が存在しません") '「XXXが存在しません」の文字を画面に表示する
  39. Exit Sub
  40. End If
  41. 'ユークリッド距離の計算
  42. row2 = 5 '結果表示用シートの5行目から出力する
  43. '3行から最終行まで繰り返す(元データシート)
  44. For wrow = 3 To maxrow1
  45. '処理中の行が基準となる名前の行でないなら、距離の計算を行い、結果シートへ書き出す
  46. If wrow <> namerow Then
  47. sh2.Cells(row2, 1).Value = sh1.Cells(wrow, 1).Value '表の名前
  48. sh2.Cells(row2, 4).Value = sh1.Cells(wrow, 1).Value '裏の名前
  49. d11 = (sh1.Cells(wrow, 2).Value - sh1.Cells(namerow, 2).Value) '表の縦の差 処理中の行の縦 - 基準となる名前の縦
  50. d12 = (sh1.Cells(wrow, 3).Value - sh1.Cells(namerow, 3).Value) '表の横の差   以下同様
  51. d13 = (sh1.Cells(wrow, 4).Value - sh1.Cells(namerow, 4).Value) '表の高さの差 以下同様
  52. d21 = (sh1.Cells(wrow, 5).Value - sh1.Cells(namerow, 5).Value) '裏の縦の差 以下同様
  53. d22 = (sh1.Cells(wrow, 6).Value - sh1.Cells(namerow, 6).Value) '裏の横の差 以下同様
  54. d23 = (sh1.Cells(wrow, 7).Value - sh1.Cells(namerow, 7).Value) '裏の高さの差 以下同様
  55. d1 = d11 * d11 * BA1 + d12 * d12 * BA2 + d13 * d13 * BA3 '表の縦の差^2*倍率+表の横の差^2*倍率+表の高さの差^2*倍率
  56. d2 = d21 * d21 * BA4 + d22 * d22 * BA5 + d23 * d23 * BA6 '裏の縦の差^2*倍率+裏の横の差^2*倍率+裏の高さの差^2*倍率
  57. sh2.Cells(row2, 2).Value = d1 '表の距離
  58. sh2.Cells(row2, 5).Value = d2 '裏の距離
  59. row2 = row2 + 1 '結果表示用シートの行番号に1加算
  60. End If
  61. Next
  62. 'ソート
  63. sh2.Range("A5:B" & row2 - 1).Sort key1:=sh2.Range("B5"), Order1:=xlAscending, Header:=xlNo '表のソート ソート範囲A5:Bの最終行
  64. sh2.Range("D5:E" & row2 - 1).Sort key1:=sh2.Range("E5"), Order1:=xlAscending, Header:=xlNo '裏のソート ソート範囲D5:Eの最終行
  65. sh2.Rows("10:" & Rows.Count).ClearContents '10行目以降クリア(5件迄表示なので10行目以降は不要)
  66. MsgBox ("完了") '「完了」の文字を画面に表示する
  67. End Sub
  68.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty