I have been able to work around both of the problems so far. They are detailed below. The code below has worked in several versions of OpenOffice and LibreOffice going back about 9 years. My concern is that there may be other changes to BASIC that will cause problems not yet uncovered. That is why I asked what was changed.
Issue 1:
This error message is generated by CALC when any macro is run:
‘BASIC syntax error.
Variable FunnelDamage already defined.
The solution I found was to change the name of the subroutine. The macro code is:
Sub FunnelDamage
Dim InitialFunnels as integer
Dim LostFunnels as single
Dim FunnelDamage as single
Dim FunnelFraction as single
The ‘single’ after ‘FunnelDamage’ was highlighted.
Issue 2:
This error message is generated by my macro code as a msgbox:
Version missmatch, Scenario: V11 Code:
There should be a version number after ‘Code:’. This indicates a null string was returned by the LoadScenarioSub subroutine, which is in macro ‘Load’ in dialog ‘Scenario’. The variable ‘versionscenariocode’ is defined as a Global in a macro in another dialog. I found two ways to fix the problem:
- Duplicate the global statements in the ‘Scenario’ dialog’
- Combine all the macros in the same dialog.
REM ***** BASIC *****
Function LoadScenario ’ Called from spreadsheet macro button
If notdoneyet = 0 Then
notdoneyet = 1
versionscenariocode = "V11"
yesnotext = "Load a new scenario?"
Call YesNoMsgBox("Load "+versionscenariocode+" scenario",16)
If yesnoreturn = 6 Then
ButtonSheet = ThisComponent.Sheets.getByName("Buttons") ' Sheet 6, Scenario
oCell = GetCellByName(ButtonSheet, "subrunning2")
oCell.setPropertyValue( "CellBackColor", RGB( 0, 0, 255 ) )
Call LoadScenarioSub
ButtonSheet = ThisComponent.Sheets.getByName("Buttons") ' Sheet 6, Scenario
oCell = GetCellByName(ButtonSheet, "subrunning2")
oCell.setPropertyValue( "CellBackColor", RGB( 255, 255, 255 ) )
Endif
notdoneyet = 0
Endif
End Function 'LoadScenario
Function LoadScenarioSub
Dim CellRange as object
Dim oCell as Object
Dim oRow as integer
Dim oCol as integer
Dim LastShip as integer
Dim LastSide1 as integer
Dim LastSide2 as integer
Dim Ploteast as integer
Dim Plotnorth as integer
Dim Refeast as integer
Dim Refnorth as integer
Dim radperdeg as double
Dim sName as string
Dim dummytext as string
Dim ScenarioName as string
Dim ScenarioDesc as string
Dim ScenarioDate as integer
Dim scenariohour as integer
Dim scenariomin as integer
Dim minvisr as integer
Dim maxvisr as integer
Dim winddir as integer
Dim windspd as integer
Dim seastate as integer
Dim sside as integer
Dim refitflag as string
Dim shipname as string
Dim shipclass as integer
Dim shipclassrow as integer
Dim fceff as single
Dim Side1Name as string
Dim Side2Name as string
Dim ForceName1 as string
Dim formation as integer
Dim maxspeedcode as single
Dim shore1east(10) as single
Dim shore1north(10) as single
Dim shore2east(10) as single
Dim shore2north(10) as single
Dim obstructeast(10) as single
Dim obstructnorth(10) as single
Dim obstructradius(10) as single
Dim cellnamestring as string
Dim infile as string
Dim PrimaryTypeSelected as integer
Dim SecondaryTypeSelected as integer
Dim TertiaryTypeSelected as integer
Dim BoatsperDDTBunit as integer
Dim TorpedoTypeSelected as integer
Dim ColumnDistance as integer
Dim ScreenDistance as single
Dim dummy as integer
Dim shorepresentflag as integer
Dim minespresentflag as integer
Dim shoalspresentflag as integer
Dim islandspresentflag as integer
Dim shorefloat as integer
Dim screenorder1 as integer
Dim screenorder2 as integer
Dim shipnation as integer
Dim Ship_number(150) as integer
Dim ShipForce(150) as integer
Dim Guide_n_value as integer
Dim Bearingfromguide as integer
Dim bestdirectionchange as integer
Dim Distancefromguide as single
Dim Shiptype as integer
Dim LargestShipType1 as integer
Dim LargestShipType2 as integer
Dim ERoverride as integer
Dim ForceFlagship(6) as integer
Dim ForceName(6) as string
Dim LargestShipType(6) as integer
Dim PriDirector as integer
Dim SecDirector as integer
Dim TerDirector as integer
Dim APHEFraction as single
Dim OperationMode as integer
Dim Force as integer
infile = ChoseAFileName
If infile = "nullfile" Then
Msgbox("No file chosen")
Exit Function
Endif
filenumber = Freefile
open infile for input as filenumber
Input #filenumber, versionscenario
If versionscenario <> versionscenariocode Then
Msgbox("Version missmatch. Scenario: " + versionscenario + " Code: " + versionscenariocode)
Exit Function
Endif