excel里创建一个按键,想把两个VBA功能模块合并,点击按键能两个模块运行完。怎么合并以下程序?

就是想在excel里创建一个按键,点击按键,能把想要的数据筛选并复制到另外一页表格,并删除空白行,因为粘贴的时候会留下空白行。如果有什么方法能在粘贴时不留下空白行就更好了,请大神们帮忙指点,谢谢

Sub 筛选复制()
Dim i As Integer
For i = 1 To 10
If Range("B" & i) = 1 Then
Rows(i).Copy Sheets("Sheets2").Cells(i, 1)
End If
Next
End Sub

Sub 删除空白行()
Dim rRow As Integer
Dim LRow As Integer
Dim j As Integer
rRow = Sheets("Sheet2").UsedRange.Row
LRow = Sheets("Sheet2").UsedRange.Row.Count - 1
For j = LRow To rRow Step - 1
If Application.WorksheetFunction.CountA(Rows(j)) = 0 Then
Rows(j).Delete
End If
Next
End Sub

在第一个程序后面call第二个程序名称,就可以一起运行了。
计算机excel应用快捷键:
Ctrl+S 保存
Ctrl+W 关闭程序
Ctrl+N 新建
Ctrl+O 打开
Ctrl+Z 撤销
Ctrl+F 查找
Ctrl+P 打印文档
Ctrl+X 剪切
Ctrl+C 复制
Ctrl+V 粘贴
Ctrl+A全选
Ctrl+B 粗体
Ctrl+I 斜体
Ctrl+U 下划线
Ctrl+Shift输入法切换
Ctrl+ 空格 中英文切换
Ctrl+Home 光标快速移到文件头
Ctrl+End 光标快速移到文件尾
Ctrl+Esc 显示开始菜单
Ctrl+Shift+< 快速缩小文字
Ctrl+Shift+> 快速放大文字
Ctrl+F5 在IE中强行刷新
Ctrl+拖动文件 复制文件
Ctrl+Backspace 启动\关闭输入法
Ctrl+Alt+A 截屏(QQ的截屏)
shift + Alt + Print Screen(选中要截屏的地方,然后按这三个键,然后打开图画或者word,粘贴即可)
拖动文件时按住Ctrl+Shift 创建快捷方式
Ctrl+Tab+shift在打开的应用程序中以反方向切换
扩展资料:
快捷键的有效范围不一定相同,比如:系统级快捷键可以全局响应,不论当前焦点在哪里、运行什么程序,按下时都能起作用;而应用程序级热键只能在当前活动的程序中起作用,当应用程序热键的定义程序不活动或在后台运行时,热键就无效了;控件级的热键则仅在当前控件中起作用。
有专门用于设置热键的工具软件,此类工具需要在后台一直运行,否则通过这各种程序定义的快捷键会失效。通过修改键盘按键映射的软件则不属于此类。
通常Windows平台下应用程序级的快捷键有几个是通用的,如Ctrl+Z常用于撤销操作。这种快捷键在菜单项的右侧或是控件的提示框中往往会注明。追问

是这样子吗?但是没效果诶。。

Sub 筛选()
Dim i As Integer
For i = 1 To 10
If Range("B" & i) = 1 Then
Rows(i).Copy Sheets("Sheet2").Cells(i, 1)
End If
Next
Call 删除空白行
End Sub

温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-12-13
你这两个SUB程序,按你目前的写法,是不能同时使用的。
你第一个SUB,是必须在你想要复制数据的那张表中使用的,
而第二个SUB,是必须在你想要删除空行的那张表中使用的。
要想同时使用,应该把第二个SUB未指明工作表名的地方,给它指明。
我有个疑问:

既然是以Range("B" & i) = 1为条件,复制过去的数据,
那么为什么Sheet2会出现空行呢?追问

因为复制到对应的 i 行,所以就留下空白行了
试了下,确实只能在当页运行。。能不能帮忙改一下程序指定到sheet2工作表,没学过VBA,完全不会啊。。。谢谢咯!

追答

那就改成,复制过去后,粘贴到最后一行的下一行,这样就不会留下空行了。

这样就省去了删除空行的额外步骤

Sub 筛选复制()
Dim i%, irow&
For i = 1 To 10
If Range("B" & i) = 1 Then
irow = Sheets("Sheets2").Range.End(3).Row + 1
Rows(i).Copy Sheets("Sheets2").Rows(irow)
End If
Next
End Sub

