ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: liaozhc

[求助] 如何满足多个列的条件汇总

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-9 09:07 | 显示全部楼层
一把小刀闯天下 发表于 2018-6-9 09:01
在end with 上面插入一行:

.Offset(-1).Resize(, 6) = Split("序号 学校名称 姓名 性别 类别 项目")

多谢,那下面的工作表名怎么样自动读取ComboBox1的值呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-9 09:15 | 显示全部楼层
一把小刀闯天下 发表于 2018-6-9 09:01
在end with 上面插入一行:

.Offset(-1).Resize(, 6) = Split("序号 学校名称 姓名 性别 类别 项目")

工作表名怎么样自动读取ComboBox1的值呢,表头单元格怎么样随内容变化而变化呢?真的多谢你

TA的精华主题

TA的得分主题

发表于 2018-6-9 09:23 | 显示全部楼层
liaozhc 发表于 2018-6-9 09:15
工作表名怎么样自动读取ComboBox1的值呢,表头单元格怎么样随内容变化而变化呢?真的多谢你

没看懂:
ComboBox1.AddItem "sheet6"

或者
ComboBox1.Text = "sheet6"

但没什么意义,并不知道你想做什么
----------------------------------------
或者输出到当前工作表?

把  With Sheets("sheet6").[a2] 改成:
With ActiveSheet.[a2]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-6-9 09:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lsc900707 发表于 2018-6-9 07:01
“多谢”再多,不如直接给别人“评分”:点击对方帖子右下角“评分”按提示操作即可。

还是版主老师理解我,一朵小花精神马上就上来了,哈哈哈。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-9 09:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一把小刀闯天下 发表于 2018-6-9 09:23
没看懂:
ComboBox1.AddItem "sheet6"

多谢,输出到新的工作表,新的工作表名就是筛选的条件

TA的精华主题

TA的得分主题

发表于 2018-6-9 10:13 | 显示全部楼层
liaozhc 发表于 2018-6-9 09:56
多谢,输出到新的工作表,新的工作表名就是筛选的条件

“输出到新的工作表“
可以用代码来指定工作表名,不过觉得没有什么意义。自己用的表格没必要这样做。
你可以在代码中把sheet6改成任一存在的工作表名就可以。

“新的工作表名就是筛选的条件”
已经输出到新的工作表了,为什么还把它作为筛选条件呢。你的筛选条件不就是3个combobox中的内容吗?是否启用这3个条件由相对应的checkbox来决定。源数据有了、条件有了于是结果就可以确定了。

或者你想处理不同的工作表中的源数据,你可以这样处理:
data = Sheets("sheet1").UsedRange
把sheet1改成任一存在的工作表名,当然这个表格中的列的数据位置是确定的(按列来定位的,不然结果肯定会出错),行数不限。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-9 10:57 | 显示全部楼层
本帖最后由 liaozhc 于 2018-6-9 12:48 编辑
一把小刀闯天下 发表于 2018-6-9 10:13
“输出到新的工作表“
可以用代码来指定工作表名,不过觉得没有什么意义。自己用的表格没必要这样做。
...

可能是我没有讲清楚,就是新输出的工作表的名字就是三个条件的文字加在一起的名字,我发一个附件给你参考下

TA的精华主题

TA的得分主题

发表于 2018-6-9 11:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
liaozhc 发表于 2018-6-9 10:57
可能是我没有讲清楚,就是新输出的工作表的名字就是三个条件的文字加在一起的名字,我发一个附件给你参考 ...

'项目3列变1列了,如果是这样直接使用工作表的筛选功能就可以了

Option Explicit

Dim data

