.net and office automation follies : including many advanced VBA resources. Thanks to Alfred Vachris for the link.

AET VBE Tools : Tools for the Visual Basic editor from Andrew Engwirda (via Daily Dose of Excel).

]]>

Here Pekka Kuusisto talks of performing the traditional song Wedding Dress:

and Sam Amidon performs it (from a previous concert, without ACO):

and finally a much earlier recording, from Pentangle in 1972, recorded for French TV:

]]>

and Christy Moore’s version of the lyrics:

## Beeswing

Richard Thompson

I was 18 when I came to town they called it the summer of love

Burning babies burning flags the hawks against the doves

I took a job at the steaming way down on Caltrim St,

Fell in love with a laundry girl that was workin next to me.Brown hair zig zagged across her face and a look of half surprise,

Like a fox caught in the headlights there was animal in her eyes,

She said to me can’t you see I’m not the factory kind,

If you don’t take me out of here I’ll surely lose my mindChorus:

She was a rare thing fine as a bee’s wing

So fine a breath of wind might blow her away

She was a lost child, she was runnin’ wild (she said)

So long as theres no price on love I’ll stay

You wouldn’t want me any other way.We busked around the market towns fruit pickin down in kent

We could tinker pots and pans or knives wherever we went.

We were campin down the Gower one time, the work was mighty good.

She wouldn’t wait for the harvest, I thought we should.I said to her we’ll settle down, get a few acres dug,

A fire burning in the hearth and babbies on the rug.

She said Oh man you foolish man that surely sounds like hell,

You might be lord of half the world,You’ll not own me as wellChorus

We were drinking more in those days our tempers reached a pitch

Like a fool I let her run away when she took the rambling itch.

Last I heard she was living rough back on the Derby beat

A bottle of White Horse in her pocket, a Wolfhound at her feetThey say that she got married once to a man called Romany Brown

Even a gypsy caravan was too much like settlin’ down

They say her rose has faded, rough weather and hard booze,

Maybe thats the price you pay for the chains that you refuseShe was a rare thing, fine as a bee’s wing

I miss her more than ever words can say

If I could just taste all of her wildness now

If I could hold her in my arms today…..

I wouldn’t want her any other way

Followed by this comment (which I thought was a pretty good answer to the incessant YouTube arguments about whose version of any song is the best):

It is never easy writing these words out. First there is the problem of the lyric as written. Invariably I need to turn these songs into my own dialect, into the english as I sing it. Sometimes I am unable to resist slipping back into the writers idiom when seduced by the beauty of the sound of a particular word. Then there is the bloody grammar and punctuation which can get in the way of writng a song as she should be sung (as distinct from the way Fr. Clandillon would have me write it!)

This song is, for me, a modern classic in the old style. Up there with Musgrave and Baker, Raggle and Yellow Bittern, it will survive the ages that are left and will shine brightly when us lads are long forgotton.

Its a beauty to sing, it is usually good but every now and then a version emerges that stills my night and leaves me totally satisfied at the last chord not caring about audience or next song or The Gig or anything, just to bathe in the luxury of a beautiful song shared and sung to a receptive kipful of listeners.

]]>

WeightLSq.xlsb (VBA and Linest versions)

__xl_Spline-Matrix2.zip__ (Alglib version)

__xlScipy-xlw.zip__ (Python Scipy version)

The first spreadsheet uses VBA only. The other two both use Python and require Python and xlwings to be installed. The Alglib and Python downloads also include wide variety of other functions.

The screen shot below shows some sample data with two known variables (X1 and X2) and an associated value Y. We wish to find a linear equation of the form:

Y = A + B.X1 + C.X2

that fits the given Y values as closely as possible.

The first two results use the Linest function with no weighting. In the first formula, the optional Const value is omitted, so Const is set to True, and the equation constant value (A) is calculated. For this case the X range only requires the X1 and X2 values (columns B and C). In the second formula Const is entered as False, so an additional column is required with X = 1.

Note that Linest returns the coefficients in reverse order, so our equation is given by:

Y = 22.12 + 0.0137X1 – 1.032X2

Linest can be used with weighted data by applying the weights to both the X and Y data, but to return the correct results the following points are important:

- The weighted error values for each point are squared, so the weights are also squared, but the standard definition for weighted least squares applies the weight to the squared errors (see weighted linear least squares). The Linest function should therefore be passed the square root of the weights.
- The weights must also be applied to the intercept data (the column of ones), so the Linest Const value must be set to False, and the intercept column included in the X data, as for the second unweighted example.

The table of weight square roots may either be generated on the spreadsheet (Weighted Linest 1 above), or the square root can be applied within the Linest formula (Weighted Linest 2).

Results of VBA functions performing the least squares calculations (unweighted and weighted) are shown below:

