![](/img/trans.png)
[英]Manipulate Excel table macro to another format. Remove duplicates and reformat
[英]excel macro to format data
我有如下数据格式,
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
我需要使用 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
提前致谢
我在这里为你写了一个小脚本。 启动 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
有关从 A -> 印度和 B -> 中国的简单映射,请查看 VLOOKUP function。 这是一个简单的例子:a8 到 b11 是
a China
b India
c Russia
d Brazil
如果您在 a2 中有一个“a”,那么这个 vlookup function 将满足您的需求:
=VLOOKUP(A2,$A$8:$B$11,2)
其中 a2 是查找值,$a$8:$b$11 是表,2 表示您要返回列 b(第二列)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.