VB把一个Excel中的部分数据Copy到另一个Excel表中

此博客介绍了一个宏脚本,用于批量处理多个Excel文件,通过读取特定年份的数据并整合到另一张工作表中,实现了数据的高效迁移与格式统一。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:在View -> Toolbar -> View 下调出编辑,可以看到“Comment Block”

Shift + F8 调试下一行

Alt + F8 调出宏

字符串,数值在定义之后,可以直接赋值

Workbooks 集合包含 Microsoft Excel 中所有当前打开的 Workbook 对象。

application.transpose 转置

WorksheetFunction.transpose

找值

http://zhidao.baidu.com/question/180864693.html


下面是最终版本,能实现按年份匹配的

Sub Mycopy()
  
Dim n As Integer
Dim companylist As Range
Dim companyname As Object
Dim SourceBook As Workbook
Dim SourceSheet As Worksheet
Dim myrange As String

n = 2
 
ThisWorkbook.Activate
Set companylist = Range("B2:B214")


  For Each companyname In companylist
   Path = "C:\Users\WilliamDong\Dropbox\数据\EXCEL\" & companyname & ".xlsx"
   
   If Dir(Path) <> "" Then
   
            Set mydictionary = CreateObject("Scripting.Dictionary")
            Set SourceBook = Workbooks.Open(Path, 0, True)
            Set SourceSheet = SourceBook.Worksheets(1)
            For i = 2 To 9 Step 1          ' C2:C9  所需数据的年份范围
                    If SourceSheet.Range("C" & i) <> "" Then
                       mydictionary.Add SourceSheet.Range("C" & i).Value, SourceSheet.Range("L" & i).Value
                       
                    End If
            Next i
            
           dic_keys = mydictionary.keys
           dic_items = mydictionary.items
            
            ' 下面遍历字典,把值拿出来赋给另一个Excel表中对应的位置E2:L2,对应2005~~2012
            For j = 0 To mydictionary.Count - 1
                    Dim indexNum As String
            
                    Select Case dic_keys(j)
                    Case 2005
                       indexNum = "E" & n
                    Case 2006
                       indexNum = "F" & n
                    Case 2007
                       indexNum = "G" & n
                    Case 2008
                       indexNum = "H" & n
                    Case 2009
                       indexNum = "I" & n
                    Case 2010
                       indexNum = "J" & n
                    Case 2011
                       indexNum = "K" & n
                    Case 2012
                       indexNum = "L" & n
                    End Select
                    
                    
                    ThisWorkbook.Worksheets(1).Range(indexNum) = dic_items(j)
            Next
                       
            SourceBook.Close False
   Else
   
   End If
   
     n = n + 1
     
  Next companyname








End Sub






最终的(没能实现按不同年份匹配)

Sub Mycopy()
  
Dim n As Integer
Dim companylist As Range
Dim companyname As Object
Dim SourceBook As Workbook
Dim SourceSheet As Worksheet
Dim myrange As String

n = 2

ThisWorkbook.Activate
Set companylist = Range("B2:B214")


  For Each companyname In companylist
   Path = "C:\Users\WilliamDong\Dropbox\数据\EXCEL\" & companyname & ".xlsx"
   
   If Dir(Path) <> "" Then
   
   Set SourceBook = Workbooks.Open(Path, 0, True)
   Set SourceSheet = SourceBook.Worksheets(1)
   RANGE_ = SourceSheet.Range("L2:L9")
   
    myrange = "E" & n & ":" & "L" & n
    
    ThisWorkbook.Activate
    ThisWorkbook.Worksheets(1).Range(myrange) = WorksheetFunction.Transpose(RANGE_)    '写入数据
    
   
   SourceBook.Close False
   Else
   
   End If
   
     n = n + 1
     
  Next companyname

End Sub


之前(1)

在Excel表1中写入如下宏


Sub CopyData()
  
  
  Dim r1 As Range
  Dim r2 As Range
  Dim w As Workbook
  ThisWorkbook.Activate
  Set r1 = ThisWorkbook.Sheets(1).[a1]
  Set r2 = ThisWorkbook.Sheets(1).[c1]
 
  Set w = Workbooks.Open(ThisWorkbook.Path & "\Test2.xlsx") ‘Test2是另一个Excel表
  w.Sheets(1).[b1] = r1
  w.Sheets(1).[b2] = r2
  w.Save
  w.Close

End Sub




之前(2)

Sub Mycopy()
  
Dim FSO As Object
Dim SourceFolder As Object
Dim FileItem As Object
Dim FileItemToUse As Object
Dim SourceFolderName As String
Dim n As Integer
Dim myrange As String


n = 2

SourceFolderName = "C:\Users\William\Dropbox\数据\EXCEL"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = FSO.GetFolder(SourceFolderName)


For Each FileItem In SourceFolder.Files


'下面就可接着写打开文件读取数据再写入的语句了,如下:
fn = FileItem
Workbooks.Open Filename:=fn
Worksheets(1).Select '假设你读取SHEET1的数据
RANGE_ = Range("L2:L9") '需要数据的区域,自己修改
ThisWorkbook.Activate  '这个是新表的文件名,自己修改下
Worksheets(1).Select '打开第几个文件就选择SHEET几,如果没有可用ADD代码添加


myrange = "E" & n & ":" & "L" & n


Range(myrange) = RANGE_ '写入数据
Workbooks(2).Close
n = n + 1
'End If
Next FileItem