Full open source code is included in the download file. Note that the results are identical to those found by Linest, but returned in the reverse order. For the weighted analysis the column of full weights is used as the input data.

The two screenshots below show an on-sheet calculation, using the same method as used in the VBA functions. These are also included in the download file.

The Python Scipy library includes a least squares function, which is included in the xlw-SciPy spreadsheet. A weighted version has now been added:

The Alglib library also has a least squares function, including both unweighted and weighted versions:

In the Alglib weighted function the weights are squared, as well as the error values (see Note 4 here). The square root of the weights should therefore be used for consistency with the other functions.

]]>

The first example uses the xlwings Fibonnaci sample (download fibonnaci.zip). The Python code must be amended as shown below, with the code for the standalone version commented out (or deleted), and code added to set up a “dummy caller”:

#if __name__ == "__main__": # Used for frozen executable # xl_fibonacci() if __name__ == '__main__': # Expects the Excel file next to this source file, adjust accordingly. xw.Book('fibonacci.xlsm').set_mock_caller() xl_fibonacci()

Note that:

- The code must be modified for each routine to be de-bugged, with the name of the Excel file calling the Python routine, and the name of the Python function.
- The current xlwings documentation, at the time of writing, has a typo. The code uses the file name ‘myfile.xlsxm’, rather than ‘myfile.xlsm’, which causes a file not found error if copy and pasted.
**Update 30 Jan 2017**: Now fixed in the docs for Version 0.10.3.

For a new installation of PyCharm the Python Interpreter must first be configured. When a new py file is opened the editor displays a “Configure Python Interpreter” link in the top-right corner, where you can connect to your Python executable, as shown in the screen-shot below (click on any image for a full-size view):

The chosen file can be set as the default with the File-Default Settings-Project Interpreter menu.

Having set the interpreter a de-bug session can be initiated by:

- Insert a break-point at the desired location in the code (click in the left hand margin).
- Use the Run-Debug menu to start the chosen routine:

It is then possible to step through the code using either the Run menu, the associated function keys, or the de-bug step icons under the main edit window.

The value of active variables is shown both adjacent to the code, and in the Variables window.

After the first de-bug run, Run and De-bug icons become active in the top right hand corner, and these can be used to start a new run.

De-bugging a user-defined function (UDF) has a couple of differences. The if __name__ == ‘__main__’ statement must be changed as shown below:

if __name__ == '__main__': xw.serve()

In the VBA code, the xlwings function Settings is amended with:

- UDF_DEBUG_SERVER = True

The de-bug process is now initiated in the same way as before. PyCharm will display:

Connected to pydev debugger (build 163.10154.50)

xlwings server running, clsid={506E67C3-55B5-48C3-A035-EED5DEEA7D6D}

To step through the chosen UDF, go to Excel, select any copy of the function in a worksheet, press F2 and then Enter (or Ctrl-Shift-Enter for an array function), as for a VBA function. PyCharm should then run to the first break point:

Stepping through the code then has the same options as when running a subroutine:

nbsp;

]]>

Alana Hicks is a friend of my daughter’s. This is her story:

… which reminded me of a song I heard once on the radio over 40 years ago, and I have always remembered. Words by Leonard Cohen, sung by Buffy St Marie:

]]>

The basis of the method is:

- Calculate the bending moment diagram for the real beam with the actual support conditions.
- Apply the bending moment diagram divided by EI to the “conjugate beam”, as a distributed load. The conjugate beam is an imaginary beam of the same length, with support conditions modified as described below. (E = elastic modulus; I = second moment of area. Note that both may vary along the length of the beam).
- Calculate the shear force and bending moment diagram for the conjugate beam. At any cross section the numerical value of the shear force is then equal to the slope of the real beam, and the bending moment is equal to the deflection of the real beam.

The changes to the support conditions in the conjugate beam are based on the following requirements:

- At any point where the deflection is zero the conjugate beam moment must be zero, requiring either a simple end support or free end, or an internal hinge.
- Where the end slope is zero the conjugate beam shear must be zero, requiring a free end.
- Similarly, where the deflection or slope is non-zero the conjugate beam must be able to generate a moment or shear force.
- Where there is a discontinuity in the slope (at an internal hinge) the conjugate beam must have a simple support.

These modifications to the support conditions are illustrated below (from the Wikipedia Article):

The spreadsheet ConjugateBeam.xlsb provides a simple example of the method applied to a simply supported beam with two point loads:

The shear and moment diagrams are calculated for the specified load positions and values, using the usual methods (Columns B and C above):

The bending moment due to the applied load is then divided by EI to give the applied load for the conjugate beam. For a simply supported beam the conjugate beam supports are unchanged, but we need to calculate the reaction force at the supports. A convenient way to do that is to treat the conjugate beam as a cantilever fixed at End 2, and calculate the shear and moment at End 2 (Columns E and F). The End 1 shear force for the simply supported beam is then minus this moment, divided by the beam length, and this force is applied along the full length of the beam(Column G and below):

