VBA simple parse - html

I am using vba ( & internetexplorer object) to convert CSUIP to ISIN (these are financial security unique identification codes) from the following website http://www.isincodes.net/convert-cusip-to-isin.php.
I have so far created a vba code (in following order) that:
1. manipulates the US/CA dropdown box
2. inputs my CUSIP into the inputbox
3. clicks the "Covert"Button
Sub cusip_is2()
'declare variables
Set objie = CreateObject("internetExplorer.Application")
objie.Visible = True
'go to website
objie.navigate ("http://www.isincodes.net/convert-cusip-to-isin.php")
Do
DoEvents
Loop Until objie.readyState = 4
'input the CA in the country ID step1
objie.document.getelementbyID("country").Value = "CA"
'input 912796HQ5 in text box as desired CUSIP to convert
objie.document.getelementbyID("appendedInputButton").Value = "912796HQ5"
'press the button to convert
Set ElementCol = objie.document.getElementsByTagName("button")
For Each btnInput In ElementCol
btnInput.Click
Next btnInput
'wait until the pages loads (not sure if I need this)
Do
DoEvents
Loop Until objie.readyState = 4
'added extra few seconds incase HMTL document is updating
Application.Wait Now + TimeSerial(0, 0, 1)
'created userform to look at the data to see if I can find the converted CUSIP - WHICH I CANNOT (HELPPPPP!!!!)
Userfrom_Web_Code.Textbox_Webform.Text = objie.body.innerText
Userfrom_Web_Code.Show
'clean up and try again for the next failure LOL
objie.Quit
Set objie = Nothing
End Sub
From my research I know that I keep getting the source code but I want the DOM, this is where I am having trouble. Please see EXTRACT of source code on the website once I have inputted "CA" for country and the CUSIP "912796HQ5", and note that the id tag with results contains nothing.
<p>Enter a CUSIP and a correct ISIN will be calculated for you, if possible:</p>
<form class="form-inline">
<div class="input-append">
<select id="country" style="width:60px;">
<option value="CA">CA</option>
<option value="US" selected>US</option>
</select>
<input type="text" maxlength="9" class="span3" id="appendedInputButton">
<button type="button" class="btn">Convert</button>
</div>
</form>
<div id="results"></div>
<br><br>
</div>
<div class="span4">
<h4>What is a CUSIP?</h4>
<p>A CUSIP is a 9-character alphanumeric code which identifies a North American financial security.</p>
<p>
A CUSIP consists of three parts:<br>
• A six-character issuer code<br>
• A two-character issue number<br>
• A single check digit.<br><br>
For example: 780259206 (Royal Dutch Shell-A)
</p>
conversely when I check the inspect element which takes me to the "DOM" then I can see this under id results.
<div id="results" style="display: block;"><br>
<b>Strict Standards</b>: Non-static method Validate_CUSIP::validate() should not be called statically in <b>/home/isincode/public_html/action/c.php</b> on line <b>15</b><br>
<p class="text-success"><strong>Correct ISIN: CA912796HQ58</strong></p></div>
Can anyone please help me solve this problem in vba.
Note that I know that you can create an algorithm yourself in vba/excel to do the conversion of CUSIP to ISIN however I want to do this project in VBA to learn parsing. I am also very new to coding and have had limited exposure to please be kind and explain everything you suggest.

Please see if the following edit will suit you:
....
....
'added extra few seconds incase HMTL document is updated
Application.Wait Now + TimeSerial(0, 0, 2)
Dim ISIN As String
ISIN = Right(objie.document.getelementbyID("results").innerText,12) 'the 12 rightmost characters
Debug.Print "ISIN you are looking for is: " & ISIN
....
Edit the code to do something usefull with the ISIN-string

Related

How to display Success message after clicking Save in HTML page

