2011-05-02 142 views
2

我有像下面的數據格式,Excel宏格式化數據

 
Date   User   Time   Status  Domain 
2011Apr18 ID:user1) 10:26:55.078> loggedinto A 
2011Apr18 ID:user1) 14:09:31.010> loggedout A 
2011Apr18 ID:user1) 14:10:37.473> loggedinto A 
2011Apr18 ID:user1) 15:59:55.899> loggedinto A 
2011Apr18 ID:user1) 16:22:05.335> loggedout A 
2011Apr18 ID:user2) 16:59:00.769> loggedinto A 
2011Apr18 ID:user2) 17:14:52.169> loggedout A 
2011Apr19 ID:user1) 10:05:44.102> loggedinto A 
2011Apr19 ID:user3) 11:54:27.713> loggedinto C 

我需要macro..here再次基於域爲具有以下使用Excel格式,上述數據,國家需要被映射像(A->印度,B->中國)...請跨越

 
Date   user  Logged into  Logged out Domain Country 
2011Apr18 ID:user1) 15:59:55.899> 16:22:05.335>  A India 
2011Apr18 ID:user1) 16:22:05.335> 17:14:52.169>  A India 
2011Apr18 ID:user2) 16:59:00.769> 10:05:44.102>  A India 
2011Apr18 ID:user2) 17:14:52.169> 15:59:55.899>  A India 
2011Apr19 ID:user1) 10:05:44.102> 17:14:52.169>  B China 

感謝幫助提前

+0

也許你可以試試DTS !!。 – varadarajan 2011-05-02 13:47:47

+0

您必須使用VBA,特別是處理用戶在同一個域上登錄兩次而不登出的情況。你的例子的第3和第4行。你想在這種情況下得到什麼結果? – 2011-05-02 15:16:49

+0

@corbett:然後讓退出時間字段爲空的那些records.but但我需要這種格式反正。 – aln 2011-05-02 18:16:55

回答

1

我在這裏爲你寫了一個小腳本。啓動ReFormat()來創建新表。它讀取活動工作表中的當前數據並將其放入數組中。然後,我從G1開始在同一張表格中創建新表格。

請給我一個反饋,這是一個工作。 (如果它爲你工作,接受答案就好)。

Option Explicit 

Dim DataArray() As String 
Dim lngRow As Long, lngLastRow As Long 
Dim intColumn As Integer 

Sub ReFormat() 

    Dim ResultTable As Range 
    Dim CurrentResultRow As Long 
    Dim i As Long 

    FillSourceArray 

    Set ResultTable = ActiveSheet.Range("G1") 
    CurrentResultRow = 0 

    ResultTable.Offset(CurrentResultRow, 0).Value = "Date" 
    ResultTable.Offset(CurrentResultRow, 1).Value = "user" 
    ResultTable.Offset(CurrentResultRow, 2).Value = "Logged into" 
    ResultTable.Offset(CurrentResultRow, 3).Value = "Logged out" 
    ResultTable.Offset(CurrentResultRow, 4).Value = "Domain" 
    ResultTable.Offset(CurrentResultRow, 5).Value = "Country" 

    CurrentResultRow = CurrentResultRow + 1 

    For i = 1 To lngLastRow - 1 
     If (DataArray(i, 3) = "loggedinto") Then 
      ResultTable.Offset(CurrentResultRow, 0).Value = DataArray(i, 0) 
      ResultTable.Offset(CurrentResultRow, 1).Value = DataArray(i, 1) 
      ResultTable.Offset(CurrentResultRow, 2).Value = DataArray(i, 2) 
      ResultTable.Offset(CurrentResultRow, 3).Value = SearchLogOut(DataArray(i, 1), i + 1) 
      ResultTable.Offset(CurrentResultRow, 4).Value = DataArray(i, 4) 
      ResultTable.Offset(CurrentResultRow, 5).Value = SearchCountry(DataArray(i, 4)) 
      CurrentResultRow = CurrentResultRow + 1 
     End If 

    Next i 

End Sub 

Function SearchLogOut(user As String, Start As Integer) As String 
    Dim i As Long 

    For i = Start To lngLastRow - 1 
     If ((DataArray(i, 1) = user) And (DataArray(i, 3) = "loggedout")) Then 
      SearchLogOut = DataArray(i, 2) 
      Exit For 
     ElseIf ((DataArray(i, 1) = user) And (DataArray(i, 3) = "loggedinto")) Then 
      SearchLogOut = "" 
      Exit For 
     End If 
    Next i 

End Function 

Function SearchCountry(Country As String) As String 
    Select Case Country 
     Case "A" 
      SearchCountry = "India" 
     Case "B" 
      SearchCountry = "China" 
    End Select 

End Function 

Sub FillSourceArray() 

    'Read the Source Data 
    lngLastRow = Cells(Rows.Count, 1).End(xlUp).Row 
    ReDim DataArray(lngLastRow - 1, 4) 

    For lngRow = 1 To lngLastRow 
     For intColumn = 1 To 5 
     DataArray(lngRow - 1, intColumn - 1) = Cells(lngRow, intColumn) 
     Next intColumn 
    Next lngRow 

End Sub 
+0

非常感謝老闆! – aln 2011-05-05 06:20:53

+0

@aln,不客氣。 – stema 2011-05-05 07:19:09

0

用於從一個簡單的映射 - >印度和B - >中國,請看VLOOKUP功能。這裏有一個簡單的例子:A8到B11是

a China 
b India 
c Russia 
d Brazil 

,如果你有一個「A」,在A2那麼這個VLOOKUP函數會做你的願望:

=VLOOKUP(A2,$A$8:$B$11,2) 

其中A2爲查找值, $ a $ 8:$ b $ 11是表格,2表示您想返回列b(第二列)。