At the company where I work (temporary gap-year job), there are several programs we use for automating various laborious procedures. These have been developed by various university engineering students over the years, and mostly work as well as can be expected.
Unfortunately I am having several problems with the programs, preventing me from working properly (e.g. requiring the user to try to close it at least twice before anything actually closes).
So, knowing a fair bit of programming, I had the crazy notion that maybe I could maybe fix some of the bugs, maybe even speed it up a little. So I delved into the source code...
Here is a function from an obscure .vb file somewhere in the depths of the application (which basically extracts data from a couple of hundred xml files and puts it all into an excel spreadsheet).
Public Sub DealWithTheBackgroundDataExtractionAndProcessingThread (ByVal state As BackgroundProcessingStates)
Try
ExtractDataThread.Abort()
Catch
Exit Sub
End Try
If BackgroundProcessingState = BackgroundProcessingStates.ProcessingOff Then
MotherForm.DefInstance.BPOnMenuItemButton.Checked = False
MotherForm.DefInstance.BPPartialMenuItemButton.Checked = False
MotherForm.DefInstance.BPOffMenuItemButton.Checked = True
ElseIf BackgroundProcessingState = BackgroundProcessingStates.ProcessingPartial Then
MotherForm.DefInstance.BPOnMenuItemButton.Checked = False
MotherForm.DefInstance.BPPartialMenuItemButton.Checked = True
MotherForm.DefInstance.BPOffMenuItemButton.Checked = False
ElseIf BackgroundProcessingState = BackgroundProcessingStates.ProcessingOn Then
MotherForm.DefInstance.BPOnMenuItemButton.Checked = True
MotherForm.DefInstance.BPPartialMenuItemButton.Checked = False
MotherForm.DefInstance.BPOffMenuItemButton.Checked = False
End If
If BackgroundProcessingState = BackgroundProcessingStates.ProcessingOff Or AnalysisInProcess Then
Exit Sub
End If
ExtractDataThread = New System.Threading.Thread(AddressOf BackgroundDataExtraction)
ExtractDataThread.Start()
End Sub
This function is called by just about every gui-related function in the program, most of the time with the parameter (which you may notice is completely ignored) sent as the global variable BackgroundProcessingState. This global variable is incidentally never initialized, so is always set to whatever enumerates to 0...
TRWTF is the exporting procedure itself. The boss asked for a nice tag based system, where cells in excel are given names such as R_FLC_0_64_55 to indicate exactly what data needs to be put there; each underscore delimited element is a setting from the measurement.
Because of the dynamic nature of these tags, only the elements could be hard coded into the program; each tag must be read from the spreadsheet and deconstructed. How do you get a list of all cell names in a workbook? Easy, you get the user to enter top left and bottom right 'coordinates' (without any explanation as to what they are for) and search every cell in that range until you finds one with a name. Gah!
Here is another one, this time from the wonderful language that is Sax Basic. This was supposed to be a set of macros that takes a whole load of measurements over the course of a day, analyses them, then exports the data to excel.
To be fair, the program was not finished (it is my job to complete rewrite it), but somebody obviously didn't quite think through their methodology...
If MeasnumberMax >= 1 Then
'Thinking about this perhaps we should have done something with array depth to save a lot of code down here
'hSheet.Cells(SerialFull, ReportLocation1Full).Value = 'need to save serial number
hSheet.Cells(ReportLocation1Full, xLocationFull).Value = ReportLocation1XMax
hSheet.Cells(ReportLocation1Full, yLocationFull).Value = ReportLocation1YMax
hSheet.Cells(ReportLocation1Full, frequencyFull).Value = ReportLocation1PeakF
hSheet.Cells(ReportLocation1Full, amplatudeFull).Value = ReportLocation1PeakA
End If
If MeasnumberMax >= 2 Then
'hSheet.Cells(SerialFull, (ReportLocation1Full + 1)).Value = 'need to save serial number
hSheet.Cells((ReportLocation1Full + 1), xLocationFull).Value = ReportLocation2XMax
hSheet.Cells((ReportLocation1Full + 1), yLocationFull).Value = ReportLocation2YMax
hSheet.Cells((ReportLocation1Full + 1), frequencyFull).Value = ReportLocation2PeakF
hSheet.Cells((ReportLocation1Full + 1), amplatudeFull).Value = ReportLocation2PeakA
End If
If MeasnumberMax >= 3 Then
'hSheet.Cells(SerialFull, (ReportLocation1Full + 2)).Value = 'need to save serial number
hSheet.Cells((ReportLocation1Full + 2), xLocationFull).Value = ReportLocation3XMax
hSheet.Cells((ReportLocation1Full + 2), yLocationFull).Value = ReportLocation3YMax
hSheet.Cells((ReportLocation1Full + 2), frequencyFull).Value = ReportLocation3PeakF
hSheet.Cells((ReportLocation1Full + 2), amplatudeFull).Value = ReportLocation3PeakA
End If
If MeasnumberMax >= 4 Then
'hSheet.Cells(SerialFull, (ReportLocation1Full + 3)).Value = 'need to save serial number
hSheet.Cells((ReportLocation1Full + 3), xLocationFull).Value = ReportLocation4XMax
hSheet.Cells((ReportLocation1Full + 3), yLocationFull).Value = ReportLocation4YMax
hSheet.Cells((ReportLocation1Full + 3), frequencyFull).Value = ReportLocation4PeakF
hSheet.Cells((ReportLocation1Full + 3), amplatudeFull).Value = ReportLocation4PeakA
End If
If MeasnumberMax >= 5 Then
'hSheet.Cells(SerialFull, (ReportLocation1Full + 4)).Value = 'need to save serial number
hSheet.Cells((ReportLocation1Full + 4), xLocationFull).Value = ReportLocation5XMax
hSheet.Cells((ReportLocation1Full + 4), yLocationFull).Value = ReportLocation5YMax
hSheet.Cells((ReportLocation1Full + 4), frequencyFull).Value = ReportLocation5PeakF
hSheet.Cells((ReportLocation1Full + 4), amplatudeFull).Value = ReportLocation5PeakA
End If
If MeasnumberMax >= 6 Then
'hSheet.Cells(SerialFull, (ReportLocation1Full + 5)).Value = 'need to save serial number
hSheet.Cells((ReportLocation1Full + 5), xLocationFull).Value = ReportLocation6XMax
hSheet.Cells((ReportLocation1Full + 5), yLocationFull).Value = ReportLocation6YMax
hSheet.Cells((ReportLocation1Full + 5), frequencyFull).Value = ReportLocation6PeakF
hSheet.Cells((ReportLocation1Full + 5), amplatudeFull).Value = ReportLocation6PeakA
End If
Basically, the previous student was expecting the user to enter X and Y coordinates (not cell references) for each of the six measurements. This kind of code was all through the macro, first for just checking all the cells exist, then that they are empty, and finally for writing the data to them (as shown).
Well, so long as it works (I hear you say)... WRONG! The actual testing procedure can be anything up to 30 separate results in one batch!
Judging by the comment, I assume he realised his mistake before it was too late; I dread to think what I would have done if this file was five times larger than it already is...
I want to cry.