The conjugate beam bending moment diagram is now found for the simply supported shear diagram (Column H and below):

Note that the bending moment at End 2 is exactly zero, as would be expected. The numerical values of the conjugate beam shear and bending moment are equal to the slope and displacement of the original beam.

An alternative calculation of the shear force at End 1 of the conjugate beam is shown below; taking moments about End 1, to find the reaction at End 2, and hence the End 1 force. In both cases the calculation is equivalent to calculating the deflection at the end of a cantilever, and dividing by the beam length to find the rotation required to return the beam to horizontal.

In general the maximum deflection of the beam will be intermediate between the two applied loads. The Excel solver has been set up in the spreadsheet to find this location by adjusting the value in cell A18 so that the conjugate beam shear (equal to the original beam slope) is equal to zero. This is the point of maximum bending moment in the conjugate beam, and maximum deflection in the original beam:

To run the solver, select the Data tab, click the solver icon (extreme right), then click solve. If the solver icon does not display the solver must be installed from the File-Options-Add ins menu.

]]>

- The structure stiffness matrix must be modified to allow for the increased flexibility of each member with any spring end releases.
- The nodal loads must also be adjusted, with the loads being those that would be generated by the applied loads on a member with the specified spring restraints, rather than fully fixed end conditions.
- The frame analysis returns the deflections and rotations of each node, so the additional deflections of beam ends with spring releases must be added after the global analysis, if deflections along the length of the beam are required.

The adjusted stiffness matrix for a 2D beam with a rotational spring release at end 1 is:

Ks is the spring stiffness in Moment/radian or Force/Length units.

For a 3D beam similar adjustments must be made for rotational and translation springs at both ends, for all three principal axes. The VBA code is:

Function AddSprings3(km, SpringA, NDim) Dim Beta As Double, OneOBeta As Double, Kt As Double, Ks As Double, i As Long, j As Long, BmEnd As Long, k As Long, i_s As Long Dim km2 As Variant, kms(1 To 4, 1 To 4) As Double, ii As Long, jj As Long, io As Long, jo As Long, kk As Long, ia As Variant Dim kmw As Variant If TypeName(km) = "Range" Then kmw = km.Value2 Else ReDim kmw(1 To 12, 1 To 12) For i = 1 To 12 For j = 1 To 12 kmw(i, j) = km(i, j) Next j Next i End If If TypeName(SpringA) = "Range" Then SpringA = SpringA.Value2 Select Case NDim Case 3 For i = 1 To 3 ' Check if any spring releases exist Select Case i Case 1 ia = Array(2, 4, 8, 10) Case 2 ia = Array(1, 5, 7, 11) Case 3 ia = Array(3, 6, 9, 12) End Select Ks = SpringA(1, ia(1)) + SpringA(1, ia(2)) + SpringA(1, ia(3)) + SpringA(1, ia(4)) If Ks > 0 Then ' Copy the stiffnes values for Axis i to a 4x4 array ReDim km2(1 To 4, 1 To 4) For ii = 1 To 4 For jj = 1 To 4 km2(ii, jj) = km(ia(ii), ia(jj)) Next jj Next ii For BmEnd = 1 To 2 kk = i If i < 3 Then kk = 3 - i Kt = SpringA(1, (BmEnd - 1) * 6 + kk) If Kt > 0 Then ' Adjust matrix for translational springs kk = (BmEnd * 2) - 1 Beta = Kt + km2(kk, kk) OneOBeta = 1 / Beta For ii = 1 To 4 kms(kk, ii) = OneOBeta * Kt * km2(kk, ii) If ii <> kk Then kms(ii, kk) = kms(kk, ii) Next ii For ii = 1 To 4 If ii <> kk Then For jj = 1 To 4 If jj <> kk Then kms(ii, jj) = OneOBeta * (Beta * km2(ii, jj) - km2(ii, kk) * km2(kk, jj)) Next jj End If Next ii For ii = 1 To 4 For jj = 1 To 4 km2(ii, jj) = kms(ii, jj) Next jj Next ii End If Ks = SpringA(1, (BmEnd - 1) * 6 + 3 + i) If Ks > 0 Then ' Adjust matrix for rotational springs kk = (BmEnd * 2) Beta = Ks + km2(kk, kk) OneOBeta = 1 / Beta For ii = 1 To 4 kms(kk, ii) = OneOBeta * Ks * km2(kk, ii) If ii <> kk Then kms(ii, kk) = kms(kk, ii) Next ii For ii = 1 To 4 If ii <> kk Then For jj = 1 To 4 If jj <> kk Then kms(ii, jj) = OneOBeta * (Beta * km2(ii, jj) - km2(ii, kk) * km2(kk, jj)) Next jj End If Next ii If BmEnd = 1 Then For ii = 1 To 4 For jj = 1 To 4 km2(ii, jj) = kms(ii, jj) Next jj Next ii End If End If Next BmEnd For ii = 1 To 4 For jj = 1 To 4 kmw(ia(ii), ia(jj)) = kms(ii, jj) Next jj Next ii End If Next i Case Else AddSprings3 = "Invalid NDim" End Select AddSprings3 = kmw End Function