I have an html form containing this code which runs on IIS:
<form action="http://server1/data.asp" method="POST">
Your Name: <input name="name" type="text">
<input value="Save" type="submit">
</form>
After user submits this form it runs the code in data.asp which displays a Success message with code to write to a text file (file1.txt):
Success!
<%
Dim fso
Dim tst
Set fso=Server.CreateObject("Scripting.FileSystemObject")
Set tst = fso.OpenTextFile("C:\Inetpub\wwwroot\data\file1.txt", 8, true)
tst.writeline "Name = " & Request.Form("name")
tst.writeline "" & Request.Form("")
tst.close
Set tst = Nothing
Set fso = Nothing
%>
This works but it just shows a page with Success! and stays there. What I'd really like is:
After user submits the form by clicking Save I'd like a little message box that says "Success" and remain on the same html page or go to a url I specify within the code.
I don't want to use Java or 3rd party extensions. This is an HTML page that runs the data.asp page on submit and I'd like it to stay that way if possible.
So how would I modify the html and/or data.asp page to do this?
You can do like this:
Response.Redirect "https://www.yoursite.com/thankyou.asp"
Instead of returning "Success!" as your response content you can return the form content you have above, this way you can use the same file for the GET and POST methods, with an condition on your asp logic to execute only on POST requests and return a success alert when the code is excuted successfully.
<form action="http://server1/index.asp" method="POST">
Your Name: <input name="name" type="text">
<input value="Save" type="submit">
</form>
<%
If (Request.Method = "POST") Then
Dim fso
Dim tst
Set fso=Server.CreateObject("Scripting.FileSystemObject")
Set tst = fso.OpenTextFile("C:\Inetpub\wwwroot\data\file1.txt", 8, true)
tst.writeline "Name = " & Request.Form("name")
tst.writeline "" & Request.Form("")
tst.close
Set tst = Nothing
Set fso = Nothing
response.write ("<script>alert('Success!');</script>")
End If
%>
Found the solution by adding an extra page to the mix (redir2form.asp):
in data.asp:
<%
Dim fso
Dim tst
Set fso=Server.CreateObject("Scripting.FileSystemObject")
Set tst = fso.OpenTextFile("C:\Inetpub\wwwroot\data\file1.txt", 8, true)
tst.writeline "Name = " & Request.Form("name")
tst.writeline "" & Request.Form("")
tst.close
Set tst = Nothing
Set fso = Nothing
%>
Response.Redirect "http://server1/redir2form.asp"
in redir2form.asp:
<%
response.write ("<script>alert('Success!');</script>")
%>
<meta http-equiv="refresh" content="1; url=http://server1/index.htm" />
Index.htm has the form action going to the data.asp page.
Not as neat as it could be but that's how I got it to work. After a user submits the form he gets the "Success!" message box and once they click OK they're redirected back to the form page.

Trying to get html Dropbox (2 step) working with vba code

