2013-02-16 78 views
1

我想复制位于文件夹中的excel文件中的特定列并将所有值粘贴到新的Excel表格中。复制多个excel文件中的列数据并将其粘贴到新的excel文件中

Completed-

  1. 我能够循环通过位于一个文件夹中的所有文件。
  2. 我可以复制特定列中的数据。

无法完成:

  1. 无法能够粘贴复制的数据。
  2. 我想只复制不同的值。
  3. 我想复制列直到行在那里。如果有7 行,则复制7列的值。我的复制命令正在复制所有的 直到Excel表的最后一行的值。

我的代码(VBScipt) -

strPath="C:\Test" 

Set objExcel= CreateObject("Excel.Application") 
objExcel.Visible= True 

Set objExcel2= CreateObject("Excel.Application") 
objExcel2.Visible= True 

objExcel2.Workbooks.open("C:\Test\New Folder\4.xlsx") 

Set objFso = CreateObject("Scripting.FileSystemObject") 
Set objFolder = objFso.GetFolder (strPath) 

For Each objFile In objFolder.Files 
If objFso.GetExtensionName(objFile.Path) = "xlsx" Then 
    objExcel.Workbooks.Open(objFile.Path) 

    Set Source=objExcel.Activeworkbook.Sheets(1).Columns("G") 
    Source.Copy 
    Set dest=objExcel2.Activeworkbook.Sheets(1).Columns("A") 
    dest.Paste 
    objExcel.Activeworkbook.save 
    objExcel.Activeworkbook.close 
    objExcel2.Activeworkbook.save 
    objExcel2.Activeworkbook.close 



End If 

Next 

回答

0

这个函数将返回使用范围,工作表上给定列。

Private Function getRange(ByVal ColumnName As String, ByVal Sheet As Worksheet) As Range 
    Set getRange = Sheet.Range(ColumnName & "1", ColumnName & Sheet.Range(ColumnName & Sheet.Columns(ColumnName).Rows.Count).End(xlUp).Row) 
End Function 

如果你使用这个到位的Set Source=objExcel.Activeworkbook.Sheets(1).Columns("G")它应该做你想做的。

如:Set Source = getRange("G", objExcel.Activeworkbook.Sheets(1))

您可能需要改变你的dest到细胞而不是列(套内擅长以为这是错误的大小呻吟声)

Set dest = objExcel.Activeworkbook.Sheets(1).Cells("A1")

刚才看到你将它标记为VBScript,我没有将它作为VBS进行测试,但它可能与VBA一样。

0

对于独特复制.AdvancedFilter()使用的方法,使用@NickSlash中的getRange()定义的单元格。对于来自文件的数据添加,为每个文件创建新工作表,然后对数据进行过滤。我希望这有帮助。
VBScript

Const xlFilterCopy = 2 
Const xlUp = -4162 
Const xlDown = -4121 
strPathSrc = "C:\Test" ' Source files folder 
strMaskSrc = "*.xlsx" ' Source files filter mask 
iSheetSrc = 1 ' Sourse sheet index or name 
iColSrc = 7 ' Source column index, e. g. 7 for "G" 
strPathDst = "C:\Test\New Folder\4.xlsx" ' Destination file 
iColDst = 1 ' Destination column index 

Set objExcel = CreateObject("Excel.Application") 
objExcel.Visible = True 
Set objWorkBookDst = objExcel.Workbooks.Open(strPathDst) 
Set objSheetTmp = objWorkBookDst.Worksheets.Add 
objSheetTmp.Cells(1, iColDst).Value = "TempHeader" 
Set objShellApp = CreateObject("Shell.Application") 
Set objFolder = objShellApp.NameSpace(strPathSrc) 
Set objItems = objFolder.Items() 
objItems.Filter 64 + 128, strMaskSrc 
objExcel.DisplayAlerts = False 
For Each objItem In objItems 
    Set objWorkBookSrc = objExcel.Workbooks.Open(objItem.Path) 
    Set objSheetSrc = objWorkBookSrc.Sheets(iSheetSrc) 
    objSheetSrc.Cells(1, iColSrc).Insert xlDown 
    objSheetSrc.Cells(1, iColSrc).Value = "TempHeader" 
    Set objRangeSrc = GetRange(iColSrc, objSheetSrc) 
    If objRangeSrc.Cells.Count > 1 then 
     nNextRow = GetRange(iColDst, objSheetTmp).Rows.Count + 1 
     objRangeSrc.AdvancedFilter xlFilterCopy, , objSheetTmp.Cells(nNextRow, iColDst), True 
     objSheetTmp.Cells(nNextRow, iColDst).Delete xlUp 
     Set objRangeTmp = GetRange(iColDst, objSheetTmp) 
     Set objSheetDst = objWorkBookDst.Worksheets.Add 
     objRangeTmp.AdvancedFilter xlFilterCopy, , objSheetDst.Cells(1, iColDst), True 
     objSheetTmp.Delete 
     Set objSheetTmp = objSheetDst 
    End If 
    objWorkBookSrc.Close 
Next 
objSheetTmp.Cells(1, iColDst).Delete xlUp 
objExcel.DisplayAlerts = True 

Function GetRange(iColumn, objSheet) 
    With objSheet 
     Set GetRange = .Range(.Cells(1, iColumn), .Cells(.Cells(.Cells.Rows.Count, iColumn).End(xlUp).Row, iColumn)) 
    End With 
End Function 
0

我认为PasteSpecial将帮助粘贴在VB脚本中。最好在PasteSpecial中使用-4163参数来确保只粘贴这些值。下面的代码在Microsoft Visual Studio 2012中为我工作。添加注释只是为了知道程序在代码中的位置。希望这可以帮助。

Imports System.Data.OleDb 
Imports System.IO 
Imports System.Text 

Public Class Form1 
Dim objCSV, objExcel, objSourceWorkbook, objDestWorkbook, objCSVWorkSheet, objXLSWorkSheet, srcCPUXrange, srcCPUYrange, srcMEMYrange, dstCPUXrange, dstCPUYrange, dstMEMYRange 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

'Create and open source CSV object 
    Label1.Text = "Setting Source" 
    objCSV = CreateObject("Excel.Application") 
    objCSV.Visible = True 
    objSourceWorkbook = objCSV.Workbooks.Open("C:\SourceFile.csv") 
    Label1.Text = "Source set" 

    'Create and open destination Excel object 
    Label1.Text = "Setting Destination" 
    objExcel = CreateObject("Excel.Application") 
    objExcel.Visible = True 
    objDestWorkbook = objExcel.Workbooks.Open("C:\DestinationFile.xlsx") 
    Label1.Text = "Destination Set" 

    'Select desired range from CSV file 
    Label1.Text = "Copying Data" 
    objCSVWorkSheet = objSourceWorkbook.Worksheets(1) 
    objCSVWorkSheet.Activate() 
    objSourceWorkbook.Worksheets(1).Range("A1").EntireColumn.Copy() 
    Label1.Text = "Data Copied" 

    'Paste in Excel workbook 
    Label1.Text = "Pasting Data" 
    objXLSWorkSheet = objDestWorkbook.Worksheets(1) 
    objXLSWorkSheet.Activate() 
    objDestWorkbook.Worksheets(1).Range("A2").PasteSpecial(-4163) 
    Label1.Text = "Data Pasted"  


    End Sub 
End Class