Adjustments to the end forces are found using the REAct3D function, previously described here. The procedure is:

- For each principal axis, find the reaction force and moment at End 1, and the deflection and slope at End2 of the beam, due to the applied loading, treating the beam as a cantilever fixed at End1, with any specified spring releases.
- Find the deflection and rotation at End2 due to unit applied force and moment, including the effect of spring releases.
- Calculate the end loads at End 2 required to return the beam to zero deflection and rotation.
- Combine the loads from Steps 1 and 3.

Note that in the current version the spring stiffness is required to be greater than zero. Any end release with zero or negative stiffness, or left blank, is taken as a rigid connection.

The latest version of the spreadsheet, including full open-source code, can be downloaded from: 3DFrame.zip.

See 3DFrame with spring releases for more information, including links to installation instructions for the compiled solvers.

]]>

This puzzle is discussed (arriving at different conclusions) here:

and puzzles of this type even have their own Wikipedia article:

People discussing this problem tend to fall into one of two camps, and are convinced that the other camp is completely wrong, but the correct answer depends not just on what information is given in a particular version of the puzzle, but also on the factors that control what information is given.

To summarise the TED puzzle, a man has to decide if he is more likely to find a female frog in a group of two, one of which croaks like a male, or a single frog that is not croaking. The problem is that we do not know if female frogs croak, the frequency of croaking, or if being in a group of two affects the rate of croaking, but all these things affect the answer.

The explanation in the TED video appears to assume that only male frogs croak, and that when in a group of two, only one will croak, although this is not stated explicitly. Based on this they calculate a probability of 2/3 for one of the two frogs being female, but only 1/2 for the single frog being female.

The discussion at the second video on the other hand states that:

… so which (if either) is right?

One way to find out is to carefully tabulate all the possibilities, and calculate the probabilities of each, which is the approach used in the video links, arriving at different answers.

A simpler approach is to set up a computer simulation of the problem, and see what numbers come out, which is what:

Frog Croaks.xlsb

does.

The spreadsheet setup is shown below:

The spreadsheet is set up to model any situation where it is required to find a female, either from a group of 2 (assumed to be on the left), or a single specimen on the right. Obviously it could also be applied to any other situation with a binary choice and a 50/50 frequency. For each sample the spreadsheet generates 1000 random numbers between 0 and 1, and assumes a male for numbers below 0.5, or female for above. The following options are provided:

- Cell C1 is the “cut-off score”. The spreadsheet generates a second random number. If this is below the cut-off score the sex of the sample is treated as being known, otherwise it remains unknown. In the frog context this is equivalent to the frog croaking or not croaking.
- Cell E1 controls whether the cut-off score is applied to males only (only males croak), or both male and female (both croak, but with different croaks).
- The spreadsheet includes a macro to do multiple repeats of the analysis, for a range of different cut-off scores. Enter the number of repeats in cell P2, press Alt-F8, and select the “Repeats” macro.
- Results for a single run are displayed in cells K2 and L2, showing the probability of a female in the group of 2, on the left, and from the single sample on the right.
- The same results from the repeat analyses are in columns S and T, and in the graph below.

The screen shot above shows results if only male frogs croak, with a cut off score (equivalent to the probability of any individual male frog being heard to croak) in the range 0.1 to 0.8. It can be seen that the probability of a female increases from just over 50% to over 83%, but it is the same for the group of two (with a single croaking frog) and the single un-croaking frog.

If we assume that females croak at the same rate as males (with a different distinctive croak) then the probability of a female frog reduces to 50% for both the pair of frogs and the single frog, as shown below. The rate of croaking now makes no difference to the probability of a female, which makes sense because it is now assumed that females croak at the same rate as males:

So are there any circumstances where the conclusion reached in the original video (that the pair of frogs with at least one male is more likely to have a female) is correct? This would require that only males croaked, they only croaked when in a pair, and there was a 50% chance of a male frog in a pair being heard to croak. Under those conditions the probability of a female in the pair of frogs would be 2/3 (as stated in the TED video), and the probability of the single frog being female would be 1/2.

None of these details are stated or implied in the puzzle statement however, so the correct answer is that the man should go for the single frog on the right, since it is easier to catch and lick one frog than two.

]]>

]]>