Trying to get a dropbox working from vba code but it seems to have a two-step process before the drop box opens. (Like authentication, the displays a box about the dropbox so you can select and it inserts it into the box. But it is all in the one dropbox, but I think the authentication side is hidden. I can get a basic Dropbox to work with indexes but this one has me stumped. I do not fully understand as fairly new to VBA > HTML side of things.
But my understanding is "SchProgramID" is the authentication or filter code then once it has received that the "TrainerId" will open to give you selected names of which is filtered into a box as you type or you can be selected with a mouse from the list.
I cannot even get focus on either.
Can someone please help me?
The html code from the site is as follows:
<div class="form-group">
<label class="control-label col-md-2" for="TrainerId">Trainor</label>
<div class="col-md-8">
<select class="form-control chosen-select" data-live-search="true" data-val="true" data-val-number="The field Trainor must be a number." data-val-required="The Trainor field is required." id="TrainerId" name="TrainerId"><option value="">Select Trainor</option>
<option value="176">Undrico Divina Corpuz Jr.</option>
<option value="204">Domingo Bagadiong Go Jr.</option>
<option value="1200">Marnilo Sayson Sugano </option>
<option value="1238">Dexter Gaoiran Tomas </option>
Code I have been playing with
'Dim fromSelect, fromSelect1 As HTMLSelectElement
'Dim evt, evt1 As Object
'Set evt = htmlDoc.createEvent("HTMLEvents")
'Set evt1 = htmlDoc.createEvent("HTMLEvents")
'evt.initEvent "change", True, False
'evt1.initEvent "change", True, False
'Set fromSelect = htmlDoc.getElementById("SchProgramId")
'OptionValue = "14526"
'If optionIndex >= 0 Then
' fromSelect.selectedIndex = OptionValue
' fromSelect.dispatchEvent evt
'Set fromSelect1 = htmlDoc.getElementById("TrainerId")
'OptionValue = "9570"
If optionIndex >= 0 Then
' fromSelect.selectedIndex = OptionValue
' fromSelect.dispatchEvent evt1
end if
I am not clear on the role of SchProgramId at present.
For showing the dropdown you should be able to use:
ie.document.getElementById("TrainerId").Click
For selecting elements in the dropdown you should be able to target the value attribute by its value e.g. 1421 for the first trainer (or by index)
ie.document.querySelector("#TrainerId option[value='1421']").Selected = True
Example using index:
ie.document.querySelector("#TrainerId").selectedIndex = 2

How to call html form fields in vbscript dynamically in a loop

So I have an html form created in classic asp that has about 25 check boxes with different labels. The checkboxes are written to the page via a loop that grabs the label values from a table and each checkbox is named similarly ("decreason1","decreason2","decreason3",ect...) using a loop variable.
I use a vbscript at the end of the page to validate the data on the page before passing with a submit button. I need to make sure that at least one of the checkboxes is checked before submitting the form.
dim i, checkedvalue ;
checkedvalue = false
for i = 1 to 25
if document.rtftadd.decreason1.checked = true then
checkedvalue = true
end if
next
I need the "document.rtftadd.decreason1.checked" to change with the loop to decreason2, decreason3
I'm not sure how to go about doing that.
Any help would be greatly appreciated.
There are a few different ways to do this and if you are seeking a validation method prior to form submission then JavaScript may be a better solution.
However, in an effort to address your question using only ASP Server side code for VBScript and considering your question suggest that you do not care which box is selected nor how many are selected then the following code may be a working solution for you.
By looking at all of the elements sent via the form and checking if your form name (without number) exist then this same block of code will work even if you increase or decrease the number of check boxes you are validating for input.
<%#LANGUAGE="VBSCRIPT"%>
<%
dim checkedvalue
checkedvalue = false
if request("btn1") = "Submit" then
For each item in request.form
if instr(item,"decreason") > 0 then
checkedvalue = true
end if
next
response.write "Checked Value = " & checkedvalue & "<br><br>"
end if
%>
<html>
<head></head>
<body>
<form method="post" action="index.asp" name="rtftadd">
<input type="checkbox" name="decreason1"> Box 1<br>
<input type="checkbox" name="decreason2"> Box 2<br>
<input type="checkbox" name="decreason3"> Box 3<br>
<input type="checkbox" name="decreason4"> Box 4<br>
<input type="checkbox" name="decreason5"> Box 5<br>
<br>
<input type="submit" value="Submit" name="btn1">
</form>
</body>
</html>

How to extract innerText of "Who was your first employer? into Excel from the given HTML

<div class="ContainerFieldControlHoriz" style="width: 400px;">
<label title="Who was your first employer?" id="dnn_ctr1854_ChallengeQuestion_ChallengeQuestionCmnTextBox_ControlLabel">Who was your first employer?</label>
</div>
My code was
Set htmlsecurityquestion = htmldoc.getElementById("dnn_ctr1854_ChallengeQuestion_ChallengeQuestionCmnTextBox_ControlLabel")
Range("A1").Value = htmlsecurityquestion.innerText
but it is not working
You access this value through attributes collection, not through innerText. Your second line should be:
Range("A1").Value = htmlsecurityquestion.Attributes["title"].Value;

onclick submit button vba html

I have an HTML page that has multilpe submit buttons with different "value=xxx" parameters. I need to submit the form with the right value via VBA code in MSAccess module!
<form method="post" name="data" action="/data1/infoProjetFO.php" onsubmit="return(checkPQ())" >
<input type="submit" name="Btn" value="SaveRecord">
<input TYPE="submit" name="Btn" VALUE="Distribution" id="idBtnDistribution" style="visibility:visible;" />&nbsp
'========================================================
sURL = "http://corp.myintrranet.com/index.php"
Set tBrowser = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
tBrowser.navigate sURL
' Wait till the Browser is loaded
Do While tBrowser.Busy Or tBrowser.ReadyState <> 4
DoEvents
Debug.Print tBrowser.ReadyState
Loop
' here I have code that can get different values and also insert values with no problem!
'here is what I've tried!
tBrowser.Document.Forms("data").all("Btn").Value = "SaveRecord"
tBrowser.Document.Forms("data").all("Btn").Click
' or I tried
tBrowser.Document.Forms("data").all("Btn").submit
combinations I've tried to insert the proper submit button value result in trapping error code 438, object doesn't support ....
So I need to click or submit with the right value!
Thanks
Pete
Found the solution!
Set Formtst = tBrowser.Document.getElementsByTagName("input")
For Each btest In Formtst
If btest.Value = "SaveRecord" Then
btest.Click
Exit For
End If
Next
Thanks
Pete