<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE article  PUBLIC "-//NLM//DTD Journal Publishing DTD v3.0 20080202//EN" "http://dtd.nlm.nih.gov/publishing/3.0/journalpublishing3.dtd"><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" dtd-version="3.0" xml:lang="en" article-type="research article"><front><journal-meta><journal-id journal-id-type="publisher-id">AM</journal-id><journal-title-group><journal-title>Applied Mathematics</journal-title></journal-title-group><issn pub-type="epub">2152-7385</issn><publisher><publisher-name>Scientific Research Publishing</publisher-name></publisher></journal-meta><article-meta><article-id pub-id-type="doi">10.4236/am.2018.93018</article-id><article-id pub-id-type="publisher-id">AM-83413</article-id><article-categories><subj-group subj-group-type="heading"><subject>Articles</subject></subj-group><subj-group subj-group-type="Discipline-v2"><subject>Physics&amp;Mathematics</subject></subj-group></article-categories><title-group><article-title>
 
 
  Visual Basic&lt;sup&gt;TM&lt;/sup&gt; Routine for In-Place Matrix Inversion
 
</article-title></title-group><contrib-group><contrib contrib-type="author" xlink:type="simple"><name name-style="western"><surname>Debabrata</surname><given-names>DasGupta</given-names></name><xref ref-type="aff" rid="aff1"><sub>1</sub></xref><xref ref-type="corresp" rid="cor1"><sup>*</sup></xref></contrib></contrib-group><aff id="aff1"><label>1</label><addr-line>Former V.P.-Development, LEAP Software, Inc., Tampa, FL, USA</addr-line></aff><author-notes><corresp id="cor1">* E-mail:<email>ddasgupta@email.com</email></corresp></author-notes><pub-date pub-type="epub"><day>16</day><month>03</month><year>2018</year></pub-date><volume>09</volume><issue>03</issue><fpage>240</fpage><lpage>249</lpage><history><date date-type="received"><day>15,</day>	<month>January</month>	<year>2018</year></date><date date-type="rev-recd"><day>26,</day>	<month>March</month>	<year>2018</year>	</date><date date-type="accepted"><day>29,</day>	<month>March</month>	<year>2018</year></date></history><permissions><copyright-statement>&#169; Copyright  2014 by authors and Scientific Research Publishing Inc. </copyright-statement><copyright-year>2014</copyright-year><license><license-p>This work is licensed under the Creative Commons Attribution International License (CC BY). http://creativecommons.org/licenses/by/4.0/</license-p></license></permissions><abstract><p>
 
 
  
    A modified version of the Gauss-Jordan algorithm for performing In-Place matrix inversion without using an augmenting unit matrix was described in a previous article by the author. He had also developed several Structural Engineering softwares during his career using that method as their analysis engine. He chose matrix inversion because it was suitable for in-core solution of large numbers of vectors for the same set of equations as encountered in structural analysis of moving, dynamic and seismic loadings. The purpose of this article is to provide its readers with its theoretical background and detailed computations of an In-Place matrix inversion task as well as a Visual Basic routine of the algorithm for direct incorporation into Visual Basic 6
   <sup>TM</sup> softwares and Visual Basic for Applications
   <sup>TM</sup> macros in MS-Excel
   <sup>TM</sup> spreadsheets to save them time and effort of software development. 
  
 
