この問題をVBAで実装できるのか、それともVBで実行する必要があるのかわかりません。VisualStudioを使用したネット。
問題:Excelには検索機能があり、使用可能な値が多数ある場合や、列Aから遠く離れた値を見つける必要がある場合は面倒です。
こんなものが欲しいのですが
ヘッダー名で表示したい列を指定できます。希望する方法で列を再配置し、コピーして貼り付けることができます。Visual Basicのデータグリッドのように?出来ますか?
以下に両方の方法を示しました-VBAとVB.net(選択してください):)
VB.NETの使用
DataGridViewをVB.netフォームに配置し、ボタンも配置します。このコードをボタンに配置します
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
スナップショット
より多くのフォローアップ
こんにちはシッダールス、両方のコードをありがとうございました。VBの場合。ネットそれは素晴らしいです。ExelのVBAの場合、データをコピーするために(Ctrl + Cを使用して)コピーできる方法はありますか?複数の行をコピーする方が望ましいですが、単一の行で問題ありません。「Test1」をテキストボックスi49.tinypic.com/2ceq3yf.jpg–user13708545時間前に置き換えることができます
はい、単一の選択されたアイテムまたは複数の選択されたアイテムをリストボックスからcliboardにコピーすることができます。listobxを複数選択するには、デザインモードで、リストボックスのプロパティをに設定します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