Loop through all cells in a table from Outlook email - vba

I have a standardized email that is sent to me that contains a table (11R x 3C) of which I only require the information from a couple of specific cells.
The table format from the email as follows.
1 |<Empty> |<Empty> |<Empty> |
2 | <Useless info> |
3 | <Impt Info> |
4 |Name: |NameID |<Empty> |
5 |Email: |EmailID |<Empty> |
6 |Contact: |ContactID|<Empty> |
7 |Comment: |CommentID|<Empty> |
8 | <Useless Info> |
9 | <Useless Info> |
10 | <Useless Info> |
11 | <Useless Info> |
Of the table, I am only interested in values of <Impt Info>, NameID, EmailID, ContactID and CommentID.
I've tried looping through the table using debug.print as a Word table object but for some reason it sees the entire table as a single cell. Could I be assigning the table object wrongly or simply using the wrong codes?
Below is the code I've tried to use:
Sub test()
Dim objMail As Outlook.MailItem
Dim objWordDocument As Word.Document
Dim objTable As Word.Table
Dim objExcelApp As Excel.Application
Dim objExcelWorkbook As Excel.Workbook
Dim objExcelWorksheet As Excel.Worksheet
Dim I As Long
Dim SavePath As String
Dim SaveName As String
'Create a new excel workbook
Set objExcelApp = CreateObject("Excel.Application")
Set objExcelWorkbook = objExcelApp.Workbooks.Add
objExcelApp.Visible = True
'Get the table(s) in the selected email
Set objMail = Outlook.Application.ActiveExplorer.Selection.item(1)
Set objWordDocument = objMail.GetInspector.WordEditor
SavePath = "C:\Users\John.Grammaticus\Desktop\Test\"
SaveName = objMail.SenderName & " " & objMail.Subject
Set objTable = objWordDocument.Tables(1)
For Each C In objTable.Range.Cells
Debug.Print C.Range.Text
Next C
objTable.Range.Copy
Set objExcelWorksheet = objExcelWorkbook.Sheets(1)
objExcelWorksheet.Paste
objExcelWorkbook.SaveAs FileName:=SavePath & " " & SaveName
objExcelWorkbook.Close
End Sub
The current code exports the values into an Excel and I could potentially just manipulate from Excel instead. However, I would like to eventually pump the info directly into an Access DB. Hence the need to draw out specific values.

Try using InStr function MSDN
Example
Option Explicit
Public Sub Example()
Dim Item As Outlook.MailItem
Dim vText As Variant
Dim sText As String
Dim vItem As Variant
Dim i As Long
If Application.ActiveExplorer.selection.Count = 0 Then
MsgBox "No Item selected!", vbCritical, "Error"
End If
For Each Item In Application.ActiveExplorer.selection
sText = Item.Body ' Email Body
vText = Split(sText, Chr(13)) ' Chr(13) = Carriage return
'// Check each line of text in the message body down loop
For i = UBound(vText) To 0 Step -1
'// InStr([start,]mainString, SearchedString[, compare])
If InStr(1, vText(i), "Name:") > 0 Then
'// Split vItem : & :
vItem = Split(vText(i), Chr(58)) ' Chr(58) = :
Debug.Print Trim(vItem(1)) 'Print on Immediate Window
End If
Next
Next
End Sub
Or use horizontal tab Chr(9)
See Character Chart
'Dec|Hex|Oct| Char | Description
'-------------------------------
'0 0 000 null
'1 1 001 start of heading
'2 2 002 start of text
'3 3 003 end of text
'4 4 004 end of transmission
'5 5 005 enquiry
'6 6 006 acknowledge
'7 7 007 bell
'8 8 010 backspace
'9 9 011 horizontal tab
'10 A 012 new line
'11 B 013 vertical tab
'12 C 014 new page
'13 D 015 carriage return
'14 E 016 shift out
'15 F 017 shift in
'16 10 020 data link escape
'17 11 021 device control 1
'18 12 022 device control 2
'19 13 023 device control 3
'20 14 024 device control 4
'21 15 025 negative acknowledge
'22 16 026 synchronous idle
'23 17 027 end of trans. block
'24 18 030 cancel
'25 19 031 end of medium
'26 1A 032 substitute
'27 1B 033 escape
'28 1C 034 file separator
'29 1D 035 group separator
'30 1E 036 record separator
'31 1F 037 unit separator
'32 20 040 space
'33 21 041 !
'34 22 042 "
'35 23 043 #
'36 24 044 $
'37 25 045 %
'38 26 046 &
'39 27 047 '
'40 28 050 (
'41 29 051 )
'42 2A 052 *
'43 2B 053 +
'44 2C 054 ,
'45 2D 055 -
'46 2E 056 .
'47 2F 057 /
'48 30 060 0
'49 31 061 1
'50 32 062 2
'51 33 063 3
'52 34 064 4
'53 35 065 5
'54 36 066 6
'55 37 067 7
'56 38 070 8
'57 39 071 9
'58 3A 072 :
'59 3B 073 ;
'60 3C 074 <
'61 3D 075 =
'62 3E 076 >
'63 3F 077 ?
'64 40 100 #
'65 41 101 A
'66 42 102 B
'67 43 103 C
'68 44 104 D
'69 45 105 E
'70 46 106 F
'71 47 107 G
'72 48 110 H
'73 49 111 I
'74 4A 112 J
'75 4B 113 K
'76 4C 114 L
'77 4D 115 M
'78 4E 116 N
'79 4F 117 O
'80 50 120 P
'81 51 121 Q
'82 52 122 R
'83 53 123 S
'84 54 124 T
'85 55 125 U
'86 56 126 V
'87 57 127 W
'88 58 130 X
'89 59 131 Y
'90 5A 132 Z
'91 5B 133 [
'92 5C 134 \
'93 5D 135 ]
'94 5E 136 ^
'95 5F 137 _
'96 60 140 `
'97 61 141 a
'98 62 142 b
'99 63 143 c
'100 64 144 d
'101 65 145 e
'102 66 146 f
'103 67 147 g
'104 68 150 h
'105 69 151 i
'106 6A 152 j
'107 6B 153 k
'108 6C 154 l
'109 6D 155 m
'110 6E 156 n
'111 6F 157 o
'112 70 160 p
'113 71 161 q
'114 72 162 r
'115 73 163 s
'116 74 164 t
'117 75 165 u
'118 76 166 v
'119 77 167 w
'120 78 170 x
'121 79 171 y
'122 7A 172 z
'123 7B 173 {
'124 7C 174 |
'125 7D 175 }
'126 7E 176 ~
'127 7F 177 DEL

