Excel VBA:先排序,然后复制并粘贴

如何解决Excel VBA:先排序,然后复制并粘贴

| 所有,我需要编写一个执行以下操作的宏:      在将数据输入到E列的最后一个空白单元格中时,按E列按降序对整个工作表进行排序   工作表排序后:           2a。将单元格复制到第一个输入数据的单元格左侧的相邻单元格中                 2b。将复制的数据粘贴到最初输入数据的同一行的第一列中          2c。将光标移动到紧挨着第一次输入数据的单元格右边的相邻单元格    下面,我展示了按输入代码排序的方法,该方法有效。但是,然后我无法获取正确的代码来复制,粘贴和移动。我最常见的问题是:输入数据后,行会移动,但光标会停留在首次输入数据的行中。有人可以帮忙吗? (我什至无法正确缩进这篇文章!)
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not (Application.Intersect(Worksheets(\"Sheet1\").Range(\"E:E\"),Target) Is Nothing) Then
        DoSort
    End If
End Sub

Private Sub DoSort()
    Worksheets(\"Sheet1\").Range(\"A:E\").Sort Key1:=Worksheets(\"Sheet1\").Range(\"E1\"),Order1:=xlDescending,Header:=xlYes
End Sub
    

解决方法

关于1、2a和2b:在排序之前进行复制更为简单。这样,复制的值将与其余值一起排序。
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not (Application.Intersect(Worksheets(\"Sheet1\").Range(\"E:E\"),Target) _
        Is Nothing) Then
        \' First copy
        Target.Offset(0,-1).Copy Destination:=Target.Offset(0,-4)
        \' Then sort
        DoSort
    End If
End Sub
剩下的问题(2c)是在对行进行排序之后如何将活动单元格移到适当的行。想必您希望用户在F列中输入更多数据吗? 同样,最直接的解决方案是首先进行输入,然后进行排序。这将带来额外的好处,即用户将不会在E列和F列中的输入数据之间跳转输入行。在用户输入了所有数据之后,排序甚至可能只发生一次。 当然,以上内容只是设计建议,而不是针对特定任务2c的解决方案。如果排序后确实要移动活动单元格,那么解决方案将不可避免地变得更加复杂。 Excel的“ 2”方法不返回索引,以便在排序后找到您的条目。您必须自己创建一个索引/“序列号”,并在排序后进行搜索。这有效:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim newIndex As Long
    If Not (Application.Intersect(Worksheets(\"Sheet1\").Range(\"E:E\"),Target) _
        Is Nothing) Then
        \' Index the new entry in column B. (You can put the index elsewhere.)
        newIndex = WorksheetFunction.Max(Range(\"B:B\")) + 1
        Target.Offset(0,-3).Value = newIndex
        \' Copy the entry.
        Target.Offset(0,-4)
        \' Sort
        DoSort
        \' Search for the new index after sorting. Select cell in column 6 (F).
        Cells(WorksheetFunction.Match(newIndex,Range(\"B:B\"),0),6).Select
    End If
End Sub
如果您所有的条目都是唯一的(即没有重复项),则不一定要建立索引;您原则上可以只搜索条目本身。但是,如果可能存在重复项,则搜索条目本身(而不是其索引)将更加混乱,并且可能会导致不良行为,除非对其进行了正确的编程。我发现只使用索引会更清洁。     ,建议您保存输入的值,并在排序后搜索该值。 请注意,我们可能已将dup数据添加到E列中,因此我们还需要存储另一列的信息,直到拥有可靠的密钥为止。 因此,一旦您知道需要搜索的值,就可以找到包含您在列E中添加的数据的单元格(该数据可能在当前的任何其他行中,不仅限于最后一行),并将其用作锚定到您的其他操作。 有几种方法可以找到矩阵中的特定条目(根据需要使用Excel或纯VBA)。如果您在实施它们时遇到问题,请告诉我们。 单元格地址(在E列中)包含刚刚添加的值,您将使用
offset
函数来设置相邻的值。再次,如果您在执行它时遇到问题,请告诉我们您的疑问。 希望能帮助到你 :) Rgds     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-