当前位置: 首页 > news >正文

Microsoft VBA Excel VBA学习笔记——双重筛选+复制数值1.0

问题场景

CountryProductCLASS 1CLASS 2CLASS 3CLASS 4CLASS 5CLASS 6
USApple0.3641416030.8918210610.0591451990.7320110290.0509636560.222464259
USBanana0.2300833330.4027262180.1548836670.2988904860.7802326210.028592635
CNApple0.7762370470.5075548320.4819787860.9640947100.6356084830.650148065
CNBanana0.3144161170.8658298270.8387462250.5848036580.6321439380.635900146
HKApple0.0389550130.5376865470.3968842280.6462837090.9803163570.729927410
HKBanana0.9296995670.8759146430.8556512890.3495028630.7788271160.056140485
USOrange0.6372955100.9663994570.1020057510.3453791540.1828123830.255992180
USStrawberry0.9378938890.1519479060.2347077400.6263084240.8043764390.138557531
CNOrange0.5897015550.0298215380.3249992020.1384804010.4108181090.181386365
CNStrawberry0.5870898860.8703348010.0506607110.7121572250.9460111220.286730440
HKOrange0.8846342430.8961006870.6758443930.3552472620.4981877420.325255134
HKStrawberry0.6973443940.4232279320.6502033620.5607843270.2981413310.186946272

简述:

其实很简单的操作,就是两次筛选后复制Item1全部数据到Item2中,两个Item有且只有一行。

草稿1

  1. 打开工作表:通过工作表名称来定位和激活工作表。
  2. 定位筛选判断列:在第一行中找到Product的列,然后进行筛选。
  3. 筛选指定名称:首先筛选出包含 name1 “Apple”和name2“Banana”的行。
  4. **再次筛选Country **:在筛选出的结果中,基于Country (US、HK、CN)进行进一步筛选并复制数据。
Function FilterAndCopyData(sheetName As String, columnName As String, name1 As String, name2 As String)Dim ws As WorksheetDim filterColumn As LongDim lastRow As LongDim i As Long' 尝试访问工作表On Error Resume NextSet ws = ThisWorkbook.Worksheets(sheetName)On Error GoTo 0If ws Is Nothing ThenMsgBox "工作表 '" & sheetName & "' 不存在。", vbExclamationExit FunctionEnd If' 找到筛选判断列filterColumn = 0For i = 1 To ws.Cells(1, ws.Columns.Count).End(xlToLeft).ColumnIf ws.Cells(1, i).Value = columnName ThenfilterColumn = iExit ForEnd IfNext iIf filterColumn = 0 ThenMsgBox "列 '" & columnName & "' 没有找到。", vbExclamationExit FunctionEnd If' 清除现有筛选If ws.AutoFilterMode Then ws.AutoFilterMode = False' 应用筛选ws.Range("A1").AutoFilter Field:=filterColumn, Criteria1:=name1ws.Range("A1").AutoFilter Field:=filterColumn, Criteria2:=name2' 复制数据lastRow = ws.Cells(ws.Rows.Count, filterColumn).End(xlUp).RowFor i = 2 To lastRowIf ws.AutoFilter.Range.Rows(i).Hidden = False ThenIf ws.Cells(i, filterColumn).Value = name1 Then' 找到产地并复制数据Select Case ws.Cells(i, "A").ValueCase "US", "HK", "CN"' 复制C列以后的数据到Banana对应行ws.Cells(i, "C").Resize(1, ws.Columns.Count - 3).CopyFor j = 2 To lastRowIf ws.Cells(j, filterColumn).Value = name2 And ws.Cells(j, "A").Value = ws.Cells(i, "A").Value Thenws.Cells(j, "C").PasteSpecial Paste:=xlPasteValuesEnd IfNext jEnd SelectEnd IfEnd IfNext i' 关闭筛选If ws.AutoFilterMode Then ws.AutoFilterMode = FalseMsgBox "数据复制完成。"
End Function

草稿2

  1. 接受工作表名称、列名称、以及两个筛选值作为参数。
  2. 在指定的工作表上执行筛选操作。
  3. 对筛选后的数据,按国家分类,将指定类别(Apple)的数值复制到另一个类别(Banana)中。
Sub CopyValuesBasedOnClassAndCountry(wsName As String, columnName As String, value1 As String, value2 As String)Dim ws As WorksheetDim lastRow As Long, i As LongDim countryCol As Integer, classCol As Integer, col As IntegerDim dataRange As Range, cell As RangeDim country As StringDim dict As ObjectSet dict = CreateObject("Scripting.Dictionary")' 设置工作表Set ws = ThisWorkbook.Worksheets(wsName)' 确定总行数lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row' 查找国家和分类列的索引For i = 1 To ws.Cells(1, ws.Columns.Count).End(xlToLeft).ColumnIf ws.Cells(1, i).Value = "Country" ThencountryCol = iElseIf ws.Cells(1, i).Value = columnName ThenclassCol = iEnd IfNext i' 遍历所有行For i = 2 To lastRowIf (ws.Cells(i, classCol).Value = value1 Or ws.Cells(i, classCol).Value = value2) Thencountry = ws.Cells(i, countryCol).ValueIf Not dict.Exists(country) ThenSet dict(country) = New CollectionEnd Ifdict(country).Add iEnd IfNext i' 复制数值For Each key In dict.KeysDim appleRow As LongDim bananaRow As LongFor Each idx In dict(key)If ws.Cells(idx, classCol).Value = "Apple" Then appleRow = idxIf ws.Cells(idx, classCol).Value = "Banana" Then bananaRow = idxNextFor col = 3 To ws.Cells(1, ws.Columns.Count).End(xlToLeft).Columnws.Cells(bananaRow, col).Value = ws.Cells(appleRow, col).ValueNext colNextMsgBox "数据已经根据指定的规则复制完成。"
End Sub

总结

寻找最佳的方案中》》》

http://www.lryc.cn/news/424361.html

相关文章:

  • 谷歌反垄断官司败诉后,或又面临被拆分风险?
  • 数据结构入门——06树
  • FFmpeg源码:av_packet_move_ref、av_packet_make_refcounted函数分析
  • 12 中断
  • 经典算法题总结:十大排序算法,外部排序和Google排序简介
  • 服务器是什么?怎么选择适合自己的服务器?
  • 区块链技术的应用场景
  • 凤凰端子音频矩阵应用领域
  • LeetCode-字母异位词分组
  • 《Linux运维总结:基于x86_64架构CPU使用docker-compose一键离线部署etcd 3.5.15容器版分布式集群》
  • WPF动画
  • 大数据系列之:统计hive表的详细信息,生成csv统计表
  • flutter 画转盘
  • 图像识别,图片线条检测
  • python crawler web page
  • 基于QT实现的TCP连接的网络通信(客户端)
  • Vue2中watch与Vue3中watch对比
  • Web 3 一些常见术语
  • 揭开数据分析中的规范性分析:从入门到精通
  • Linux文件IO
  • ccfcsp-202309(1、2、3)
  • 数据结构--数据结构概述
  • Spring中的BeanFactoryAware
  • Neo4j service is not installed
  • LeetCode 3132.找出与数组相加的整数 II:排序+3次尝试(nlog n)
  • 微信小程序--26(全局配置-1)
  • 汽车4S店管理系统-计算机毕设Java|springboot实战项目
  • bug的常见排查和分析思路以及相关的原因分类
  • Nature:7个提升科研产出的实用建议
  • react-native从入门到实战系列教程-页面之间的跳转