Related

Reverse Number in VB.Net

I want Reverse Number: example:
Textbox1.Text = 2 14 21 22 34 44
a deployment algorithm to do this. make
Expected Output: All Combination possible Reverse.
2 41 21 22 34 44
2 14 12 22 34 44
2 14 21 22 43 44
2 14 21 22 34 44
2 41 12 22 34 44
2 41 12 22 43 44
and so on...
2 14 21 22 34 44
What I try: it works, but it does not carry all the possible combinations, as in the above model.
Dim r As Integer
Public Function Reverse(rn As Integer)
Dim value As Integer
Dim values As New List(Of String)
For Each strValue As String In TextBox1.Text.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
If Integer.TryParse(strValue.Trim, value) Then
values.Add(value)
End If
Next
Dim numbers = Val(TextBox1.Text)
Dim result As Integer
While numbers > 0
rn = numbers Mod 10
result = result * 10 + rn
numbers = numbers \ 10
End While
Reverse = result
End Function
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
TextBox2.Text = Reverse(r & " ")
End Sub

extracting lines with pivot column

Infile,
S 235 1365 * 0 * * * 15 1 c81 592
H 235 296 99.7 + 0 0 3I296M1066I 14 1 s15018 1
H 235 719 95.4 + 0 0 174D545M820I 15 1 c2664 10
H 235 764 99.1 + 0 0 55I764M546I 15 1 c6519 4
H 235 792 100 + 0 0 180I792M393I 14 1 c407 107
S 236 1365 * 0 * * * 15 1 c474 152
H 236 279 95 + 0 0 765I279M321I 10-1 1 s7689 1
H 236 301 99.7 - 0 0 908I301M156I 15 1 s8443 1
H 236 563 95.2 - 0 0 728I563M74I 17 1 c1725 12
H 236 97 97.9 - 0 0 732I97M536I 17 1 s11472 1
S 237 1365 * 0 * * * 15 1 c474 152
H 237 279 95 + 0 0 765I279M321I 15 1 s7689 1
S 238 1365 * 0 * * * 12 1 c474 152
H 238 279 95 + 0 0 765I279M321I 10-1 1 s7689 1
H 238 301 99.7 - 0 0 908I301M156I 15 1 s8443 1
H 238 563 95.2 - 0 0 728I563M74I 17 1 c1725 12
H 238 97 97.9 - 0 0 732I97M536I 17 1 s11472 1
Outfile what I want is below,
Example 1 by specifying ninth column "10-1", "15", and "17".
S 236 1365 * 0 * * * 15 1 c474 152
H 236 279 95 + 0 0 765I279M321I 10-1 1 s7689 1
H 236 301 99.7 - 0 0 908I301M156I 15 1 s8443 1
H 236 563 95.2 - 0 0 728I563M74I 17 1 c1725 12
H 236 97 97.9 - 0 0 732I97M536I 17 1 s11472 1
Example 2 by specifying ninth column "14" and "15".
S 235 1365 * 0 * * * 15 1 c81 592
H 235 296 99.7 + 0 0 3I296M1066I 14 1 s15018 1
H 235 719 95.4 + 0 0 174D545M820I 15 1 c2664 10
H 235 764 99.1 + 0 0 55I764M546I 15 1 c6519 4
H 235 792 100 + 0 0 180I792M393I 14 1 c407 107
Example 3 by specifying ninth column "15".
S 237 1365 * 0 * * * 15 1 c474 152
H 237 279 95 + 0 0 765I279M321I 15 1 s7689 1
So I would like to extract set of lines those have same value in the second column. At this time, I need to extract only set of lines which have specific values in 9th column. In that case, the set of lines need to have "all of the specified values".
The set 238 has "12" in the ninth column, which is not specified. So I do not want them to be extracted.
This question is very similar to this question.
Extracting lines using two criteria
There's many possible approaches but IMHO the most robust and easiest to expand upon later is to create a hash table of the desired values (goodVals[] below) and then just test if the current $9 is a value that's not in that table:
BEGIN { split("10-1 15 17",tmp); for (i in tmp) goodVals[tmp[i]] }
$2 != prevPivot { prtCurrSet() }
!($9 in goodVals) { isBadSet=1 }
{ currSet = currSet $0 ORS; prevPivot = $2 }
END { prtCurrSet() }
function prtCurrSet() {
if ( !isBadSet ) {
printf "%s", currSet
}
currSet = ""
isBadSet = 0
}
Given the new requirement from your comment, here's a solution for one possible interpretation of that requirement:
$ cat tst.awk
BEGIN { split("10-1 15 17",tmp); for (i in tmp) goodVals[tmp[i]] }
$2 != prevPivot { prtCurrSet() }
{ seen[$9]; currSet = currSet $0 ORS; prevPivot = $2 }
END { prtCurrSet() }
function prtCurrSet( val,allGoodPresent) {
allGoodPresent = 1
for (val in goodVals) {
if ( !(val in seen) ) {
allGoodPresent = 0
}
}
if ( allGoodPresent ) {
printf "%s", currSet
}
currSet = ""
delete seen
}
$ awk -f tst.awk file
S 236 1365 * 0 * * * 15 1 c474 152
H 236 279 95 + 0 0 765I279M321I 10-1 1 s7689 1
H 236 301 99.7 - 0 0 908I301M156I 15 1 s8443 1
H 236 563 95.2 - 0 0 728I563M74I 17 1 c1725 12
H 236 97 97.9 - 0 0 732I97M536I 17 1 s11472 1
and here's another:
$ cat tst.awk
BEGIN { split("10-1 15 17",tmp); for (i in tmp) goodVals[tmp[i]] }
$2 != prevPivot { prtCurrSet() }
{ seen[$9]; currSet = currSet $0 ORS; prevPivot = $2 }
END { prtCurrSet() }
function prtCurrSet( val,allGoodPresent,someBadPresent) {
allGoodPresent = 1
for (val in goodVals) {
if ( !(val in seen) ) {
allGoodPresent = 0
}
delete seen[val]
}
someBadPresent = length(seen)
if ( allGoodPresent && !someBadPresent ) {
printf "%s", currSet
}
currSet = ""
delete seen
}
$ awk -f tst.awk file
S 236 1365 * 0 * * * 15 1 c474 152
H 236 279 95 + 0 0 765I279M321I 10-1 1 s7689 1
H 236 301 99.7 - 0 0 908I301M156I 15 1 s8443 1
H 236 563 95.2 - 0 0 728I563M74I 17 1 c1725 12
H 236 97 97.9 - 0 0 732I97M536I 17 1 s11472 1
Unfortunately your posted sample input/output isn't adequate to test the differences.

