Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何按行使用高级筛选_Excel_Filtering_Vba - Fatal编程技术网

Excel 如何按行使用高级筛选

Excel 如何按行使用高级筛选,excel,filtering,vba,Excel,Filtering,Vba,人员职责日期的excel文件如图所示。职责标记为X 如何使用过滤获取特定人员的职责日期 有没有办法把每个人的名字和他们的工作日期写在一张单独的表格里?我想你想做的是: Unpivot: 选择数据,然后在“插入”菜单上选择“表格” 在“数据”菜单上,单击“表格/范围” 查询窗口将打开。选择需要提取的列。根据您的数据,要突出显示的列是案例的类型和数量 在Tranform菜单上选择Unpivot Columns 如果数据现在看起来正确,请关闭接受更改的查询编辑器。 另一个例子: 如果您的目标是从中获得

人员职责日期的excel文件如图所示。职责标记为X

如何使用过滤获取特定人员的职责日期


有没有办法把每个人的名字和他们的工作日期写在一张单独的表格里?

我想你想做的是:

Unpivot: 选择数据,然后在“插入”菜单上选择“表格” 在“数据”菜单上,单击“表格/范围” 查询窗口将打开。选择需要提取的列。根据您的数据,要突出显示的列是案例的类型和数量 在Tranform菜单上选择Unpivot Columns 如果数据现在看起来正确,请关闭接受更改的查询编辑器。 另一个例子: 如果您的目标是从中获得: …对这个或那个: …那么你想做的就是取消预约。 如何取消激活交叉表样式数据: 你可以找到上面写的步骤,还有一种通过数组过滤的方法

您需要按行筛选结果,例如Tessy Paul-4月26日18日、4月27日18日、4月30日18日、2日至5月18日,但在我看来,您无法通过高级筛选方法获得这些结果。相反,我演示了另一种方法,使用数组通过VBA获取在某个范围内循环的源数据速度较慢,并通过Application.Filter提取重新排列=重新编码的数据,匹配的项标记为x为duty

基本步骤

首先,只需指定一个预定义的范围参考,即可将所有数据写入变量二维数据字段数组中-请参见第[2]节:

Dim v   As Variant  ' or simply: Dim v
Dim rng As Range    
'set rng = ...
v = rng.Value2  ' or simply: v = rng
此外,还可以通过应用程序筛选数组。筛选时有一些限制:

a除了孤立的单元格数据和 b你需要一个1-dim阵列

ad a为了在筛选时识别姓名和工作日期,只需将这些信息与分隔符一起添加,例如,参见第[3]节。 这允许您稍后通过循环每个数组项来分割过滤后的数据-请参阅第[4]和[5]节

ad b要从二维数组中提取一维数组,可以通过Application.Index函数提取行或列。 在下面的示例中,我将结果分配给另一个名为vi的数组。 例如:如果要提取第4.1节中所示的行,则第二个参数标识从1开始的行号,第三个参数列号仅获取0: 然后,可以对这个新标注的源数组和匹配字符串x应用Filter函数,以获得由x字符和所选分隔符定义为占空比的所有数据

vi=VBA.filterApplication.Indexv,i,0,x,真,假

注:

匹配字符串由两个字符x组成,因为x本身也可以是名称的一部分,例如Alexander

作为行过滤的补充: 要提取列,请参见第5.1节,因为这需要通过Application.Transpose进行额外调整

每个提取的行或列数组将写回目标工作表,并通过调试中的联接函数显示。在Visual Basic编辑器VBE的即时窗口中打印

代码示例


..你的目标是只显示一个人?@ashleedawg Ya图片是一样的。。我试图删除第二个,但无法删除t@ashleedawg我需要每个人履行职责的日期。例如过滤后,我需要此类过滤工具。我得到了Tessy Paul-4月26日18日、4月27日18日、4月30日18日、2-5月18日Fr.Joy PT-2018年4月26日,其他教师也同样需要。添加了一种通过阵列过滤的方法,因为IMO高级过滤是不够的-@seena@ashleedwag. 先生,我没有从数据菜单中的表/范围中获取
Option Explicit

