I don't think is possible but I just wanted to check if someone knew better. Basically, I don't want to store a sub-routine in the code itself but in a text file and then, I guess, import that and have it run as if it were a sub-routine.
So, the file would look like this:
Private Sub AutoRunsWinsockProvidersTranslation()
AutoRuns.AutoRunsWinsockProviders(Me)
AutoRuns.AutoRunsWriteData(True, "Winsock Providers")
End Sub
And it would be saved as, say, AutoRunsWinsock.txt. I want to know if I could import that somehow at run-time and then reference that sub-routine name or not. I suspect the answer is no but want to check.
The reason for this, by the way, is that then I could write a lot of txt files for different bits I'd want out of my other code without having to include them all before publishing the app.
Related
Question
I would like to know whether it is possible to copy or extract the contents of the Immediate window in Excel VBA, so I can store it somewhere. I already know you can copy and paste from the window manually, I am interested in whether it is possible to do it with code (preferably in VBA itself).
Explanation
Questions similar to this have been asked a few times on SO (e.g. this and this), no-one has given a definitive answer and I was unable to find one from a quick search. Most of the time, answers respond asking why anyone would want to do that, and give ways to get around it in the circumstances provided in the question (e.g. how to output messages to a file or cell range). Given this, I have thought of a couple of example scenarios where someone might want to do this and cannot (easily) get around it.
Example scenarios
A) I am developing a large workbook including a large set of macros, debugging as I go. This includes using debug.print statements and directly querying in the Immediate window, e.g. ? myVar. At the end of the session, I would like to be able to automatically copy the contents of the immediate window into a log file, so I know what happened during my debug session afterwards. This could, for example, make use of the Workbook_BeforeClose event procedure.
B) I am working with two workbooks that contain VBA projects - one I can't edit, another that I can and am working on. The one I can't edit outputs debug information to the immediate window via debug.print that I would like to store somewhere (but I don't really care where).
Disclaimer
I ask this question purely out of curiosity. I suspect I already know the answer (it's not possible to do this), but I am not sure.
Yes-- but not with control-c .... select what you need and then drag and drop
1-Create a sheet named "debug.print"
2-Hide it:
Sheets("debug.print").Visible = 2 'xlSheetVeryHidden, only can be visible with vba
3-Create this function:
Function debug_print(c As String)
ThisWorkbook.Sheets("debug.print").[a1048576].End(xlUp).Offset(1).Value = c
Debug.Print c
End Function
4-Replace your codes "debug.print" to "debug_print"
5-Example:
Sub blablabla()
debug_print "i am doing whatever"
End Sub
But: Using "?" in the immediate window will not save
There is many ways to export this as file now like CSV, TXT, save in SQL etc...
My work has a Macro that we use to split combined mailing addresses out into multiple columns, but it is a little sloppy. I am looking to tighten up some of the search parameters, but I am not the one who initially wrote it so I am trying to figure some things out.
The thing I am looking at now is updating the city list in the Macro so that it will identify more cities. The trick is when I look at the Sheet that the process refers to, I cannot find an array or list with cities that the macro is checking against. It just has a bunch of sub processes that look empty to me. I am new to a lot of this so maybe I am missing something obvious.
The part of the module that references the worksheet looks like this:
CityList = shtCity.Range("CityList").Column
And the is no code in the module of the worksheet (shtCity)
I don't really know what I am looking at, so please let me know if there is any other information that I can collect to help resolve this.
Punch the following into the immediate window to see exactly where that range lives.
Debug.Print Range("CityList").Address
Alternative #1 - instead of using a debug.print you could put the same into a MSG box immediately before the module references that range
Alternative #2 - open shtCity and choose CTRL+F3 to see the named ranges.
Ok, so I am working on the very last part of my program and I am wondering if this is possible in VB and how to do it. I was thinking it was probably going to turn into a big If Statement, but I am not sure on the code to be exact.
Basically what I am trying to do is have my program write a new line of text into a .txt file once a day, I got that going good, but now what I want the program to do is to clear the entire .txt file at the start of each month, while also writing to the .txt file after the clear on the same day.
Is this possible? If so, could I get some help on this? Thank you!
Seems to me that it's as simple as this:
If Date.Now.Date.Day = 1 Then
File.Create(Path).Close() ' replace with your path to the file
End If
I am creating a VBA tool to record (for QA purposes) revisions of translated files.
I can read both original and revised text, whitch I do paragraph by paragraph.
But I run into problems every time the file cannot be written to (open by someone else or wasn't closed correctly).
Since the macro will run for a long time, this is an issue. I could work around it, but my client probably will not be able to follow the procedure.
Is there no way to just read the original text without having to modify the file?
It really feels that there should be a way. I serache for a way to copy the range into a dummy and then rever revisions on that new one, but no such luck.
I'm really just doing
set wrdApp=CreateObject("Word.Application")
set wrdDoc=wrdApp.Documents.Open(filePath)
for each par in wrdDoc.Paragraphs
if par.Range.Revisions.Count <> 0 then
dim original, revised as String
revised=par.Range.Text
par.Range.Revisions.RejectAll
original=par.Range.Text
ProcessRevision original, revised
End if
next
Thanks!
Answering it myself, bottom line is it can't be done. I run into some other issues and had to undo changes after rejecting revisions, but I still can't do it unless I have write permissions.
My solution to make sure the files were not open somewhere was to copy the files prior to reading.
It's frustrating that a clearly read operation (getting the original text) need write permission.
If I ever find another solution, I'll be sure to post here.
In a new excel spreadsheet, I have inserted a new module and entered a public sub. When trying to test, the sub does not appear in the macro list unless I remove the parameter.
This behaviour is bizarre and I cannot find any reference to it as an issue, everything I have read declares that subroutines (or functions, tried that too) can have parameters.
Public Sub RetrieveSIR() <-- Can be found
Public Sub RetrieveSIR( SIRNumber as Integer) <-- Cannot be found
It is driving me around the bend trying to work this out. If anyone can help, it would be much appreciated.
Subs with parameters won't show up in the macro list for the same reason you can't simply run a sub with parameters from the vba editor screen. They can only be called via code so the parameter required can be input.
Edit:
If for whatever reason you really need your macro to be in that macro list, you should make that parameter a variable in your macro and use an inputbox to specify it. That way when the user clicks the macro, they'll be prompted for the input and then the macro can run accordingly.
With regards to functions, you can have a function with parameters and use it as a formula in excel but as far as I'm aware they won't show up in the macro list either.