Find all permutations from 1-9 and A-F

I am trying to find all possible permutations from the following conditions:
Number range 1-99
Letter range A-F
32 Digit long string
What would you recommend to make my life easier? Tried to search about permutations in vb, but just can't find them, and I don't know why but it doesn't seem such an hard task as that :s
Samples:
9A E5 4B CA BD 93 DE 2E 01 00 00 01 00 00 00 00
6E C7 9A CF CB A7 67 D9 17 EE 6B 70 F0 5E E4 32
64 86 00 EA 91 71 65 67 1F CE FE EB B1 CC 07 84
63 C0 8A AD F7 9F 5D F3 06 01 00 07 00 00 00 00
51 16 15 7C 56 9F 0A FF 55 1C 20 91 58 CD AA CF
48 61 56 FF 41 6E 49 F8 45 70 49 FE 54 75 52 1B
45 BA B8 B7 42 52 E3 77 03 00 00 03 00 00 00 00
40 D0 F4 04 BF AF 2B 99 02 00 00 02 00 00 00 00
40 30 90 00 3F 7C 83 3E 68 98 D5 D5 6D D9 A3 E9
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FE A1 CE 6D A6 82 A9 D1 00 00 00 00 00 00 00 00
Thanks for helpin!
EDIT:
Here's my code
Public Class Form1
Dim c As Integer
Dim p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, a As String
Dim combo As String
Dim random As Random
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
c = -1
While c <= 99
c = c + 1
If c < 10 Then
a = "0" & c
Else : a = c
End If
p1 = a
p2 = 2
combo = p1 + " " + p2 + " " + p3 + " " + p4 + " " + p5 + " " + p6 + " " + p7 + " " + p8 + " " + p9 + " " + p10 + " " + p11 + " " + p12 + " " + p13 + " " + p14 + " " + p15 + " " + p16 + " " + vbNewLine
RichTextBox1.AppendText(combo + vbNewLine)
End While
End Sub
End Class
Judging from your example, you mean 0-9 (not 1-9) and A-F
Alex K. neatly provides a direction to solve this:
You would ignore the "numbers and letters" since that is a hexadecimal
notation of bytes (AF == 175) There are 16 bytes, each of which can
hold 0 to 255 so you have
340,282,366,920,938,463,463,374,607,431,768,211,455 possible
combinations.
Although it is theoretically possible to get all of these permutations, your computer needs about 34,028,236,692,093,846,346,337,460,743 GB. I don't think that much memory exists in total
If it were a relatively tiny number, we could do this simply with the following method:
Sub purgatory()
Dim counter As Long
Dim output As String
counter = 0
For counter = 0 To 2147483647#
output = String(16 - Len(Hex(counter)), "0") & Hex(counter)
MsgBox output
Next counter
End Sub
But the max value of a long in VBA7 is 2,147,483,648 (4 Bytes / 2), or 8 bytes with VB net. Which means that 12 bytes and one bit will always be 0. This could be solved with a few nested for loops.
I think the solution to your problem is best answered by JNevill
16 combinations of 00-FF... That is insanity...
IMPORTANT NOTE: If you run the code I posted, it's important to first familiarize yourself with Ctr+Pause/Break. Quickest way out of purgatory ;)

