私はこれを行うために数時間試みてきましたが、VBScript の Excel の専門家ではないので、少し助けが必要だと思います。
これが私が反対しているものです。同じ情報の一部を含む 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\
私がやろうとしているのは、データベースにインポートするために情報を再編成するために、2 つを関連付けて 3 番目に出力することです。基本的にはWORKSHEET2の「ホスト名」フォームがWORKSHEET1の「Item Short Code/Item Full Name/Serial」のいずれかで見つかった場合、「sheet1.item short code」を出力してから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
私はここでWAAAYから外れていると確信しており、これを行うためのはるかに簡単な方法があります. どんな助けでも本当に感謝します。
OK はい... まだ助けが必要です。かなりの進歩を遂げましたが、機能していない小さな小さなことが最後に 1 つだけあります。基本的に、関数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