Private Sub CommandButton1_Click()
  Dim i, j, k, n, m, cnt, datatemp, sht
  ReDim arr(1 To UBound(data, 1), 5)
  cnt = UBound(data, 1): datatemp = data
  If CheckBox1.Value Then
    For i = 2 To UBound(datatemp, 1)
      If datatemp(i, 5) = ComboBox1.Text Then
        n = n + 1
        For j = 1 To 5: datatemp(n, j) = datatemp(i, j): Next
      End If
    Next
    cnt = n
  End If
  n = 0
  If CheckBox2.Value Then
    For i = 1 To cnt
      If datatemp(i, 4) = ComboBox2.Text Then
        n = n + 1
        For j = 1 To 5: datatemp(n, j) = datatemp(i, j): Next
      End If
    Next
    cnt = n
  End If
  n = 0
  If CheckBox3.Value Then
    For i = 1 To cnt
      If datatemp(i, 3) = ComboBox3.Text Then
        n = n + 1
        For j = 1 To 5: datatemp(n, j) = datatemp(i, j): Next
      End If
    Next
    cnt = n
  End If
  If CheckBox1.Value Or CheckBox2.Value Or CheckBox3.Value Then
    If cnt > 0 Then
      For i = 1 To cnt
        For j = 1 To 5
          arr(i, j) = datatemp(i, j)
      Next j, i
      Call bsort(arr, 1, cnt)
      For i = 1 To cnt: arr(i, 0) = i: Next
      sht = IIf(CheckBox1.Value, ComboBox1.Text, vbNullString) & _
            IIf(CheckBox2.Value, ComboBox2.Text, vbNullString) & _
            IIf(CheckBox3.Value, ComboBox3.Text, vbNullString) & "组"
      n = 0
      For Each i In Sheets
        If i.Name = sht Then n = 1: Exit For
      Next
      If n = 0 Then Sheets.Add: ActiveSheet.Name = sht
    End If
  Else
    cnt = 0
  End If
  If Len(sht) > 0 Then
    With Sheets(sht).[a2]
      .Resize(Rows.Count - 1, UBound(arr, 2) + 1).ClearContents
      If cnt > 0 Then .Resize(cnt, UBound(arr, 2) + 1) = arr
      .Offset(-1).Resize(, 6) = Split("序号 学校名称 姓名 性别 类别 项目")
    End With
  End If
End Sub

Private Sub CommandButton2_Click()
  Unload Me
End Sub

Private Sub UserForm_Initialize()
  Dim i, j, dic(2)
  For i = 0 To UBound(dic)
    Set dic(i) = CreateObject("scripting.dictionary")
  Next
  data = Sheets("sheet1").UsedRange
  For i = 2 To UBound(data, 1)
    dic(1)(data(i, 4)) = vbNullString
    dic(2)(data(i, 3)) = vbNullString
    dic(0)(data(i, 5)) = vbNullString
  Next
  For Each i In dic(0).keys: ComboBox1.AddItem i: Next: ComboBox1.ListIndex = 0
  For Each i In dic(1).keys: ComboBox2.AddItem i: Next: ComboBox2.ListIndex = 0
  For Each i In dic(2).keys: ComboBox3.AddItem i: Next: ComboBox3.ListIndex = 0
  CheckBox1.Value = 1: CheckBox2.Value = 1: CheckBox3.Value = 1
End Sub

Function bsort(arr, first, last)
  Dim i, j, k, kk, t, move As Boolean
  For i = first To last - 1
    For j = first To last + first - 1 - i
      For k = LBound(arr, 2) To UBound(arr, 2) - 1
        If arr(j, k) > arr(j + 1, k) Then
          For kk = k To UBound(arr, 2)
            t = arr(j, kk): arr(j, kk) = arr(j + 1, kk): arr(j + 1, kk) = t
          Next
          move = True: Exit For
        ElseIf arr(j, k) = arr(j + 1, k) Then
          If arr(j, k + 1) > arr(j + 1, k + 1) Then
            For kk = k + 1 To UBound(arr, 2)
              t = arr(j, kk): arr(j, kk) = arr(j + 1, kk): arr(j + 1, kk) = t
            Next
            move = True
          ElseIf arr(j, k + 1) < arr(j + 1, k + 1) Then
            Exit For
          End If
        Else
          Exit For
        End If
      Next k, j
      If Not move Then Exit For
    Next
End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-9 12:43 | 显示全部楼层
一把小刀闯天下 发表于 2018-6-9 11:26
'项目3列变1列了,如果是这样直接使用工作表的筛选功能就可以了

Option Explicit

多谢,真的多谢,但我可能还是没有讲清楚,这次的vba编程偏离了方向,你第一次的vab已基本接近我所需要的,你的第二次的修正,又更加接近了我的要求,只是新的工作表名,我想是电脑生成的,而不是我将文字打上去的,就是这么一个小小的问题了。

TA的精华主题

TA的得分主题

发表于 2018-6-9 12:56 | 显示全部楼层
liaozhc 发表于 2018-6-9 12:43
多谢,真的多谢,但我可能还是没有讲清楚,这次的vba编程偏离了方向,你第一次的vab已基本接近我所需要的 ...

已经给你自动生成输出表格的表名了,根据3个combobox中当前文本有序组合而成(对应的checkbox为true),试一下就知道了。

如果还有问题我也没招了。

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-26 03:15 , Processed in 0.037024 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表