copy sets of numbers into a listbox from a textbox

I have a textbox that the user puts in sets of numbers(e.g. 32 45 98 56 52 1 23) and I need to copy these numbers into a listbox so that each number is its own item. So far I have this
For Each ch As Char In TextBox20.Text
If Char.IsDigit(ch) Then
ListBox1.Items.Add(ch)
End If
Next
but the problem is that it will copy each digit as an item so we will end up with
3
2
4
5
9
8
5
6
I need it to copy them like this
32
45
98
56
here is a sample of how to do that
Sub addToListBox()
Dim sample As String
Dim v As Variant
Dim i As Integer
sample = "32 45 98 56 52 1 23"
v = Split(sample, " ")
For i = 0 To UBound(v)
If IsNumeric(v(i)) Then
ListBox1.Items.Add(v(i))
End If
Next i
End Sub

Split first <br> from sentence using vb

I have the one sentence Eric Corni<br>chargé de clientèle<br>Tél: 09 99 99 99 99 72<br> atricard#adiscos.com I want to get only chargé de clientèle<br>Tél: 09 99 99 99 99 72<br> atricard#adiscos.com
I have the code as below:
strText = Replace(strText, "_com_position_", Right(com_signature,InStrRev(com_signature, ">", len(com_signature))+3))
And _com_position_ = "Eric Corni<br>chargé de clientèle<br>Tél: 09 99 99 99 99 72<br> atricard#adiscos.com" but it displays wrong with what I need.it displays like this: gé de clientèle<br>Tél: 09 99 99 99 99 72<br> atricard#adiscos.com
Do you have any solution, please help me to fix it, Thanks.
Use instr function() .. and known that length of <br> is 4 then
Dim strText As String = "Eric Corni<br>chargé de clientèle<br>Tél: 09 99 99 99 99 72<br> atricard#adiscos.com"
strText = Mid(strText,InStr(strText, "<br>") + 4)
Try this:
strText = strText.SubString(strText.IndexOf("<br>") + 4)
One possible solution (using vbscript) would be to remove the first part of the string with a regular expression:
strText = "Eric Corni<br>chargé de ..."
Set re = New RegExp
re.Pattern = "^.*?<br>"
re.IgnoreCase = True
WScript.Echo re.Replace(strText, "")