Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2020
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VBScript 10.22 KB | None | 0 0
  1. '__Author: Dohyeon Bong @kaeru8714 2020'
  2.  
  3. Public m As Integer 'Number of Materials'
  4. Public n As Integer 'Number of Points'
  5. Public s As Integer 'Number of Resistance Force'
  6. Public figOrigin(2) As Double
  7. Function getLengthByCoord(x As Double, y As Double, A As Double, B As Double) As Double
  8.     getLengthByCoord = Sqr((x - A) * (x - A) + (y - B) * (y - B)) 'calculate Euclidean distance'
  9. End Function
  10. Function getLengthByPoint(p As Long, q As Long) As Double
  11.     Dim px As Double
  12.     Dim qx As Double
  13.     Dim py As Double
  14.     Dim qy As Double
  15.     px = Range("B10").Offset(p - 1, 0).Value
  16.     qx = Range("B10").Offset(q - 1, 0).Value
  17.     py = Range("C10").Offset(p - 1, 0).Value
  18.     qy = Range("C10").Offset(q - 1, 0).Value
  19.     getLengthByPoint = Sqr((px - qx) * (px - qx) + (py - qy) * (py - qy))
  20. End Function
  21. Function getOtherPointInMaterial(materialNo As Long, p As Long) As Long
  22.     Dim matRange As Range
  23.     Set matRange = Range("H10").Offset(materialNo - 1, 0)
  24.    
  25.     If matRange.Offset(0, 1) = p Then
  26.         getOtherPointInMaterial = matRange.Offset(0, 2).Value
  27.     End If
  28.     If matRange.Offset(0, 2) = p Then
  29.         getOtherPointInMaterial = matRange.Offset(0, 1).Value
  30.     End If
  31. End Function
  32. Function getXdifference(p As Long, q As Long) As Double
  33.     Dim px As Double
  34.     Dim qx As Double
  35.    
  36.     px = Range("B10").Offset(p - 1, 0).Value
  37.     qx = Range("B10").Offset(q - 1, 0).Value
  38.    
  39.     getXdifference = px - qx
  40.    
  41. End Function
  42. Function getYdifference(p As Long, q As Long) As Double
  43.     Dim py As Double
  44.     Dim qy As Double
  45.    
  46.     py = Range("C10").Offset(p - 1, 0).Value
  47.     qy = Range("C10").Offset(q - 1, 0).Value
  48.    
  49.     getYdifference = py - qy
  50.    
  51. End Function
  52. Function getPointCoord(p As Integer)
  53.     Dim Coord(2) As Double
  54.  
  55.     Coord(1) = Range("A" & (p + 9), "C" & (p + 9)).Cells(1, 2)
  56.     Coord(2) = Range("A" & (p + 9), "C" & (p + 9)).Cells(1, 3)
  57.    
  58.    
  59.     getPointCoord = Coord
  60. End Function
  61. Function getXEquilibrium(p As Long)
  62.  
  63.     Dim materials() As Long
  64.     Dim materialRange As Range
  65.     Dim matrixOrigin As Range
  66.     Dim i As Long
  67.     Dim j As Long
  68.     Dim q As Long
  69.     ReDim materials(m)
  70.    
  71.     Set materialRange = Range("I10", Range("J10").Offset(m - 1, 0))
  72.     Set matrixOrigin = Range("O2")
  73.    
  74.     i = 0
  75.     For Each k In materialRange
  76.         If k.Value = p Then
  77.             i = i + 1
  78.            
  79.             If k.Column = 9 Then 'Iソュ'
  80.                materials(i) = k.Offset(0, -1).Value
  81.             End If
  82.             If k.Column = 10 Then 'Jソュ'
  83.                materials(i) = k.Offset(0, -2).Value
  84.             End If
  85.         End If
  86.     Next k
  87.    
  88.     For j = 1 To i
  89.         q = getOtherPointInMaterial(materials(j), p)
  90.         matrixOrigin.Offset(p - 1, materials(j) - 1).Value = getXdifference(p, q) / getLengthByPoint(p, q)
  91.     Next
  92.    
  93. End Function
  94. Function getYEquilibrium(p As Long)
  95.     Dim materials() As Long
  96.     Dim materialRange As Range
  97.     Dim matrixOrigin As Range
  98.     Dim i As Long
  99.     Dim j As Long
  100.     Dim q As Long
  101.     ReDim materials(m)
  102.    
  103.     Set materialRange = Range("I10", Range("J10").Offset(m - 1, 0))
  104.     Set matrixOrigin = Range("O2")
  105.    
  106.     i = 0
  107.     For Each k In materialRange
  108.         If k.Value = p Then
  109.             i = i + 1
  110.            
  111.             If k.Column = 9 Then 'Iソュ'
  112.                materials(i) = k.Offset(0, -1).Value
  113.  
  114.             End If
  115.             If k.Column = 10 Then 'Jソュ'
  116.                materials(i) = k.Offset(0, -2).Value
  117.             End If
  118.         End If
  119.     Next k
  120.    
  121.     For j = 1 To i
  122.         q = getOtherPointInMaterial(materials(j), p)
  123.         matrixOrigin.Offset(p - 1 + n, materials(j) - 1).Value = getYdifference(p, q) / getLengthByPoint(p, q)
  124.     Next
  125. End Function
  126.  
  127. Sub Clear()
  128.     Range("N1", Range("N1").End(xlToRight).End(xlToRight).End(xlDown)).ClearContents
  129.     Range("J2", "L8").ClearContents
  130.     Range("K10", Range("K10").End(xlDown).End(xlDown)).ClearContents
  131.     Range("L10", Range("K10").End(xlDown).End(xlDown)).ClearContents
  132.    
  133. End Sub
  134. Function init()
  135.     Call Clear
  136.     Dim matrixRange As Range
  137.     Dim i As Integer
  138.    
  139.     Set matrixRange = Range(Range("O2"), Range("O2").Offset(2 * n - 1, 2 * n))
  140.    
  141.    
  142.     For i = 1 To n
  143.         Cells(2, 14).Offset(i - 1, 0).Value = "X" & i
  144.         Cells(2, 14).Offset(i - 1 + n, 0).Value = "Y" & i
  145.     Next
  146.    
  147.     For i = 1 To m
  148.         Cells(1, 14).Offset(0, i).Value = "F" & i
  149.     Next
  150.    
  151.    
  152.     For Each k In matrixRange
  153.         k.Value = 0
  154.     Next
  155.  
  156.    
  157.    
  158. End Function
  159. Function Inverse(m As Range) As Variant
  160.         Dim minv As Variant
  161.         minv = Application.MInverse(m)
  162.         Inverse = minv
  163.     End Function
  164. Function Multify(m As Range, n As Range) As Variant
  165.     Dim mulv As Variant
  166.     mulv = Application.MMult(m, n)
  167.     Multify = mulv
  168. End Function
  169.  
  170. Function calculateInverseMatrix()
  171.     Dim matrixRange As Range
  172.     Dim inverseMatrixRange As Range
  173.     Dim i As Integer
  174.    
  175.     Set matrixRange = Range(Range("O2"), Range("O2").Offset(2 * n - 1, 2 * n - 1))
  176.     Set inverseMatrixRange = Range(Range("O" & (2 * n + 4)), Range("O" & (2 * n + 4)).Offset(2 * n - 1, 2 * n - 1))
  177.    
  178.    
  179.     inverseMatrixRange.Value = Inverse(matrixRange)
  180.  
  181. End Function
  182. Function calculateMaterialForce()
  183.     On Error GoTo ErrorHandler
  184.     Dim inverseMatrixRange As Range
  185.     Dim constMatrixRange As Range
  186.     Dim answerMatrixRange As Range
  187.     Dim k As Long
  188.    
  189.     Set inverseMatrixRange = Range(Range("O" & (2 * n + 4)), Range("O" & (2 * n + 4)).Offset(2 * n - 1, 2 * n - 1))
  190.     Set constMatrixRange = Range(Range("O2").Offset(0, 2 * n), Range("O2").Offset(2 * n - 1, 2 * n))
  191.     Set answerMatrixRange = Range(Range("L10"), Range("L10").Offset(2 * n - 1, 0))
  192.     Set resistanceForceRange = Range(Range("K2"), Range("K2").Offset(s - 1, 0))
  193.    
  194.     If IsError(inverseMatrixRange.Range("A1").Value) Then
  195.         MsgBox "Determinant of matrix is zero.", , "Error!"
  196.     End If
  197.    
  198.     answerMatrixRange.Value = Multify(inverseMatrixRange, constMatrixRange)
  199.        
  200.     For Each c In Range(Range("L10"), Range("L10").Offset(2 * n - 1, 0))
  201.         c.Value = Round(c.Value, 5)
  202.     Next
  203.    
  204.     Range(Range("K2"), Range("K2").Offset(s - 1, 0)).Value = answerMatrixRange.Range("A" & m + 1, "A" & m + s).Value
  205.     answerMatrixRange.Range("A" & m + 1, "A" & m + s).ClearContents
  206. ErrorHandler:
  207.    
  208.    
  209.    
  210. End Function
  211. Function calculateMaterialLength()
  212.     Dim i As Long
  213.     Dim x As Double
  214.     Dim y As Double
  215.     Dim A As Double
  216.     Dim B As Double
  217.     For i = 1 To m
  218.         x = getPointCoord(Range("H" & (i + 9), "J" & (i + 9)).Cells(1, 2).Value)(1)
  219.         y = getPointCoord(Range("H" & (i + 9), "J" & (i + 9)).Cells(1, 2).Value)(2)
  220.         A = getPointCoord(Range("H" & (i + 9), "J" & (i + 9)).Cells(1, 3).Value)(1)
  221.         B = getPointCoord(Range("H" & (i + 9), "J" & (i + 9)).Cells(1, 3).Value)(2)
  222.         Range("K" & (i + 9)).Value = getLengthByCoord(x, y, A, B)
  223.     Next i
  224. End Function
  225. Function calculateEquilibriumCondition()
  226.     Dim d As Long
  227.  
  228.     d = m + s - 2 * n
  229.    
  230.    
  231.     If Not d = 0 Then
  232.         MsgBox "d = " & Str(m) & " +" & Str(s) & " - 2*" & Str(n) & " = " & Str(d), , "ERROR!"
  233.         End
  234.     End If
  235.        
  236.     MsgBox "d = " & Str(m) & " +" & Str(s) & " - 2*" & Str(n) & " = " & Str(d), , "Equilibrium Condition OK"
  237.     MsgBox "2020 Dohyeon Bong @kaeru8714", , "Author"
  238. End Function
  239. Function calculateForceEquilibrium()
  240.     Dim p As Long
  241.     For p = 1 To n
  242.         getXEquilibrium (p)
  243.         getYEquilibrium (p)
  244.     Next p
  245. End Function
  246.  
  247.  
  248. Sub main()
  249.     m = Cells(2, 2).Value
  250.     n = Cells(1, 2).Value
  251.     s = WorksheetFunction.CountIf(Range("D10", "E" & (n + 9)), True)
  252.  
  253.     Call init
  254.     Call calculateEquilibriumCondition
  255.     Call calculateMaterialLength
  256.    
  257.     Dim i As Long
  258.     Dim j As Long
  259.     Dim k As Long
  260.     Dim p As Long
  261.    
  262.     Call calculateForceEquilibrium
  263.    
  264.     Range("N1").Value = "Matrix"
  265.     Range("N" & 2 * n + 3).Value = "InvMatrix"
  266.        
  267.     Dim xPoints() As Long
  268.     Dim yPoints() As Long
  269.     ReDim xPoints(n)
  270.     ReDim yPoints(n)
  271.     Dim fixRange As Range
  272.     Set fixRange = Range("D10", Range("D10").Offset(n, 1))
  273.    
  274.     i = 0
  275.     j = 0
  276.     For Each c In fixRange
  277.         If c.Value = True Then
  278.             If c.Column = 4 Then
  279.                 i = i + 1
  280.                 xPoints(i) = c.Offset(0, -3).Value
  281.             End If
  282.             If c.Column = 5 Then
  283.                 j = j + 1
  284.                 yPoints(j) = c.Offset(0, -4).Value
  285.             End If
  286.         End If
  287.     Next c
  288.  
  289.    
  290.     For k = 1 To i
  291.         Range("N1").Offset(0, m + k).Value = "R" & xPoints(k) & "x"
  292.         Range("J2").Offset(k - 1, 0).Value = "R" & xPoints(k) & "x"
  293.         Range("N1").Offset(xPoints(k), m + k).Value = -1
  294.     Next k
  295.    
  296.     For k = 1 To j
  297.         Range("N1").Offset(0, m + k + i).Value = "R" & yPoints(k) & "y"
  298.         Range("J2").Offset(k + i - 1, 0).Value = "R" & yPoints(k) & "y"
  299.         Range("N" & n + 1).Offset(yPoints(k), m + k + i).Value = -1
  300.     Next k
  301.    
  302.    
  303.     Dim loadRange As Range
  304.     Set loadRange = Range("F10", Range("F10").Offset(n, 1))
  305.     Dim lastOrder As Long
  306.     lastOrder = m + k + i
  307.     i = 0
  308.     j = 0
  309.     Dim xLoads() As Long
  310.     Dim yLoads() As Long
  311.     ReDim xLoads(n)
  312.     ReDim yLoads(n)
  313.     For Each c In loadRange
  314.         If Not c.Value = 0 Then
  315.             If c.Column = 6 Then
  316.                 i = i + 1
  317.                 xLoads(i) = c.Offset(0, -5).Value
  318.             End If
  319.             If c.Column = 7 Then
  320.                 j = j + 1
  321.                 yLoads(j) = c.Offset(0, -6).Value
  322.             End If
  323.         End If
  324.     Next c
  325.    
  326.     Range("N1").Offset(0, lastOrder).Value = "const"
  327.     For k = 1 To i
  328.         Range("N1").Offset(xLoads(k), lastOrder).Value = Range("F10").Offset(xLoads(k) - 1, 0).Value
  329.     Next k
  330.    
  331.     lastOrder = lastOrder + i
  332.     For k = 1 To j
  333.         Range("N" & n + 1).Offset(yLoads(k), lastOrder).Value = Range("F10").Offset(yLoads(k) - 1, 1).Value
  334.     Next k
  335.    
  336.     Call calculateInverseMatrix
  337.     Call calculateMaterialForce
  338.  
  339.  
  340. End Sub
  341.  
  342. Sub getMN()
  343.     Sheet1.Range("B1").Value = Range("A10").End(xlDown).Value
  344.     Sheet1.Range("B2").Value = Range("H10").End(xlDown).Value
  345. End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement