Excel制造仪表板与VBA

我有一个excel表单,详细列出了一个设备列表(大约12000行在表中)。 我想做一个仪表板,我input设备的名称,它返回制造商,制造date和说明。

最好的办法是什么呢? 我正在考虑编写VBA代码,以便匹配对象types的input,并返回所需的值,但是我没有在VBA中编码,我不确定如何input它。

请原谅我build议一种不同的方法,但考虑SQL(结构化查询语言)的可扩展的关系优势,可以将设备名称作为参数,并将您的数据查询到过滤的表结果集中。 如果使用Excel for PC,Excel可以使用Jet / ACE SQL引擎(Windows .dll文件)运行SQL,该引擎为其同级MS Access提供动力。 这种方法避免了数组公式,循环,if / then逻辑,复杂的多重索引/匹配和vlookups。

下面的示例使用InputBox提示用户input设备名称 ,然后将其作为parameter passing给SQL查询的WHERE子句。 我们讨厌恶意用户在input框中运行SQL注入 ,如: 1; DELETE FROM [DATA]; 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)如果你希望它在单元格中input一个值时工作,那么你使用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语句中查找匹配项,并在find所需的副本时进行显示。

祝你好运

使用function区中的filterfunction/button。