2

この問題をVBAで実装できるのか、それともVBで実行する必要があるのか​​わかりません。VisualStudioを使用したネット。

問題:Excelには検索機能があり、使用可能な値が多数ある場合や、列Aから遠く離れた値を見つける必要がある場合は面倒です。

ここに画像の説明を入力してください

こんなものが欲しいのですが

ここに画像の説明を入力してください

ヘッダー名で表示したい列を指定できます。希望する方法で列を再配置し、コピーして貼り付けることができます。Visual Basicのデータグリッドのように?出来ますか?

4

1 に答える 1

4

以下に両方の方法を示しました-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

ここに画像の説明を入力してください

于 2012-05-04T20:38:06.223 に答える