2011-05-02 208 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(第二列)。