Hmmmm - - - I suspect that you (both) have mis-understood what the Proc is intended to do.
I often wish to create .CSV files for very disparate data but ALL will need the CSV File to be created. You have both added into to the 'Create' Proc a section to 'Write' data to it - ie.
if Result then begin
/// write your stuff here ///
system.Close(CSVFile);
end
That defeats my object. The amount of processing of data needed at /// write your stuff here /// could well be 10 or 1000 lines - and be very different for each application. In this project there is actually only one needed but in other projects I have many different potential files.
I considered setting up a 'generic' 'Create File' proc to be a benefit over writing an 'Open File' for each different need.
The issue about "hard interrupt" had not occured to me and I'm still not sure what negative effect it might have - in my 'use' pattern. The effect that I see is that the user is alerted to the fact that a file with the same name is already 'Open' - which they may well have totally forgotten - so they simply close it and request a new one; or they may use the data that is already known. Either way, it's no great issue.
As I've said previously, using a Time-stamp is a means by which duplicate file-names can be automatically avoided, but there are occasions when that is more cumbersome.
I am aware that there are newer ways of creating/opening files without resorting to the {$I-} {$I+} system but - as with getting from A to B - the best route is the one that you already know well 
I've just received your extended response @Zvoni but I hope that my further explanation of my thinking makes that less relevant - I'll agree that the 'failure' may not be due to the file actually being open in Excel; but that has been the case in practice - and yes I do have knowledge of the IOResult return codes - I go back far enough to have a list, my 'Go To' Reference is the Turbo Pascal 4 Manual 
No worries.
As i said: It's your Program, it's your call. And if you are familiar with it, all the better.
It's just, that for me (and in that way IMO), such a ShowMessage inside a Procedure call, is like in OO-Programming the age-old discussion "a Child should never update the parent":
In your particular case, the CALLING code would be the parent, your Procedure the child.
Because in any way you look at it: Irrespective of the "Result" of your Procedure, Code-Execution WILL RETURN to the calling code and continue there.
Why did i nitpick on this?
The one thing giving it away for me is your "FN"-Proc-Argument, which you return to the caller (it's "var"), which to me implies you want to do something with it after its (potential) transformation!
And this is what i meant with "unintended effects" that can happen (though i don't know your code), when (not If) the code returns to the caller.
You pass the FileName, your Procedure transforms it, but it fails to create the CSV, for whatever reason (Already, open, Writeprotected file, writeprotected Folder!)
Your Proc tells the User "OOPPS" (The ShowMessage) and then returns to the Caller, shipping the (transformed) FileName back!
The Moment your execution returns to the calling code, the calling code doesn't know about the Error anymore (well, except if you use some "global" variable, but....that....honestly....brrrrr)
It's what i learned about "defensive" programming: put code that might fail into a function, returning a "state" (Try/Finally/Except not withstanding inside such a Function), but it's always the CALLER's duty to "judge" the Result
as to your argument, you might have 10 lines of code or 1000 LoC in that "//write stuff here"-Part, is a non-argument, because it comes AFTER the potential Error, which means you can happily "outsource" those 1000 Lines of Code to another Procedure again.
In a nutshell for such an approach: You would need a "generic" interface for such a Procedure, meaning: the Argument-In and optional Argument-out should be the same for all needed "variants"
As i said: Your Program, your Call.
Just different "philosophies" if you want...
