使用vba

时间:2016-07-08 18:19:18

标签: excel vba excel-vba

我有一张excel表,详细列出了设备清单(表格中大约12000行)。我想制作一个仪表板,我输入设备名称,然后返回制造商,制造日期和说明。

最好的方法是什么?我正在考虑编写VBA代码以便将输入与对象类型匹配并返回所需的值,但是我没有在VBA中编码,而且我不确定如何键入它。

3 个答案:

答案 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)

使用功能区中的过滤器功能/按钮。