2

我不知道是否可以在 VBA 中实现这个问题,或者必须用 VB 来完成。网络使用 Visual Studio。

问题:Excel有它的搜索功能,如果有很多可用的值或者你必须找到一个离A列很远的值,那就很痛苦了。

在此处输入图像描述

我想要这样的东西

在此处输入图像描述

我可以在其中通过标题名称指定要显示的列。以我想要的方式重新排列列,并能够复制和粘贴。像 Visual Basic 中的数据网格?可能吗?

4

1 回答 1

4

我在下面给出了两种方法 - VBA 和 VB.net(任你选):)

使用 VB.NET

在您的 VB.net 窗体上放置一个 DataGridView 并放置一个按钮。将此代码放在按钮中

Public Class Form1
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim masterTable As New DataTable

        Dim cnnStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=""Excel 12.0 Xml;HDR=NO"";Data Source=""{0}"";"

        Using da As New OleDb.OleDbDataAdapter("select * from [Sheet1$] Where F1 = 'Test1'", String.Format(cnnStr, "C:\Book1.xlsx"))
            da.Fill (masterTable)
        End Using
        DataGridView1.DataSource = masterTable
    End Sub
End Class

你完成了:)

快照

我正在使用有限的数据。

在此处输入图像描述

您还可以将字符串更改"select * from [Sheet1$] Where F1 = 'Test1'""select F1 as Name,F2 as PN, F3 as [Inventory Loc] from [Sheet1$] Where F1 = 'Test1'"以显示标题,如下所示

在此处输入图像描述

编辑

如果您想知道如何在 VBA 中执行此操作

使用 VBA

在窗体上放置一个列表框和一个命令按钮,然后使用此代码。

Option Explicit

Private Sub CommandButton1_Click()
    Dim ws As Worksheet, ws1 As Worksheet
    Dim rng As Range
    Dim lastRow As Long
    Dim Ar As Variant

    Set ws = Sheets("Sheet1")

    lastRow = ws.Cells.Find(What:="*", After:=ws.Range("A1"), _
              Lookat:=xlPart, LookIn:=xlFormulas, _
              SearchOrder:=xlByRows, SearchDirection:=xlPrevious, _
              MatchCase:=False).Row

    Set rng = ws.Range("A1:C" & lastRow)

    Set ws1 = Sheets.Add

    With rng
        ws.AutoFilterMode = False
        .AutoFilter Field:=1, Criteria1:="Test1"
        .SpecialCells(xlCellTypeVisible).Copy ws1.Range("A1")
        ws.AutoFilterMode = False

        lastRow = ws1.Cells.Find(What:="*", After:=ws1.Range("A1"), _
                  Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, _
                  SearchDirection:=xlPrevious, MatchCase:=False).Row

        Ar = ws1.Range("A1:C" & lastRow)

        Application.DisplayAlerts = False
        ws1.Delete
        Application.DisplayAlerts = True
    End With

    With Me.ListBox1
        .Clear
        .ColumnHeads = False
        .ColumnCount = 3
        .List = Ar
        .ColumnWidths = "50;50;50"
        .TopIndex = 0
    End With
End Sub

快照

在此处输入图像描述

更多跟进

嗨 Siddharth,非常感谢您提供这两个代码。对于 VB。净是美妙的。对于 Exel 中的 VBA,有什么方法可以复制(使用 Ctrl + C)来复制数据 - 单行就可以了,尽管复制多行更可取。我可以用文本框 i49.tinypic.com/2ceq3yf.jpg 替换“Test1” – user1370854 5 小时前

是的,可以将列表框中的单个选定项或多个选定项复制到剪贴板。要使 listobx 多选,在设计模式下,将 listbox 的属性设置为fmMultiSelectMulti1。接下来添加一个命令按钮并粘贴此代码。

此代码再次基于我上面使用的数据,因此请根据需要对其进行修改。当您按下Copy按钮时,数据被复制到剪贴板,然后您可以简单地CTL V将数据粘贴到您想要的任何位置;例如在记事本中。

Private Sub CommandButton2_Click()
    Dim MyData As DataObject
    Dim i As Long
    Dim strCopiedText As String

    Set MyData = New DataObject

    With Me.ListBox1
        For i = 1 To .ListCount
            If .Selected(i - 1) Then
                strCopiedText = strCopiedText & _
                                .List(i - 1, 0) & vbTab & _
                                .List(i - 1, 1) & vbTab & _
                                .List(i - 1, 2) & vbCrLf
            End If
        Next i

        If Len(strCopiedText) > 0 Then
            MyData.Clear
            MyData.SetText strCopiedText
            MyData.PutInClipboard
            MsgBox "Data copied to clipboard"
        End If
    End With
End Sub

在此处输入图像描述

于 2012-05-04T20:38:06.223 回答