我有一张excel表,详细列出了设备清单(表格中大约12000行)。我想制作一个仪表板,我输入设备名称,然后返回制造商,制造日期和说明。
最好的方法是什么?我正在考虑编写VBA代码以便将输入与对象类型匹配并返回所需的值,但是我没有在VBA中编码,而且我不确定如何键入它。
答案 0 :(得分:1)
请原谅我建议采用不同的方法,但考虑SQL(结构化查询语言)的可扩展的关系优势,它可以将设备名称作为参数,并将您的数据查询到过滤的表结果集中。如果使用Excel for PC,Excel可以使用Jet / ACE SQL引擎(Windows .dll文件)运行SQL,这是为其兄弟MS Access提供动力的引擎。这种方法避免了数组公式,循环,if / then逻辑,复杂的多索引/匹配和vlookup。
下面的示例使用InputBox提示用户输入设备名称,然后将其作为参数传递给SQL查询的WHERE
子句。我们讨厌恶意用户在输入框中运行SQL injection,例如:1; DELETE FROM [DATA];
。示例假定数据存在于名为DATA
的选项卡中,其中第一行包含列标题,而名为RESULTS
的空选项卡。可以进行调整。
Sub RunSQL()
Dim conn As Object, rst As Object, cmd As Object
Dim equipmentVar As String, strConnection As String, strSQL As String
Dim i As Integer
Const adcmdText = 1, adVarChar = 200, adParamInput = 1
Set conn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
' RECEIVE USER INPUT
equipmentVar = InputBox("Enter name of equipment.", "EQUIPMENT SEARCH")
If equipmentVar = "" Then Exit Sub
' CONNECTION STRINGS (TWO VERSIONS)
' strConnection = "DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" _
' & "DBQ=C:\Path\To\Workbook.xlsm;"
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" _
& "Data Source='C:\Path\To\Workbook.xlsm';" _
& "Extended Properties=""Excel 8.0;HDR=YES;"";"
strSQL = " SELECT [DATA$].Manufacturer, [DATA$].Equipment, " _
& " [DATA$].[Date of Manufacturer], [DATA$].[Description] " _
& " FROM [DATA$]" _
& " WHERE [DATA$].[Equipment] = ?;"
' OPEN DB CONNECTION
conn.Open strConnection
' SET CMD COMMAND
Set cmd = CreateObject("ADODB.Command")
With cmd
.ActiveConnection = conn
.CommandText = strSQL
.CommandType = adcmdText
.CommandTimeout = 15
End With
' BINDING PARAMETER
cmd.Parameters.Append cmd.CreateParameter("equipParam", adVarChar, adParamInput, 255)
cmd.Parameters(0).Value = equipmentVar
' EXECUTING TO RECORDSET
Set rst = cmd.Execute
' COLUMN HEADERS
For i = 1 To rst.Fields.Count
Worksheets("RESULTS").Cells(1, i) = rst.Fields(i - 1).Name
Next i
' DATA ROWS
Worksheets("RESULTS").Range("A2").CopyFromRecordset rst
rst.Close: conn.Close
Set rst = Nothing: Set cmd = Nothing: Set conn = Nothing
End Sub
答案 1 :(得分:0)
听起来像是一个寻找匹配的单元格的简单循环,因为你没有给出布局我不能告诉你确切的代码,但你要求的方法就这样了。
1)如果您想在单元格中输入值时使用它,那么您可以使用worksheet_Change即 选项明确
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
' Your code here
End If
End Sub
在12000行中编码循环的最快方法,但将来可以是任意长度(假设它们从第5行开始)
Dim cell As Range
For Each cell In Range("a5", Range("a" & Cells.Rows.Count).End(xlUp))
'Your if statement to determin if it is a match goes here
'Your copy code goes here
Next cell
2)然后,您可以输入If语句来检查匹配项,并在找到匹配项时进行所需的任何副本显示。
祝你好运答案 2 :(得分:0)
使用功能区中的过滤器功能/按钮。