2301_77928449 2024-03-31 14:53 采纳率: 22.5%
浏览 5
已结题

VBA字典筛选后的查询

img

img


想先筛选出张三李四,再用工号获取sheet2中的入职日期,自己用字典的方法运营不出结果,不知道是哪里错了

img

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-31 14:53
    关注

    引自免费微信小程序:皆我百晓生

    在VBA中,如果你想要通过字典筛选出特定值(在这个例子中为张三和李四)并从sheet2获取入职日期,可以遵循以下步骤:

    1. 首先,打开你的Excel工作簿并选择包含图表和数据范围的单元格A1:B10。

    2. 使用代码筛选出张三和李四:

      Dimzd As Object
      Setzd = CreateObject("Scripting.Dictionary")
      
      Range("A1:C10").AutoFilter Field:=18, Criteria:=Array("张三", "李四"), Operator:=xlFilterValues
      
      For Each row In Range("A1:C10")
          If Not zd.exists(row.Value) Then
              zd.Add row.Value, row.Cells(3).Value
          End If
      Next row
      

      这段代码首先创建一个名为zd的对象,并将其设置为一个新的字典。然后,它遍历Sheet2中的所有行,对每一行都检查是否已存在于字典中。如果不存在,就将当前行的值添加到字典中并将行的第3个引用(即列索引)设为相应的值。

    3. 获取sheet2中的入职日期:

      Dim SH As Worksheet
      Set SH = Workbooks("1").Sheets("2")
      
      ' 假设sheet2有三个区域:V1、V2和V3,分别对应入职日期
      Dim V1Cell As Range
      Dim V2Cell As Range
      Dim V3Cell As Range
      Dim minDate As Date
      Dim maxDate As Date
      
      ' 获取V1、V2和V3区域的引用
      V1Cell = Range("V1").Offset(1, 0)
      V2Cell = Range("V2").Offset(1, 0)
      V3Cell = Range("V3").Offset(1, 0)
      
      ' 初始化最小和最大日期范围
      minDate = DateSerial(2024, 3, 26)
      maxDate = DateSerial(2024, 3, 31)
      
      ' 遍历V1区域
      For Each cell In V1Cell
          ' 如果该日期小于或等于minDate,则将其存储为最小日期
          If cell.Value <= minDate Then
              minDate = cell.Value
          End If
      
          ' 将员工姓名提取出来,并替换最小日期
          Replace(minDate, "张三", cell.Value)
          Replace(minDate, "李四", cell.Value)
      Next cell
      
      ' 遍历V2区域
      For Each cell In V2Cell
          ' 如果该日期大于或等于maxDate,则将其存储为最大日期
          If cell.Value >= maxDate Then
              maxDate = cell.Value
          End If
      
          ' 将员工姓名提取出来,并替换最大日期
          Replace(maxDate, "张三", cell.Value)
          Replace(maxDate, "李四", cell.Value)
      Next cell
      
      ' 遍历V3区域
      For Each cell In V3Cell
          ' 如果该日期等于minDate或maxDate,则跳过不进行处理
          If MinDate < cell.Value Or MaxDate > cell.Value Then
              Exit For
          End If
      
          ' 将该日期及其对应的员工名称转换为字符串,替换最小和最大日期
          Replace(cell.Value, minDate, cell.Value)
          Replace(cell.Value, maxDate, cell.Value)
      Next cell
      
      ' 打印筛选结果
      MsgBox "筛选结果: 张三" & vbNewLine & "李四" & vbNewLine
      

      这段代码首先将Sheet2中的所有行的第18列设为键值对,其中值为相应的员工名。然后,它初始化了两个变量minDatemaxDate来存储最小和最大日期范围。接着,它遍历V1、V2和V3区域的引用,查找每个日期及其对应的员工姓名,并根据这些信息将每个日期及其对应的员工名替换为字符串。最后,它打印出筛选后的结果。

    注意:上述代码中的月份和日期格式取决于你的Excel版本和工作簿样式。例如,在Microsoft Excel 2007或更高版本中,月份和日期通常显示为两位数(例如"03"),且每个日期之间都用空格分隔。如果你的工作簿格式不同,可能需要调整这些部分的显示方式。

    此外,由于此示例仅考虑字段"工号"作为筛选条件,若需要其他字段(如"姓名"、"入职日期"等)的数据筛选,只需要相应地修改查询和替换字符串即可。例如,如果你需要在"姓名"字段上筛选员工,你可以修改数组为Array("张三", "李四"),并在筛选条件的匹配部分进行相应修改。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月31日
  • 修改了问题 3月31日
  • 创建了问题 3月31日