End Sub



底下是网上参考


'这段代码是读取一个文件夹下的所有文件,也可以根据扩展名筛选其它格式的. 
'有了文件名,就是打开文件,获得每个文件的SHEET名字.然后写到你想要的地方 

Sub Macro1() 
Dim myDialog As FileDialog, oFile As Object, strName As String, n As Integer 
Dim FSO As Object, myFolder As Object, myFiles As Object ,Dim fn  as String
Set myDialog = Application.FileDialog(msoFileDialogFolderPicker) 
n = 1 
With myDialog 
If .Show <> -1 Then Exit Sub 
Set FSO = CreateObject("Scripting.FileSystemObject") '这是文件夹选择,点选到你存放文件的那个 
Set myFolder = FSO.GetFolder(.InitialFileName) 
Set myFiles = myFolder.Files 

For Each oFile In myFiles 
strName = UCase(oFile.Name) 
strName = VBA.Right(strName, 3) 
If strName = "xls" Or strName = "XLS" Then '这是扩展名选择 
'下面就可接着写打开文件读取数据再写入的语句了,如下: 
fn = myFolder & "\" & oFile.Name 
Workbooks.Open Filename:=fn 
Worksheets(1).Select '假设你读取SHEET1的数据 
RANGE_ = Range("A2:F50") '需要数据的区域,自己修改 
Windows("外部表格数据自动导入.xls").Activate '这个是新表的文件名,自己修改下 
Worksheets(n).Select '打开第几个文件就选择SHEET几,如果没有可用ADD代码添加 
Range("a2:f5") = RANGE_ '写入数据 
Workbooks(2).Close 
n = n + 1 
End If 
Next 
End With 
End Sub

<think>好的,用户想用VBExcel中复制数据并将日期加一。我需要仔细思考如何实现这个需求。首先,用户可能不太熟悉VBA的具体操作,所以得先确认他们是否了解如何打开VBA编辑器,比如按Alt+F11。如果没有这一步,可能需要提示他们。 接下来,用户的需求是复制数据,并且日期加一。这里可能需要明确数据的结构,比如日期所在的列位置。假设日期在第一列,但实际情况可能不同,所以代码中可能需要用户自行调整列号。此外,数据复制的范围也需要确定,用户可能需要复制整行还是特定列的数据。 然后,处理日期加一。需要考虑单元格的格式是否是日期格式,如果不是,可能需要先转换。外,使用DateAdd函数来增加一天,这里参数是"d",1,应该没问题。但需要确保单元格的值确实是日期,否则会出错,可能需要添加错误处理。 还有,用户可能希望将处理后的数据放在哪里?比如原数据的下面,或者其他工作。示例代码是复制到同一工作的下一行,这可能符合一般需求,但如果有其他需求,可能需要调整目标位置。 外,循环的范围是A到最后一行的A列,这可能假设数据连续无空行,但实际情况中可能有空行,导致循环提前终止。这里可能需要使用更可靠的方法获取最后一行,比如UsedRange或Find方法。 最后,用户可能需要一个完整的宏示例,所以代码的结构应该包括获取最后一行、循环处理每一行、复制数据并调整日期。同时,提醒用户注意事项,如备份数据、启用宏、调整列号等,都是必要的,以避免操作错误或数据丢失。 总结步骤:打开VBA编辑器,插入模块,粘贴代码,调整列号和区域,运行宏。同时考虑异常处理和用户体验,确保代码健壮性,比如处理非日期值的情况,可能需要在代码中添加判断或错误提示。</think>在Excel中通过VBA实现"复制数据并日期加1"的操作,可按以下步骤操作: ```vb Sub CopyDataWithDatePlusOne() Dim ws As Worksheet Dim lastRow As Long Dim i As Long ' 设置要操作的工作(默认使用活动工作) Set ws = ActiveSheet ' 获取最后一行数据(假设日期在A列) lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 循环处理每一行数据 For i = 1 To lastRow ' 复制原始行数据 ws.Rows(i).Copy ' 粘贴到下一行 ws.Rows(i + 1).Insert Shift:=xlDown ' 日期加1天(假设日期在A列) ws.Cells(i + 1, "A").Value = DateAdd("d", 1, ws.Cells(i, "A").Value) Next i ' 清理剪贴板 Application.CutCopyMode = False MsgBox "操作完成!共处理 " & lastRow & " 行数据" End Sub ``` 操作步骤说明: 1. 按 `Alt + F11` 打开VBA编辑器 2. 右键项目 → 插入 → 模块 3. 粘贴上述代码 4. 按 `F5` 运行宏 注意事项: 1. 修改列号:如果日期不在A列,需修改代码中的"A"为实际列字母 2. 数据范围:确保要复制的数据区域连续无空行 3. 日期格式:原始单元格必须是Excel可识别的日期格式 4. 备份数据:建议操作前先备份工作 扩展功能建议: 1. 如果要指定特定工作,可修改 `Set ws = Worksheets("工作名")` 2. 如需处理多列日期,可添加多个处理列的操作 3. 可添加错误处理(如非日期值判断): ```vb If IsDate(ws.Cells(i, "A").Value) Then ' 日期处理代码 Else ws.Cells(i + 1, "A").Value = "无效日期" End If ``` 运行效果:每行数据将被复制到下一行,且日期列的值会自动增加1天,其他列数据保持原样。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值