Excel通过用户输入显示来自另一个工作表的数据

时间:2012-12-05 12:59:12

标签: excel worksheet-function

我需要找到某些数字之间的行(由用户提供),以便在屏幕上显示它们,以便打印出来。

例如:用户输入104822000011和104822000020作为fromto值。然后我需要在另一个工作表中搜索这些之间的任何数字。工作表中的数据来自数据库。我需要返回给定数字之间的行中的所有数据。

我对VBA知之甚少,所以如果可以通过工作表函数完成,那将是更好的选择。我用Google搜索并尝试了一些东西,但它们似乎都不容易做或不起作用。可以有人帮我一点吗?

2 个答案:

答案 0 :(得分:2)

假设您在工作表dataWS上有数据,其中A列中的行号和B列中的数据

在另一张工作表上,您在fromA1中的to输入了值B1

然后在A2 =IF($A1<$B$1,$A1+1,"")中,它将显示您要在此行上显示的行号。

接下来,在B2中使用=IF($A2="","",VLOOKUP($A2,dataWS!A:B,2,FALSE))检索数据。 将A2:B2中的公式复制到下面的行,您应该设置。

如果您想使用VBA,可以使用以下代码(假设您的数据中的ID正确排序)。还要注意,在写入新数据之前,它不会清空目标区域。

Public Sub getData()

Dim currentId As Long
Dim toId As Long

Dim wsTarget As Worksheet
Dim targetIdCol As Integer
Dim targetDataCol As Integer

Dim wsSource As Worksheet
Dim sourceIdCol As Integer
Dim sourceDataCol As Integer

Dim readRow As Long
Dim writeRow As Long


Set wsTarget = ThisWorkbook.Worksheets("Sheet2") ' name of the target worksheet
targetIdCol = 1    'number of the column where the ids are to be written (a=1)
targetDataCol = 2   'number of the column where the data is to be written

Set wsSource = ThisWorkbook.Worksheets("Sheet1") ' name of the source data worksheet
sourceIdCol = 1    'number of the column where the ids are to be read(a=1)
sourceDataCol = 2   'number of the column where the data is to be read


currentId = wsTarget.Range("A1").Value  'cell in which the from is specified (here "A1" of target worksheet)
toId = wsTarget.Range("B1").Value 'cell in which the to is specified (here "B1" of target worksheet)


readRow = 1   'row at which the data should start to be read
writeRow = 2   'row at which the data should start to be written


While (wsSource.Cells(readRow, sourceIdCol) <> "") And (currentId <= toId)

    If currentId = wsSource.Cells(readRow, sourceIdCol).Value Then
        wsTarget.Cells(readRow, targetIdCol) = wsSource.Cells(readRow, sourceIdCol).Value
        wsTarget.Cells(readRow, targetDataCol) = wsSource.Cells(readRow, sourceDataCol).Value
        readRow = readRow + 1
    Else

        If currentId > wsSource.Cells(readRow, sourceIdCol).Value Then
             readRow = readRow + 1
      Else
          currentId = currentId + 1
      End If
    End If

Wend



End Sub

答案 1 :(得分:1)

是的,你可以通过复制行(你不想要的)或VBA来做到这一点。 而且我相信VBA是个不错的选择。

但是如果记录号是严格的数字并且没有太多数据要显示,我有一个使用数据透视表的愚蠢方法。

您可以添加一个对数据表引用的pivotTable。然后将所有字段拖到行标签。然后对于每个字段设置,在布局中选择“以表格形式显示项目标签”并删除所有小计。它现在看起来应该与原始数据类似。

然后您可以选择记录编号上的任意位置,并在行标签上选择“标签过滤器==&gt;之间”。然后输入你的from和to值。