</p></abstract><kwd-group><kwd>VB6</kwd><kwd> VBA</kwd><kwd> FORTRAN</kwd><kwd> MS-Excel</kwd><kwd> Numerical Methods</kwd><kwd> Gauss-Jordan</kwd><kwd> Matrix Methods</kwd><kwd> Matrix Inversion</kwd><kwd> In-Place Inversion</kwd><kwd> Structural Analysis</kwd></kwd-group></article-meta></front><body><sec id="s1"><title>1. Introduction</title><p>Gauss-Jordan is a standard matrix inversion procedure developed in 1887 [<xref ref-type="bibr" rid="scirp.83413-ref1">1</xref>] . It requires the original matrix to be appended by a unit (identity) matrix and after the inversion operation is completed the original matrix is transformed into a unit matrix while the appended unit matrix becomes the inverse.</p><p>A detailed description of the original Gauss-Jordan method as well as its comparison with the author’s In-Place version which does not require the augmenting matrix and the reason for its development were previously published by him in another article [<xref ref-type="bibr" rid="scirp.83413-ref2">2</xref>] .</p><p>This paper reproduces relevant parts of that article appended by the computational details of an example and a Visual Basic routine.</p></sec><sec id="s2"><title>2. Mathematics</title><p>The author has used certain terms in the following discussion which are defined as follows: Normalization is dividing an entire row by its pivotal element to transform the pivotal element to unity; Virtualization is replicating an element or a vector of the current augmenting matrix within the original matrix space without creating the real unit matrix; the Complementary of a component of the original matrix is its corresponding component in the virtual augmenting matrix and the Reduction of a row is the modification of the pivotal row by the ratio of the row element on the pivotal column and the pivotal element and then subtracting it from the row, thereby reducing the row element on the pivotal column to zero.</p><p>Unlike the classical Gauss-Jordan method, the author’s In-Place Inversion algorithm does not require augmenting with and performing operations on an identity matrix and the procedure is described below:</p><p>Just as with Gauss-Jordan, the following two operations are iterated on all rows to obtain the inverse.</p><p>Operation 1: The unpivoted row with the largest absolute diagonal element is selected as the pivotal row p and the value of its pivotal element A p , p is saved as the pivot P p after which the pivotal element A p , p is replaced by unity (1) to virtualize the complementary element A p , p + n of the unit matrix. Then the pivotal row p is normalized by dividing the entire row by P p , i.e., A p , j = A p , j / P p where j = 1 → n . This changes the pivotal element A p , p to 1 / P p which replicates the current value of its complementary element within the virtual unit matrix.</p><p>Operation 2: Each non-pivotal row i , i.e., i = 1 → n ≠ p , is reduced by saving the value of its pivotal column element A i , p as P i , recomputing all elements in the current row i as A i , j = A i , j − A p , j ∗ P i where j = 1 → n and then resetting A i , p to 0 to minimize truncation error. As mentioned earlier, this is a shorter version of the operation A i , j = A i , j − A p , j ∗ P i / A p , p where j = 1 → n since A p , p = 1 in the original matrix after normalization of the pivotal row.</p><p>This procedure implicitly duplicates the functionality of the unit matrix of the Gauss-Jordan method within the original matrix. After performing these two operations on every row, treating each row once as a pivotal row, the original matrix is replaced by its inverse.</p><p>The sequence of operations 1 and 2 can be reversed but in that case the pivotal element A p , p will not be unity during operation 2 and the explicit formula will have to be used, thereby substantially increasing the amount of computation.</p><p>Solutions of the same example by both Gauss-Jordan and In-Place algorithms are given in the Author’s original article for comparison purposes and hence are not reproduced here.</p><p>Computational details of a 3 &#215; 3 matrix [<xref ref-type="bibr" rid="scirp.83413-ref3">3</xref>] as well as a Visual Basic subroutine with a sample calling routine are given below. It is equally useful for VB6 programs as well as a VBA routine in MS-Excel<sup>TM</sup> spreadsheets. Conversion of the routine into other languages is also quite simple.</p></sec><sec id="s3"><title>3. Computational Details of In-Place Inversion of a 3 &#215; 3 Matrix [<xref ref-type="bibr" rid="scirp.83413-ref3">3</xref>]</title><p>Initialization</p><p>==============</p><p>Preset all rows to Active</p><p>Current Matrix:</p><p>-1.0000 -1.0000 3.0000 Active</p><p>2.0000 1.0000 2.0000 Active</p><p>-2.0000 -2.0000 1.0000 Active</p><p>Cycle 1</p><p>=======</p><p>Currently active row with largest (absolute) diagonal = 1</p><p>Process Pivotal Row 1</p><p>Save element (1,1) = -1.0000 as Pivot</p><p>Reset Element (1,1) = 1.0000 to 1.</p><p>Reset Pivotal Row 1 to Inactive</p><p>Current Matrix:</p><p>1.0000 -1.0000 3.0000 Inactive</p><p>2.0000 1.0000 2.0000 Active</p><p>-2.0000 -2.0000 1.0000 Active</p><p>Divide all elements of pivotal row 1 by Pivot = -1.0000</p><p>Current Matrix:</p><p>-1.0000 1.0000 -3.0000 Inactive</p><p>2.0000 1.0000 2.0000 Active</p><p>-2.0000 -2.0000 1.0000 Active</p><p>Process non-pivotal row 2</p><p>Retrieve Pivotal column element (2,1) = 2.0000 and reset it to 0.</p><p>Current Matrix:</p><p>-1.0000 1.0000 -3.0000 Inactive</p><p>0.0000 1.0000 2.0000 Active</p><p>-2.0000 -2.0000 1.0000 Active</p><p>Subtract from each element in current row 2.0000 * corresponding element in pivotal row 1</p><p>Previous element (2,1) = 0.0000 is now 0.0000 - 2.0000 * -1.0000 = 2.0000</p><p>Previous element (2,2) = 1.0000 is now 1.0000 - 2.0000 * 1.0000 = -1.0000</p><p>Previous element (2,3) = 2.0000 is now 2.0000 - 2.0000 * -3.0000 = 8.0000</p><p>Current Matrix:</p><p>-1.0000 1.0000 -3.0000 Inactive</p><p>2.0000 -1.0000 8.0000 Active</p><p>-2.0000 -2.0000 1.0000 Active</p><p>Process non-pivotal row 3</p><p>Retrieve Pivotal column element (3,1) = -2.0000 and reset it to 0.</p><p>Current Matrix:</p><p>-1.0000 1.0000 -3.0000 Inactive</p><p>2.0000 -1.0000 8.0000 Active</p><p>0.0000 -2.0000 1.0000 Active</p><p>Subtract from each element in current row -2.0000 * corresponding element in pivotal row 1</p><p>Previous element (3,1) = 0.0000 is now 0.0000 - -2.0000 * -1.0000 = -2.0000</p><p>Previous element (3,2) = -2.0000 is now -2.0000 - -2.0000 * 1.0000 = 0.0000</p><p>Previous element (3,3) = 1.0000 is now 1.0000 - -2.0000 * -3.0000 = -5.0000</p><p>Current Matrix:</p><p>-1.0000 1.0000 -3.0000 Inactive</p><p>2.0000 -1.0000 8.0000 Active</p><p>-2.0000 0.0000 -5.0000 Active</p><p>Cycle 2</p><p>=======</p><p>Currently active row with largest (absolute) diagonal = 3</p><p>Process Pivotal Row 3</p><p>Save element (3,3) = -5.0000 as Pivot</p><p>Reset Element (3,3) = 1.0000 to 1.</p><p>Reset Pivotal Row 3 to Inactive</p><p>Current Matrix:</p><p>-1.0000 1.0000 -3.0000 Inactive</p><p>2.0000 -1.0000 8.0000 Active</p><p>-2.0000 0.0000 1.0000 Inactive</p><p>Divide all elements of pivotal row 3 by Pivot = -5.0000</p><p>Current Matrix:</p><p>-1.0000 1.0000 -3.0000 Inactive</p><p>2.0000 -1.0000 8.0000 Active</p><p>0.4000 0.0000 -0.2000 Inactive</p><p>Process non-pivotal row 1</p><p>Retrieve Pivotal column element (1,3) = -3.0000 and reset it to 0.</p><p>Current Matrix:</p><p>-1.0000 1.0000 0.0000 Inactive</p><p>2.0000 -1.0000 8.0000 Active</p><p>0.4000 0.0000 -0.2000 Inactive</p><p>Subtract from each element in current row -3.0000 * corresponding element in pivotal row 3</p><p>Previous element (1,1) = -1.0000 is now -1.0000 - -3.0000 * 0.4000 = 0.2000</p><p>Previous element (1,2) = 1.0000 is now 1.0000 - -3.0000 * 0.0000 = 1.0000</p><p>Previous element (1,3) = 0.0000 is now 0.0000 - -3.0000 * -0.2000 = -0.6000</p><p>Current Matrix:</p><p>0.2000 1.0000 -0.6000 Inactive</p><p>2.0000 -1.0000 8.0000 Active</p><p>0.4000 0.0000 -0.2000 Inactive</p><p>Process non-pivotal row 2</p><p>Retrieve Pivotal column element (2,3) = 8.0000 and reset it to 0.</p><p>Current Matrix:</p><p>0.2000 1.0000 -0.6000 Inactive</p><p>2.0000 -1.0000 0.0000 Active</p><p>0.4000 0.0000 -0.2000 Inactive</p><p>Subtract from each element in current row 8.0000 * corresponding element in pivotal row 3</p><p>Previous element (2,1) = 2.0000 is now 2.0000 - 8.0000 * 0.4000 = -1.2000</p><p>Previous element (2,2) = -1.0000 is now -1.0000 - 8.0000 * 0.0000 = -1.0000</p><p>Previous element (2,3) = 0.0000 is now 0.0000 - 8.0000 * -0.2000 = 1.6000</p><p>Current Matrix:</p><p>0.2000 1.0000 -0.6000 Inactive</p><p>-1.2000 -1.0000 1.6000 Active</p><p>0.4000 0.0000 -0.2000 Inactive</p><p>Cycle 3</p><p>=======</p><p>Currently active row with largest (absolute) diagonal = 2</p><p>Process Pivotal Row 2</p><p>Save element (2,2) = -1.0000 as Pivot</p><p>Reset Element (2,2) = 1.0000 to 1.</p><p>Reset Pivotal Row 2 to Inactive</p><p>Current Matrix:</p><p>0.2000 1.0000 -0.6000 Inactive</p><p>-1.2000 1.0000 1.6000 Inactive</p><p>0.4000 0.0000 -0.2000 Inactive</p><p>Divide all elements of pivotal row 2 by Pivot = -1.0000</p><p>Current Matrix:</p><p>0.2000 1.0000 -0.6000 Inactive</p><p>1.2000 -1.0000 -1.6000 Inactive</p><p>0.4000 0.0000 -0.2000 Inactive</p><p>Process non-pivotal row 1</p><p>Retrieve Pivotal column element (1,2) = 1.0000 and reset it to 0.</p><p>Current Matrix:</p><p>0.2000 0.0000 -0.6000 Inactive</p><p>1.2000 -1.0000 -1.6000 Inactive</p><p>0.4000 0.0000 -0.2000 Inactive</p><p>Subtract from each element in current row 1.0000 * corresponding element in pivotal row 2</p><p>Previous element (1,1) = 0.2000 is now 0.2000 - 1.0000 * 1.2000 = -1.0000</p><p>Previous element (1,2) = 0.0000 is now 0.0000 - 1.0000 * -1.0000 = 1.0000</p><p>Previous element (1,3) = -0.6000 is now -0.6000 - 1.0000 * -1.6000 = 1.0000</p><p>Current Matrix:</p><p>-1.0000 1.0000 1.0000 Inactive</p><p>1.2000 -1.0000 -1.6000 Inactive</p><p>0.4000 0.0000 -0.2000 Inactive</p><p>Process non-pivotal row 3</p><p>Retrieve Pivotal column element (3,2) = 0.0000 and reset it to 0.</p><p>Current Matrix:</p><p>-1.0000 1.0000 1.0000 Inactive</p><p>1.2000 -1.0000 -1.6000 Inactive</p><p>0.4000 0.0000 -0.2000 Inactive</p><p>Subtract from each element in current row 0.0000 * corresponding element in pivotal row 2</p><p>Previous element (3,1) = 0.4000 is now 0.4000 - 0.0000 * 1.2000 = 0.4000</p><p>Previous element (3,2) = 0.0000 is now 0.0000 - 0.0000 * -1.0000 = 0.0000</p><p>Previous element (3,3) = -0.2000 is now -0.2000 - 0.0000 * -1.6000 = -0.2000</p><p>Current Matrix:</p><p>-1.0000 1.0000 1.0000 Inactive</p><p>1.2000 -1.0000 -1.6000 Inactive</p><p>0.4000 0.0000 -0.2000 Inactive</p><p>Inversion Complete</p></sec><sec id="s4"><title>4. Microsoft<sup>&#226;</sup> Visual Basic<sup>&#226;</sup> Routine for In-Place Matrix Inversion</title><p>'(A) Sample calling routine for In-Place Subroutine</p><p>'Legend:</p><p>'iNmat = Matrix size</p><p>'dblMatrix = Matrix array</p><p>Dim iNmat As Integer</p><p>'Sample matrix size = 3x3</p><p>iNmat = 3</p><p>'Sample matrix elements</p><p>ReDim dblMatrix(iNmat, iNmat) As Double</p><p>dblMatrix(1, 1) = -1: dblMatrix(1, 2) = -1: dblMatrix(1, 3) = 3</p><p>dblMatrix(2, 1) = 2: dblMatrix(2, 2) = 1: dblMatrix(2, 3) = 2</p><p>dblMatrix(3, 1) = -2: dblMatrix(3, 2) = -2: dblMatrix(3, 3) = 1</p><p>'In-Place Inversion</p><p>InPlace iNmat, dblMatrix()</p><p>'The matrix dblMatrix will now contain the inverse for post-processing.</p><p>'(B) In-Place Matrix Inversion Subroutine</p><p>Public Sub InPlace(iNmat As Integer, arrMatrix() As Double)</p><p>'In-Place Matrix Inversion Subroutine for Modified Gauss-Jordan Algorithm</p><p>'Author: D. DasGupta, P.E., M.Tech., M.ASCE, MCP</p><p>'Legend:</p><p>'iNmat = Matrix size</p><p>'arrMatrix = Matrix array</p><p>Dim iRow As Integer, jCol As Integer, iCycle As Integer</p><p>Dim dPivot As Double, dAbsDiag As Double, iBig As Integer</p><p>ReDim blnRowProcessed (iNmat) As Boolean</p><p>'Preset entire Processing Index vector to False (Unprocessed)</p><p>For iRow = 1 To iNmat: blnRowProcessed(iRow) = False: Next iRow</p><p>'Loop over diagonal elements</p><p>For iCycle = 1 To iNmat</p><p>' Preset Pivot to Zero</p><p>dPivot = 0!</p><p>' Find the row number and value of largest diagonal element of</p><p>' unprocessed rows (blnRowProcessed = False)</p><p>' Loop over matrix rows</p><p>For iRow = 1 To iNmat</p><p>' If processing index for this row is False</p><p>If blnRowProcessed(iRow) = False Then</p><p>' Store ABS value of its diagonal element</p><p>dAbsDiag = Abs(arrMatrix(iRow, iRow))</p><p>' If ABS(Diagonal) &gt; Current Pivot then</p><p>If dAbsDiag &gt; dPivot Then</p><p>' Store current row number and diagonal value as pivot</p><p>' Note: Since all diagonal elements must be positive,</p><p>' this test must succeed at least once</p><p>iBig = iRow: dPivot = dAbsDiag</p><p>End If</p><p>End If</p><p>Next</p><p>' The number of active row with highest diagonal has been determined</p><p>' and the value of its diagonal element has been stored as Pivot</p><p>' Reset Index of the row with highest diagonal to Processed and its</p><p>' diagonal element to Unity to reduce truncation error.</p><p>blnRowProcessed(iBig) = True</p><p>dPivot = arrMatrix(iBig, iBig)</p><p>arrMatrix(iBig, iBig) = 1!</p><p>' Divide the entire Pivotal row with Pivot</p><p>For jCol = 1 To iNmat</p><p>arrMatrix(iBig, jCol) = arrMatrix(iBig, jCol) / dPivot</p><p>Next</p><p>' This will make the Pivotal Row diagonal = Unity</p><p>' Loop over all rows</p><p>For iRow = 1 To iNmat</p><p>' Skip the Pivotal row which has already been processed</p><p>If iRow &lt;&gt; iBig Then</p><p>' Retrieve the Pivotal column element of the current row and</p><p>' reset it to zero</p><p>dPivot = arrMatrix(iRow, iBig)</p><p>arrMatrix(iRow, iBig) = 0!</p><p>' Subtract from each element of the current row the</p><p>' Pivotal column element times the Pivotal column element in</p><p>' the row equal to current column</p><p>For jCol = 1 To iNmat</p><p>arrMatrix(iRow, jCol) = arrMatrix(iRow, jCol) - _</p><p>dPivot * arrMatrix(iBig, jCol)</p><p>Next</p><p>End If</p><p>Next</p><p>Next</p><p>End Sub</p></sec><sec id="s5"><title>5. Conclusion</title><p>During the early years of his career the author had developed a number of Structural Engineering softwares in India using his In-Place Inversion method as their analysis engine in FORTRAN language for mainframe applications. He later developed Microsoft<sup>TM</sup> QuickBasic, Compiled Basic, Visual Basic 6 (VB6) [<xref ref-type="bibr" rid="scirp.83413-ref4">4</xref>] [<xref ref-type="bibr" rid="scirp.83413-ref5">5</xref>] and Visual Basic for Applications (VBA) [<xref ref-type="bibr" rid="scirp.83413-ref6">6</xref>] versions of the inversion routine in the USA for PC-based engineering applications [<xref ref-type="bibr" rid="scirp.83413-ref7">7</xref>] [<xref ref-type="bibr" rid="scirp.83413-ref8">8</xref>] and spreadsheets, the last one of which has been presented here. The purpose of this article is to provide its readers with a ready-to-incorporate subroutine for VB6 softwares and MS-Excel<sup>TM</sup> spreadsheets and even if Visual Basic is phased out in future [<xref ref-type="bibr" rid="scirp.83413-ref9">9</xref>] , it may still remain useful as a template for scientific and engineering software developers to create equivalent routines in other languages.</p></sec><sec id="s6"><title>Acknowledgements</title><p>The author gratefully acknowledges his introduction to Matrix Algebra by late Prof. B. R. Seth, former Head of the Department of Mathematics, Indian Institute of Technology, Kharagpur, India; the guidance and encouragement from his ex-supervisor and mentor late K. Madhavan, former Deputy Director, Central Water and Power Commission, New Delhi, India and the valuable contributions and suggestions of his ex-colleague late M. R. Rao, former Mathematician/Programmer, Computer Center, Planning Commission, New Delhi, India.</p></sec><sec id="s7"><title>About the Author</title><p>D. DasGupta is a retired Structural Engineer whose past positions included V.P., Development, LEAP Software, Inc., Tampa, FL; Principal Consultant, McDonnell Douglas Automation Co., St. Louis, MO; Senior Engineer, Parsons Brinckerhoff/Tudor, Inc., Atlanta, GA; Structural Engineer, LEAP Associates, Inc., Lakeland, FL and Assistant Director, Central Water and Power Commission, New Delhi, India. He received his M.Tech. degree from Indian Institute of Technology, Kharagpur, India and D.I.C. from Imperial College of Science and Technology, London, England. He is a Life Member of the American Society of Civil Engineers and former Professional Engineer registered in Florida, Pennsylvania and Texas. He is certified in AutomatH (FORTRAN) programming by Honeywell, Inc., a Microsoft-Certified Professional and MS-Office<sup>TM</sup> User Specialist/MS-Access<sup>TM</sup> Expert. During his career he has worked as a practicing engineer as well as the author of several computer software libraries for Hydraulics, Soil Mechanics, Structural Analysis and Engineering Design in India and the USA.</p></sec><sec id="s8"><title>Cite this paper</title><p>DasGupta, D. (2018) Visual Basic<sup>TM</sup> Routine for In-Place Matrix Inversion. Applied Mathematics, 9, 240-249. https://doi.org/10.4236/am.2018.93018</p></sec></body><back><ref-list><title>References</title><ref id="scirp.83413-ref1"><label>1</label><mixed-citation publication-type="other" xlink:type="simple">Smith, W.A. (1986) Elementary Numerical Analysis. Prentice-Hall, Inc., Englewood Cliffs, NJ, USA, 51-52.</mixed-citation></ref><ref id="scirp.83413-ref2"><label>2</label><mixed-citation publication-type="other" xlink:type="simple">DasGupta, D. (2013) In-Place Matrix Inversion by Modified Gauss-Jordan Algorithm. Applied Mathematics, 4, 1392-1396. https://doi.org/10.4236/am.2013.410188</mixed-citation></ref><ref id="scirp.83413-ref3"><label>3</label><mixed-citation publication-type="other" xlink:type="simple">McFarland, T. (2007) The Inverse of an n × n Matrix. University of Wisconsin-Whitewater. http://math.uww.edu/~mcfarlat/inverse.htm</mixed-citation></ref><ref id="scirp.83413-ref4"><label>4</label><mixed-citation publication-type="other" xlink:type="simple">Microsoft Press (1998) Microsoft Visual Basic 6.0 Programming Guide&amp;copy;.</mixed-citation></ref><ref id="scirp.83413-ref5"><label>5</label><mixed-citation publication-type="other" xlink:type="simple">Holzner, S. (1998) Visual Basic 6 Black Book&amp;copy;. Coriolis Technology Press, Scottsdale, AZ, USA.</mixed-citation></ref><ref id="scirp.83413-ref6"><label>6</label><mixed-citation publication-type="other" xlink:type="simple">Microsoft&lt;sup&gt;TM&lt;/sup&gt; (2017) Language Reference VBA|MSDN.  
https://msdn.microsoft.com/en-us/vba/vba-language-reference</mixed-citation></ref><ref id="scirp.83413-ref7"><label>7</label><mixed-citation publication-type="other" xlink:type="simple">Staff Reporter (1987) Roads, Bridges and Computers. Roads &amp; Bridges Magazine, 48.</mixed-citation></ref><ref id="scirp.83413-ref8"><label>8</label><mixed-citation publication-type="other" xlink:type="simple">Corporate Technology Information Services, Inc. (1990) Corporate Technology Directory. U.S. Edition, Corporate Technology Information Services, Inc., Woburn, MA, USA, 3-873.</mixed-citation></ref><ref id="scirp.83413-ref9"><label>9</label><mixed-citation publication-type="other" xlink:type="simple">Microsoft&lt;sup&gt;TM&lt;/sup&gt; (2017) Support Statement for Visual Basic 6.0 on Windows.  
https://docs.microsoft.com/en-us/visualstudio/vb6/vb6-support</mixed-citation></ref></ref-list></back></article>