This hopefully is a simple question with a simple answer. If I have a list box or something that has a list of like 4 years (like 2006 through 2009), how do I programmatically make variables of these years with names like pTable2006, pTable2007, etc (as ITable of course).
If this isn't possible and I have publicly declared these tables in the declarations (like pTable2006 as ITable, pTable2007 as ITable, etc), how can I programmatically assign these variables based on user choice? What I'm asking is, if the user wants to choose years 2006 and 2007, how can I write this:
pTable & ListBox.Items.Item(0) = [table path string] & ListBox.Items.Item(0)
(please ignore the syntax of the "listbox", I'm just trying to come up with an example)
I hope that makes sense. I'm not sure the best way to ask that, but whenever I put something like pTable & "string", I get an error.
Thanks,
Adrian
I'd consider using a generic dictionary of ITable where "2005" would be the key.
http://adventuresdotnet.blogspot.com/2007/10/vbnet-generic-dictionaries.html
Related
Sometimes when developing you find that typical property names show up in lower case.
TempVars.Item("abc")
Might appear like this.
TempVars.item("abc")
Or
tbxMyTextbox.Value
Shows up as
tbxMyTextbox.value
The question is why does this happen and how do you fix it?
I've asked myself this question several times and seen others ask it in SO and elsewhere. In most cases the question comes up when searching for answers on other coding errors. Sometimes the developer (me too) wonders if there's something wrong that they're missing that causes this lower case issue.
A while back I ran across an answer (I'll add the original reference when I run across it again) that made the most sense and actually allowed me to correct this nagging issue.
Apparently it happens when you use a variable in lower case that has a name that's the same as a property.
So
Dim value as string
will result in
myObject.Value
appearing as
myObject.value
Solution?
Because VBE apparently considers this variable across the entire IDE -- apparently without regard to scope; the way to revert to the proper case is to temporarily create the variable in upper case and avoid naming variables with the same name as existing properties in your application.
So the solution for the .value / .Value issue above would be to temporarily include the line
Dim Value as string
in a module within your app. Run the code that includes this line.
Afterwards, remove this temporary line of code.
Then as hoped, .value properties will again appear as .Value and not .value.
Of course, we should avoid those reserved words in the first place, but if at some point that wasn't done the above should fix the issue.
Here are some reserved word links:
Microsoft - Access 2002 & later
Allen Browne's bad word list
Reserved Word search tool (various languages)
Thanks to #ScottCraner for the nudge about avoiding reserved words.
Try something like this:
CallByName(myObject, "value", VbGet)
I have created few Constants (VBA identifiers declared with the key word Const) that look like Rg_Euro, Rg_Usd, Rg_Cad, ... to define specific regions into my workbook.
As I have these "extensions" (Euro, Usd, Cad, ...) in the DataBase that I'm working with, I tried to get the values of my constant by creating a string like this : Str = "Rg_" & extension(i)
But I can't seem to find a workaround to call the Constant and get its value from it... I'm googled it but didn't found what I was looking for and I'm starting to think that it might not be possible directly...
I thought of a User Defined Function with a Select Case on the String to return the right value, but it is just going to add another function, so I'm looking for a more direct solution if there is one!
I'm not a pro and my answer it's only what I've done to solve a similar problem, anyway, I hope it helps:
You can add controls (for example Textbox) named as your constants and set the value you need, then you'll be able to catch any value with this:
Me.Controls("RG_" & extension(i)).text
Background: Novice user and VBA programmer - be gentle, please.
Scenario:
Using a Visio (2010) straight line connector;
Currently 1-D Endpoints.BeginX is as follows:
=PAR(PNT(Milestone.40!Connections.X1,Milestone.40!Connections.Y1))
What I have:
A data field in the same shape called BeginItem that contains the Visio ID (e.g. 87) of Milestone.40! above.
What I need to know:
If possible, how to change the formula in 1-D Endpoints.BeginX to something like:
=PAR(PNT(BeginItemValue!Connections.X1,BeginItemValue!Connections.Y1))
and if not possible, is there an alternative way of doing this?
Thanks!
Thanks for helping all. A combination of all advice led me to an alternative solution.
Instead of trying to refer to the field in the Shapesheet that does contain the BeginItemValue, I built the entire string (in VBA) by concatenating the parts and then updated the BeginX value with it.
shpObj.Cells("BeginX").Formula = "=PAR(PNT(" & BeginItemValue & "!Connections.X1," & BeginItemValue & "!Connections.Y1))"
That worked well, although I'm sure there are easier ways of doing it.
I'm basically trying to create a program that will allow me to use textboxes to input questions and associated answers to test myself. Mostly, I just want to practice some things I've been learning for vb.net while taking an extra step forward.
Here's a mockup:
Any tips on how to do this? What I'm especially not sure about is how to have the textfile save/import work with adding back into comboboxes and making sure the correct questions and answers are associated with one another. I was thinking also that I could have some sort of check when I import a save file that shows me which questions and answers refer to one another
Update on form design:
Some things I'm trying to practice:
Using arrays
Saving/Opening files (text files in this)- in order to import into program
importing into program
Using the progress bar
Having a way to undo entries
Randomizing sort order in the combo box
Maintaining references between variables (like which answer
corresponds with which question) regardless of sort order or using
the undo function
Some posts in stackoverflow I'm thinking of using as reference:
Compare String with Strings in array
Best way to associate two strings of text in VB.NET
Array to combo box?
Update: Trying to be more specific on my question. Basically, I'm trying to use a list to account for all the inputted questions and answers, however I've only used really basic arrays before, like:
val(1) = "test"
val(2) = "this"
val(3) = "string"
Or the kind where you use a For x to z loop. Based on some stackoverflow posts I've gotten to the point where the code works in that (I think?) the list is updated and the combobox for questions and answers reflect what is on the list. However, I can't connect the two so that I can select things in the comboboxes and check if they are correct.
In terms of saving as a text file. I figured it would be simpler. Basically, have it output sort of like
"question goes here" ; "answer goes here"
"next question goes here" ; "answer goes here"
and so on. Then I can use the semicolon as reference in the code when importing. I've never done it before, but it's generally what I do for Microsoft Access or Excel text imports so I figured it was possible.
Code that I have so far (reddit post link): http://redd.it/2716tw
This question already has answers here:
How To Get Control Property by "String Name"?
(6 answers)
Closed 9 years ago.
Is there some way in Visual Basic/Studio to find an object using a string?
I want to use it so that i can find objects by concatenating a variable with it.
Something along the lines of:
[Variable & "Main"].Visible = true
Just to elaborate, I don't want to use a table that iterates through all the objects in the form.
This is in VB.net. Any help?
Yes there is a way
Me.Controls(Variable & "Main").Visible = true
See Control.Controls property on MSDN
I don't have any official posting from a Microsoft website, but in my experience this is not possible. I would equate it to trying to use a string as a table name in SQL Server. One option is that you could iterate through the controls on the page (I'm guessing by the .Visible = true that you are dealing with controls) and look for a matching control ID. If found you will then have access to the properties for that control. Let me know if you would like to see an example. I'm not at a pc with Visual Studio so it would not be until tomorrow.