Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2949|回复: 11

[已解决]【已解决】求大神帮忙,如何用宏实现数据导入功能?

[复制链接]
发表于 2017-3-10 17:03 | 显示全部楼层 |阅读模式
本帖最后由 boyfat 于 2017-3-13 13:41 编辑

       现在有A文件与B文件,现需要在B文件里的Sheet2里自动导入A文件Sheet1里面A列到D列的内容,格式排版一样,而A文件里的Sheet1里面的内容会更改与添加,因此B文件的Sheet2每次打开都需要自行检查更新。


A文件Sheet1

       一开始是使用数据导入功能实现的,现在因为某种原因,不能使用数据导入功能,
       就改为用 =[A.xlsx]Sheet1!$A:$A 对对应列进行复制也可实现,但由于实际文件内容过万条,导致每次打开都差不多要死机
自己曾试过写代码来实现功能,当Sheet1与Sheet2在同一个文件里时可实现新增功能,但把它们分开在不同文件时,在定义变量加上文件名时候就出错

Private Sub CommandButton1_Click()
lr = Sheet2.[a65536].End(3).Row + 1
lt = [A.xlsx].Sheet1.[a65536].End(3).Row
If lr > lt Then
lt = lr
End If
[A.xlsx].Sheet1.Range(("A" & lr), ("D" & lt)).Copy
Sheet2.Range("A" & lr).PasteSpecial Paste:=xlPasteValues, Transpose:=False
End Sub
       请教各位大侠,如何利用宏简单实现该功能?



最佳答案
2017-3-12 22:56
本帖最后由 wenzili 于 2017-3-13 16:07 编辑

Private Sub CommandButton1_Click()
Dim dadaatod As Variant
Dim rg As Range
Dim wb As Workbook
Dim n As Single

Set wb = Workbooks("A.xlsx")
Set rg = wb.Worksheets("sheet1").UsedRange
n = rg.rows.Count
Set rg = wb.Worksheets("sheet1").Range("a1").Resize(n, 4)
dadaatod = rg.Value
Set rg = ThisWorkbook.Sheets("sheet1").Range("a1")
Set rg = rg.Resize(n,4)
rg.Value = dadaatod



End Sub
数据多,用数组应该最快。
行变化,列固定。没来的急测试。看看行不?

新建文件夹 (2).rar

23.99 KB, 下载次数: 8

A,B文件

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2017-3-11 09:17 | 显示全部楼层
回复

使用道具 举报

发表于 2017-3-12 22:56 | 显示全部楼层    本楼为最佳答案   
本帖最后由 wenzili 于 2017-3-13 16:07 编辑

Private Sub CommandButton1_Click()
Dim dadaatod As Variant
Dim rg As Range
Dim wb As Workbook
Dim n As Single

Set wb = Workbooks("A.xlsx")
Set rg = wb.Worksheets("sheet1").UsedRange
n = rg.rows.Count
Set rg = wb.Worksheets("sheet1").Range("a1").Resize(n, 4)
dadaatod = rg.Value
Set rg = ThisWorkbook.Sheets("sheet1").Range("a1")
Set rg = rg.Resize(n,4)
rg.Value = dadaatod



End Sub
数据多,用数组应该最快。
行变化,列固定。没来的急测试。看看行不?

回复

使用道具 举报

 楼主| 发表于 2017-3-13 12:35 | 显示全部楼层
本帖最后由 boyfat 于 2017-3-13 12:54 编辑
wenzili 发表于 2017-3-12 22:56
Private Sub CommandButton1_Click()
Dim dadaatod As Variant
Dim rg As Range

谢谢大神指教,已经明白了
回复

使用道具 举报

发表于 2017-3-13 13:00 | 显示全部楼层
4和n换下。resize(n,4),两处
回复

使用道具 举报

 楼主| 发表于 2017-3-13 13:39 | 显示全部楼层
wenzili 发表于 2017-3-13 13:00
4和n换下。resize(n,4),两处

发现就这样不行,还要把n = rg.Columns.Count改为n = rg.Rows.Count
回复

使用道具 举报

 楼主| 发表于 2017-3-13 15:24 | 显示全部楼层
wenzili 发表于 2017-3-12 22:56
Private Sub CommandButton1_Click()
Dim dadaatod As Variant
Dim rg As Range

再请教大神,您的程序简单易懂,我稍做修改就已经完成功能,但一个问题是,我必须同时打开A与B才能把A的内容写进B里,请问有没有方法可以不打开A也能导入A的内容?

回复

使用道具 举报

发表于 2017-3-13 16:04 | 显示全部楼层
boyfat 发表于 2017-3-13 15:24
再请教大神,您的程序简单易懂,我稍做修改就已经完成功能,但一个问题是,我必须同时打开A与B才能把A的 ...

我也是刚学习VBA,多交流。
可以用open打开A,让后结束前再close A
应该可行。
回复

使用道具 举报

发表于 2017-3-13 16:06 | 显示全部楼层
boyfat 发表于 2017-3-13 13:39
发现就这样不行,还要把n = rg.Columns.Count改为n = rg.Rows.Count

你说得对的。我老行列不分。
回复

使用道具 举报

 楼主| 发表于 2017-3-13 17:02 | 显示全部楼层
wenzili 发表于 2017-3-13 16:04
我也是刚学习VBA,多交流。
可以用open打开A,让后结束前再close A
应该可行。

你说具体点吗?
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-6-6 20:20 , Processed in 0.210593 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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