用这个代码吧,是粘贴到Sheet2的最后一行的下方空行中

追问

运行时 irow = Sheets("Sheet2").Range.End(3).Row + 1 这行报错了,大神再帮忙指点指点,先谢谢了哈

追答

我写错了好几个地方。
把两处Sheet2错写成了Sheets2
range忘了写上括号里的参数。
应该是这样:
Sub 筛选复制()
Dim i%, irow&
For i = 1 To 10
If Range("B" & i) = 1 Then
irow = Sheets("Sheet2").Range("B" & Rows.count).End(3).Row + 1
Rows(i).Copy Sheets("Sheet2").Rows(irow)
End If
Next
End Sub
这下应该没问题了吧。
另外:
因为你复制的时候,是根据B格=1为条件粘贴过去的,
因此可以断定Sheet2中的B列是没有空单元格的,
所以irow获取最大行号时,是给你从Sheet2的B列中获取最大使用行号。
获取到最后使用行号irow后,后面还有个+1,就是最大使用行号下方的空行。

追问

哈哈,可以了,是不是因为+1的缘故,所以首行会留空?非常感谢大神,大晚上的还帮忙解答,学到了,感激不尽哈!!!!!!

追答

你说的是对的。

如果B列只有B1是非空,B列最大行号是1,但是如果B列全是空的,B列最大行号还是1,不可能获取到0。所以不管B1有没有值,B列最大行号+1后,最小是2。

可以加上判断,解决这个问题,代码重新写了一下:

注意,看图片,有个不等于号被屏毕掉了,你自己加上。

Sub 筛选复制()

    Dim i%, irow&

    With Sheets("Sheet2") '用with模块一次性指明目标工作表

        irow = .Range("B" & Rows.Count).End(3).Row '从Sheet2的B列获取最大行号

        If .Range("B1")  "" Then irow = irow + 1 '如果Sheet2的B1非空,则+1

        For i = 1 To 10

            If Range("B" & i) = 1 Then

                Rows(i).Copy .Rows(irow) '把第i行粘贴到Sheet2的第irow行

                irow = irow + 1 '每次粘贴完后就加1,为下次粘贴作准备。

            End If

        Next

    End With

End Sub

追问

好,已经完美解决,谢谢啦^ ^

追答

刚才测试一了一下,irow是Sheet2的行号,但是每次运行完毕,都会选中在当前表的第irow行。

所以加了一句代码,让它运行结束时选中你所遍历的最后一个单元格。

如本代码是for从1至10,所以最后是选中B10单元格。

还加了一句代码,在运行结束时弹出完毕提醒。

加了这两句:

    Range("B" & i - 1).Select

    MsgBox "处理完毕!", 64

你如果了解for循环的原理,就应该知道,当FOR结束时,i是已经越界的,i是最大遍历值+步长。

所以在最后i-步长,就是最大遍历值。

再额外说点费话:

for语句的完整写法是:

For i = 1 to 10 Step 1

Next

这里的Step是步长,当步长为1时可以省略不写。

如果步长为负数,则表示逆向循环,从大数向小数循环,例如:

For i = 100 to -200 Step -2

Next

这个例子表示i从100(大数)倒着向-200(小数)循环,步长是-2,表示每循环一次,i就减掉2。

步长你可以理解为咱们在走路,每一次要迈出多大的步子。

追问

又多学了一些,感谢!^^

追答

再补充一点,当for循环结束时,最大遍历值,不一定是to后边的那个数。
例如:
for i = 1 to 9 step 3
next
他是这么个原理:
第一次循环,i直接等于1,然后去判断有没有越界,
程序发现i没有超越9,那么就执行for里面的语句块。

第二次循环,i=i+步长,即i=1+3,即i=4,然后去判断有没有越界,
程序发现i没有超越9,那么又执行for里面的语句块。
第三次循环,i=i+步长,即i=4+3,即i=7,然后去判断有没有越界,
程序发现i没有超越9,那么又执行for里面的语句块。
第四次循环,i=i+步长,即i=7+3,即i=10,然后去判断有没有越界,
程序发现,i已经超越9了,那么终止执行,for循环结束。
最后,for结束时,i的值是10,比它上一次的成功循环,多了一个步长。
所以,最后i-步长,得出的是上一次的成功循环,即i-步长=10-3,即7,不一定是to后面那个数字9。

本回答被提问者采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网