Sub DutiesPerName()
' Site: https://stackoverflow.com/questions/50083149/how-can-i-use-advance-filtering-row-wise
' [0] Declare variables
  Dim a()
  Dim ws    As Worksheet, ws2 As Worksheet
  Dim rng   As Range, i As Long, j As Long, r As Long, c As Long
  Dim v, vi, temp
' [1] define sheetname and data range
' 1.0 set worksheet object to memory
  Set ws = ThisWorkbook.Worksheets("MyDataSheet")  ' << change to your data sheet name
  Set ws2 = ThisWorkbook.Worksheets("MyDutySheet") ' << change to your target sheet name
' 1.1 get rows and columns
  r = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
  c = ws.Range("A1").End(xlToRight).Column
' 1.2 Alternative code line: Set rng = ws.UsedRange
  Set rng = ws.Range(ws.Range(ws.Cells(1, 1), ws.Cells(r, c)).Address)
' [2] create a variant 1-based 2-dim datafield array
  v = rng.Value2
' [3] CODE duty items by appending "#" plus date and name info
  For i = 2 To UBound(v)                ' start loop from 2nd row
      v(i, 1) = "x#" & v(i, 1)          ' mark name captions to get them filtered, too
      For j = 3 To UBound(v, 2)         ' start inner loop from 3rd column
          If v(i, j) = "x" Then         ' code found duty items
             v(i, j) = v(i, j) & "#" & Format(v(1, j), "dd-mmm-yy") & "#" & v(i, 1) & "#" & j
             'Debug.Print "v(" & i & "," & j & ")=""" & v(i, j) & """"
          End If
      Next j
  Next i
' mark date captions with "x#" to get them filterd, too
  For j = 3 To UBound(v, 2)
        v(1, j) = "x###" & Format(Val(v(1, j)), "dd-mmm-yy")
  Next j
' -----------------------
' [4] Duty Dates per Name:
' -----------------------
  ws2.Cells.Clear: ws2.Range("A1") = "Name": ws2.Range("B1") = "Duty Dates ..."
  For i = 2 To UBound(v, 1)             ' start loop from 2nd row
  ' 4.1 filter redimensioned 1-dim ROW array via "x#"
    vi = VBA.filter(Application.Index(v, i, 0), "x#", True, False)
    For j = LBound(vi) To UBound(vi)
        vi(j) = Split(vi(j), "#")(1)    ' extracts date from e.g. "x#15-Jan-19#x#Paul#2"
    Next j
    ' write dates per name into target worksheet ws2
    ws2.Range("A1").Offset(i - 1, 0).Resize(1, UBound(vi) + 1) = vi
    Debug.Print "Row# " & i & " (" & _
                ws2.Range("A1").Offset(i - 1, 0).Resize(1, UBound(vi) + 1).Address & ") 1 Name + " & UBound(vi) & " Dates: " & _
                Join(vi, ", ")
   Next i
   Debug.Print
' -----------------------
' [5] Names per Duty Date:
' -----------------------
  ws2.Range("A1").Offset(r + 2, 0) = "Duty Date": ws2.Range("A1").Offset(r + 2, 1) = "Names ..."
  For i = 3 To UBound(v, 2)             ' start loop from 3rd column
  ' 5.1 filter redimensioned 1-dim COLUMN array via "x#"
    vi = VBA.filter(Application.Transpose(Application.Index(v, 0, i)), "x#", True, False)
    For j = LBound(vi) To UBound(vi)
        temp = Split(vi(j), "#")
        vi(j) = temp(3)                  ' extracts Name from e.g. "x#15-Jan-19#x#Albert#3"
    Next j
    ' write each names per date into target worksheet ws2
    If UBound(vi) > -1 Then
       ws2.Range("A1").Offset(r + i, 0).Resize(1, UBound(vi) + 1) = vi
       Debug.Print "Col# " & i & " (" & _
                   ws2.Range("A1").Offset(r + i, 0).Resize(1, UBound(vi) + 1).Address & ") 1 Date + " & UBound(vi) & " Names: " & _
                   Join(vi, ", ")
    End If
   Next i

End Sub