我不知道是否可以在 VBA 中实现这个问题,或者必须用 VB 来完成。网络使用 Visual Studio。
问题:Excel有它的搜索功能,如果有很多可用的值或者你必须找到一个离A列很远的值,那就很痛苦了。
我想要这样的东西
我可以在其中通过标题名称指定要显示的列。以我想要的方式重新排列列,并能够复制和粘贴。像 Visual Basic 中的数据网格?可能吗?
我在下面给出了两种方法 - 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