我已经尝试了几个小时来做到这一点,但不是 VBScript 的专家,我想我需要一点帮助。
这就是我所反对的。我有 2 个不同的工作表,其中包含一些相同的信息。
WORKSHEET1
Section/Dept City Building SVD User Name Item Short Code Item Full Name SUPPLIER_SC Serial Number IP Address Product Class Product Item Status
BT&IT- WINNIPEG GATEWAY CO IT NETWORK CHK0639V1JX 07JACM401093000MSYS000 CISCO WNPIMBTVBBN-DSTH 1.2.3.4 SWITCHES 3550-24 ACTIVE
WORKSHEET2
Hostname Management IP Device Type Vendor Model Software Version Serial Number Location In Site
wnpimbtvbbn-dsth 1.2.3.4 Cisco IOS Switch Cisco catalyst355024 12.1(11)EA1 CHK0639V1JX Gateway CO Entire Network\Winnipeg\MTS TV Head End\
我想要做的是将两者关联起来并输出到第三个,以便重新组织信息以导入数据库。基本上,如果在 WORKSHEET1 的“项目短代码/项目全名/序列号”中的任何一个中找到“主机名”表单 WORKSHEET2,我想输出“sheet1.item 短代码”,然后从 SHEET2 输出整行,但在不同的命令。此外,如果未找到匹配项,则从 SHEET2 输出整行...
据我所知,这大约是:
Sub CompareandOutput()
Dim inv1 As Range
Dim Assyst1 As Range
Dim Assyst2 As Range
Dim Assyst3 As Range
Dim Inventory1Items As Range
Dim Assyst1Items As Range
Dim Assyst2Items As Range
Dim Assyst3Items As Range
Sheet3.Cells.Clear
Set Inventory1Items = Sheet2.Range("A2", Sheet2.Range("A65536").End(xlUp))
Set Assyst1Items = Sheet1.Range("E4", Sheet1.Range("E65536").End(xlUp))
Set Assyst2Items = Sheet1.Range("F4", Sheet1.Range("F65536").End(xlUp))
Set Assyst3Items = Sheet1.Range("H4", Sheet1.Range("H65536").End(xlUp))
Sheet3.Range("A1") = "Old Short Code"
Sheet3.Range("B1") = "New Short Code"
Sheet3.Range("C1") = "New Full Name"
Sheet3.Range("D1") = "Serial Number"
Sheet3.Range("E1") = "Version"
Sheet3.Range("F1") = "IP Address"
Sheet3.Range("G1") = "Supplier"
Sheet3.Range("H1") = "Product Class"
Sheet3.Range("I1") = "Product"
For Each inv1 In Inventory1Items
Sheet3.Range("B65536").End(xlUp).Offset(1, 0) = inv1.Value
Set Assyst1 = Assyst1Items.Find(inv1, LookIn:=xlValues, lookat:=xlWhole)
If Not Assyst1 Is Nothing Then
Sheet3.Range("A65536").End(xlUp).Offset(0, 0) = Cells(Assyst1.Row, "E")
Sheet3.Range("C65536").End(xlUp).Offset(0, 0) = inv1.Value
'Sheet3.Range("D65536").End(xlUp).Offset(1, 0) = Sheet2(Cells(Assyst1.Row, "D")).Select
End If
'Set Assyst2 = Assyst2Items.Find(inv1, LookIn:=xlValues, lookat:=xlWhole)
'If Not Assyst2 Is Nothing Then
'Sheet3.Range("B65536").End(xlUp).Offset(1, 0) = inv1.Row
'End If
'Set Assyst3 = Assyst3Items.Find(inv1, LookIn:=xlValues, lookat:=xlWhole)
'If Not Assyst3 Is Nothing Then
'Sheet3.Range("B65536").End(xlUp).Offset(1, 0) = inv1.Row
'End If
Next inv1
End Sub
我确定我在这里完全偏离了轨道,并且有一种更简单的方法可以做到这一点。任何帮助都将不胜感激。
好的是的......仍然需要帮助。取得了重大进展,但只有最后一件小事不起作用。基本上我一辈子都无法获得函数 CheckForMatch,将其结果“itemShortCode”传递给私有子“exporttonewworksheet”。一切正常,直到函数结束,主子和导出子似乎没有得到值。我确定我在这里不理解一些基本的东西......
Public Enum Assyst1Columns
Section_Dept = 1
City
Building
SVD_User_Name
Item_Short_Code
Item_Full_Name
SUPPLIER_SC
Serial_Number
IP_Address
Product_Class
Product
Item_Status
End Enum
Public Enum Inventory1Columns
Hostname = 1
Management_IP
Device_Type
Vendor
Model
Software_Version
Serial_Number
Location
In_Site
End Enum
Public Sub main()
Dim Assyst As Excel.Worksheet
Dim Inventory As Excel.Worksheet
Dim Output As Excel.Worksheet
Set Assyst = ThisWorkbook.Worksheets("Assyst")
Set Inventory = ThisWorkbook.Worksheets("Inventory")
Dim InventoryItems As Range
Sheet3.Cells.Clear
'Set Output1 = ThisWorkbook.Worksheets.Add
'Output1.Name = "Output1"
Dim newWkRow As Long
newWkRow = 1
Dim test As String
Set InventoryItems = Inventory.Range("A2", Inventory.Range("A65536").End(xlUp))
' loop through wk2
For Each hname In InventoryItems
' for each wk2.Cell found, call checkForMatch()
' store checkForMatch() value into variable
itemShortCode = checkForMatch(hname, Assyst)
'Sheet3.Range("A65536").End(xlUp).Offset(1, 0) = hname
' export to new worksheet
test = itemShortCode
exportToNewWorksheet Output, Inventory, hname.Row, newWkRow, itemShortCode
newWkRow = newWkRow + 1 ' the only reason for newWkRow is if you want to skip any
' entries from WORKSHEET2. So it's best to keep this count separate
' from your current loop row
Next
End Sub
Private Function checkForMatch(ByVal hname As String, ByRef Assyst As Excel.Worksheet) As String
' PLEASE NOTE: wk1 does NOT need to match in the function definition to that of the
' variable defined in main()
' search for match from Inventory to Assyst
Dim item As String
Dim test As String
Dim matches As String
Dim Assyst1Items As Range
Set Assyst1Items = Assyst.Range("A4", Assyst.Range("L65536").End(xlUp))
On Error Resume Next
matches = Assyst1Items.Find(hname, LookIn:=xlValues, lookat:=xlWhole)
' if found, return the Item_Short_Code
If Not matches = "" Then
item = matches
' otherwise return vbNullString
Else
item = vbNullString
End If
itemShortCode = item
End Function
Private Sub exportToNewWorksheet(ByRef Output As Excel.Worksheet, _
ByRef Inventory As Excel.Worksheet, _
ByRef hname As Long, _
ByVal newWkRow As Long, _
Optional ByVal itemShortCode As String = vbNullString)
' put data into new row. be sure to use the Enum to re-order the column as you like
If itemShortCode = "" Then
Sheet3.Cells(newWkRow, 2).Value = Inventory.Cells(hname, Inventory1Columns.Hostname).Value
Sheet3.Cells(newWkRow, 3).Value = Inventory.Cells(hname, Inventory1Columns.Hostname).Value
Sheet3.Cells(newWkRow, 4).Value = Inventory.Cells(hname, Inventory1Columns.Management_IP).Value
Sheet3.Cells(newWkRow, 5).Value = Inventory.Cells(hname, Inventory1Columns.Device_Type).Value
Sheet3.Cells(newWkRow, 6).Value = Inventory.Cells(hname, Inventory1Columns.Vendor).Value
Sheet3.Cells(newWkRow, 7).Value = Inventory.Cells(hname, Inventory1Columns.Model).Value
Sheet3.Cells(newWkRow, 8).Value = Inventory.Cells(hname, Inventory1Columns.Software_Version).Value
Sheet3.Cells(newWkRow, 9).Value = Inventory.Cells(hname, Inventory1Columns.Serial_Number).Value
Else
' store data another way
Sheet3.Cells(newWkRow, 1).Value = Assyst.Cells(hname, Assyst1Columns.Item_Short_Code).Value
Sheet3.Cells(newWkRow, 2).Value = Inventory.Cells(hname, Inventory1Columns.Hostname).Value
Sheet3.Cells(newWkRow, 3).Value = Inventory.Cells(hname, Inventory1Columns.Hostname).Value
Sheet3.Cells(newWkRow, 4).Value = Inventory.Cells(hname, Inventory1Columns.Management_IP).Value
Sheet3.Cells(newWkRow, 5).Value = Inventory.Cells(hname, Inventory1Columns.Device_Type).Value
Sheet3.Cells(newWkRow, 6).Value = Inventory.Cells(hname, Inventory1Columns.Vendor).Value
Sheet3.Cells(newWkRow, 7).Value = Inventory.Cells(hname, Inventory1Columns.Model).Value
Sheet3.Cells(newWkRow, 8).Value = Inventory.Cells(hname, Inventory1Columns.Software_Version).Value
Sheet3.Cells(newWkRow, 9).Value = Inventory.Cells(hname, Inventory1Columns.Serial_Number).Value
' etc...
End If
End Sub