2011-11-09 1 views
4

vba를 사용하여 피큐어에서와 같이 데이터 테이블을 읽어야합니다. 난 Msg.Body 본문을 읽을 수 있지만 실제로 나는 헤더로 첫 번째 행을 발견하고 데이터 필드 및 나머지 DBMS 테이블을 업데이 트해야합니다. 그래서 내가 Excel에서 것이라고 테이블을 읽을 수 있습니까? Outlookvba를 사용하여 Outlook 메시지 본문에 붙여 넣은 표를 읽는 방법은 무엇입니까?

+0

메일 본문 형식이란 무엇입니까? HTML, 서식있는 텍스트? Word/Excel에서 붙여 넣은 테이블의 원본은 무엇입니까? –

+0

분할 (Msg.Body, vbCrLf)을 사용하여 이메일 본문을 분할 할 수 있습니까? 첫 번째 배열 토큰이 헤더가됩니다. LBound (Split (Msg.Body, vbCrLf)) + 1에서 UBound()까지의 모든 것이 데이터가됩니다. – JimmyPena

+0

@TimWilliams 네, Excel에서 붙여 넣었습니다! – kinkajou

답변

6

이 샘플 절차는 도움이됩니다. Excel에서 테이블을 다시 만들고 Outlook 전자 메일에 붙여 넣은 다음 나에게 보냈습니다. 그런 다음이 절차를 사용하여 "셀"값을 읽습니다.

Sub GetLines() 

Dim msg As Outlook.mailItem 
Dim rows As Variant 
Dim numberofColumns As Long 
Dim numberofRows As Long 
Dim headerValues As Variant 
Dim headerRow() As String 
Dim data() As String 
Dim i As Long, j As Long 

' get currently selected email 
Set msg = ActiveExplorer.Selection.item(1) 

' tokenize each line of the email 
rows = Split(msg.Body, vbCrLf) 

' calculate array size 
numberofColumns = Len(rows(0)) - Len(Replace(rows(0), Chr(9), "")) 
numberofRows = UBound(rows) + 1 

' put header row into array 
ReDim headerRow(1 To numberofColumns) 
headerValues = Split(rows(0), Chr(9)) 

For i = 1 To numberofColumns 
    headerRow(i) = Trim$(headerValues(i - 1)) 
Next i 

' calculate data array size 
numberofRows = numberofRows - 1 

' put data into array 
ReDim data(1 To numberofRows, 1 To numberofColumns) 

    For i = 1 To numberofRows 
    For j = 1 To numberofColumns 
     data(i, j) = Trim$(Split(rows(i), Chr(9))(j - 1)) 
    Next j 
    Next i 

End Sub 

먼저 전자 메일의 각 줄을 배열로 토큰 화합니다. 배열 크기를 계산 한 다음 테이블의 첫 번째 행 ("머리글") 만 포함 할 배열을 만듭니다.

그런 다음 헤더 행을 건너 뛰므로 행 수에서 하나를 뺍니다. 그런 다음 각 행을 반복하여 분할하고 값을 반복하여 2D 배열에 할당합니다.

결국 "headerRow"변수를 반복하여 DBMS에 사용할 필드 값을 검색 할 수 있습니다. 변수 "data"는 각 필드에 해당하는 값만 포함합니다. 따라서 headerRow (1) 및 data (n, 1)은 테이블의 첫 번째 열에있는 값과 일치해야합니다.

+1

+1 멋지게 완료되었습니다. – brettdj

관련 문제